将CSV文件导入Android应用程序的Sqlite数据库

3
我有一个从Sqlite浏览器导出的csv文件,其中包含一张表格,我已将其放置在sdcard中。我希望能够以编程方式将其导入到我的Android应用程序数据库中。我尝试了很多次,但未能成功实现,需要帮助。我在Android中创建了相同的表格,但我不想通过逐行读取csv文件的内容并每次执行插入查询来完成这个任务...因此,主要问题是直接导入。

嗨,我已经浏览了这段代码。

public static void InsertCSVFile(String FilePath, String filename,
        String TableName) {
    try {
        FileReader fr = new FileReader(new File("mnt/sdcard/",
                "olinecsv.csv"));
        BufferedReader br = new BufferedReader(fr);
        String data = "";
        String tableName = "Test";
        String columns = "ID,NAME,TYPE";
        String InsertString1 = "INSERT INTO " + tableName + " (" + columns
                + ") values(";
        String InsertString2 = ");";

        mainDatabase.beginTransaction();
        while ((data = br.readLine()) != null) {
            StringBuilder sb = new StringBuilder(InsertString1);
            String[] sarray = data.split(",");
            sb.append(sarray[0] + ",");
            sb.append( sarray[1] + ",");
            sb.append(sarray[2]);
            sb.append(InsertString2);
            if(sarray[0].contains("ID"))
                continue;
            mainDatabase.rawQuery(sb.toString(), null);
            //mainDatabase.execSQL(sb.toString());
        }

我已将文件存放在SD卡中,正在获取查询StringBuilder,但出现错误或异常,表格中没有任何输入。但是,在调试相同查询时,我在Sqlite程序中运行了它,它可以正常工作。 看来我犯了一个错误,进一步的建议将不胜感激。


请发布您的logcat以查看异常。 - Simon
@simon 我还没有收到任何异常,但是没有任何东西被输入。 - Vipin Sahu
好的,我已经找到问题了,是因为我使用了不合理的mainDatabase.beginTransaction()代码行。删除这一行解决了我的问题,感谢大家的贡献。 - Vipin Sahu
你是否有匹配的mainDatabase.endTransaction()?使用begin...end事务是一个好的实践,因为它保证要么所有更改都被写入,要么没有任何更改被写入。 - Simon
我在编写代码时错写成了mainDatabase.beginTransaction()而漏掉了mainDatabase.endTransaction(),导致我的更改没有反映出来。 - Vipin Sahu
请查看我的回答... - bhumika rijiya
2个回答

2

对于您来说,没有内置的CSV导入功能可用:您需要逐行读取CSV文件并插入它。有许多CSV解析程序(我个人使用OpenCSV),可以很好地从磁盘上的CSV文件中读取并提取行。如果您在编写有效的插入函数时遇到问题,请提出问题并包含您的代码。


好的,那么在SQLite中,如果我们需要逐个插入,import是什么意思呢?还有一件事,是否有其他方便的方法来实现这一点? - Vipin Sahu
导入是将数据从一种存储格式(在本例中为CSV)提取并插入到另一种格式(在本例中为自定义SQLite格式)的过程。在Android平台上,由于没有内置的方法来描述如何将CSV文件中的行转换为自定义SQLite格式,因此方法需要由您手动实现。 - Femi
实际上,在sqlite中有一个命令可以导入CSV文件,但我不知道它是否存在于任何库中。 sqlite> create table test (id integer, datatype_id integer, level integer, meaning text); sqlite> .separator "," sqlite> .import no_yes.csv test 链接 - kubo

1

尝试这段代码,

在res>raw文件夹中创建一个文件夹,并将yourfile.csv文件放入该文件夹中。

添加此方法以将数据插入sqlite中,

  public void insertCSVData(Activity activity, InputStream is, String tableName) {

    String colunmNames = null, str1 = null;
    open();

    try {

        BufferedReader buffer = new BufferedReader(new InputStreamReader(is));
        String line = "";

        String str2 = ");";

        db.beginTransaction();

        int i = 0;
        while ((line = buffer.readLine()) != null) {
            i++;
            if (i == 1) {
                colunmNames = line;
                str1 = "INSERT INTO " + tableName + " (" + colunmNames + ") values (";
            } else {

                StringBuilder sb = new StringBuilder(str1);
                String[] str = line.split(",");

                for (int h = 0; h < str.length; h++) {

                    if (h == str.length - 1) {
                        sb.append("'" + str[h] + "'");
                    } else {
                        sb.append("'" + str[h] + "',");
                    }
                }

                sb.append(str2);
                db.execSQL(sb.toString());
            }
        }

        db.setTransactionSuccessful();
        db.endTransaction();

    } catch (Exception e) {

        close();

        e.printStackTrace();
    }

    close();
}
   public void open() {
    db = this.getWritableDatabase();
}

public void close() {
    db.close();
}

请调用此方法:
insertCSVData(Activity, getResources().openRawResource(R.raw.yourfile.csv), tableName);

我希望这段代码能解决您的问题...


你能告诉我在Open()中你在做什么吗? - Sathish
@Sathish 在 open 和 close 中,我正在打开和关闭数据库。 - bhumika rijiya

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接