从CSV文件填充Android数据库?

是否可以将存储在res / raw资源目录中的csv文件用于填充sqlite3数据库中的表?

我的想法是,如果有一种方法可以将整个文件批量导入到表中,那么这将比在文件中的每一行迭代并执行单独的插入语句更清晰,更快……

我发现有一个sqlite import命令允许这样: 如何导入将.sql或.csv文件加载到SQLite中?

…但我在Android应用程序中应用这些语句时遇到了问题。 我的第一个想法是尝试类似下面的东西……但没有运气:

db.execSQL("CREATE TABLE " + TABLE_NAME + "(id INTEGER PRIMARY KEY, name TEXT)"); db.execSQL(".mode csv"); db.execSQL(".import res/raw/MyFile.csv " + TABLE_NAME); 

这可能吗?

我应该尝试不同的方法来填充我的数据库吗?

更新:我将Josef的回复标记为答案(使用交易批量插入),因为它工作正常并根据我的标题直接回答我的问题(感谢Josef)。 但是,我仍然在寻找一种方法,使用import语句在csv文件中将批量插入从csv文件转换为sqlite3表。 如果你知道怎么做,请回复。

谢谢你的回答!

如果要将静态数据打包到应用程序中,我建议在开发时准备数据库(使用您喜欢的任何UI或csv-import命令)并将sqlite文件发送到assets文件夹中。 然后,您可以在首次运行应用程序时将整个sqlite文件复制到设备上。 这些 post将引导您完成这个想法,这很可能是设置数据库的最快方法(文件复制速度)。

如果出于某种原因,您确实需要在运行时插入大量数据,我建议您查看使用事务批量插入的方法以加快速度。

我花了很多时间寻找一个简单的解决方案,并自己想出了一些代码。 对于未来的人来说,就像我一样,你可以使用这个:

 BufferedReader in = new BufferedReader(your csv file source here); String reader = ""; while ((reader = in.readLine()) != null){ String[] RowData = reader.split(","); date = RowData[0]; value = RowData[1]; ContentValues values = new ContentValues(); values.put(CsvProvider.DATE, date); values.put(CsvProvider.VALUE, value); getContentResolver().insert(CsvProvider.CONTENT_URI, values); } in.close(); 

我的CSV文件没有标题,只有2列,但不应该有两列以上。 只需记住指定拆分列的内容,并为每列添加另一个RowData[#] (您必须从0开始)。 在调用in.close()之前,您需要in.close()完成每行的操作。 我正在使用内容提供程序,但您可以使用数据执行任何操作,例如将其附加到String[]或其他任何内容。

当我使用输入流时,您可以将BufferedReader指向您想要的任何位置。 只要BufferedReader可以读取它,它就可以工作。