Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Database 从CSV文件填充Android数据库?_Database_Android_Import_Sqlite - Fatal编程技术网

Database 从CSV文件填充Android数据库?

Database 从CSV文件填充Android数据库?,database,android,import,sqlite,Database,Android,Import,Sqlite,是否可以获取存储在res/raw资源目录中的csv文件,并使用它填充sqlite3数据库中的表 我的想法是,如果有一种方法可以将整个文件批量导入到表中,那么这将比遍历文件中的每一行并执行单个insert语句更干净、更快 我发现有一个sqlite导入命令允许: …但我在Android应用程序中应用这些语句时遇到了问题。我的第一个想法是尝试下面的方法……但没有运气: db.execSQL("CREATE TABLE " + TABLE_NAME + "(id INTEGER PRIMARY KEY,

是否可以获取存储在res/raw资源目录中的csv文件,并使用它填充sqlite3数据库中的表

我的想法是,如果有一种方法可以将整个文件批量导入到表中,那么这将比遍历文件中的每一行并执行单个insert语句更干净、更快

我发现有一个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)。然而,我仍然在寻找一种方法,在Android应用程序中使用import语句将csv文件批量插入到sqlite3表中。如果你知道怎么做,请回复


谢谢你的回答

如果希望将静态数据打包到应用程序中,我建议在开发时准备数据库(使用您喜欢的任何UI或csv导入命令),并将sqlite文件发送到assets文件夹中。然后,当应用程序第一次运行时,您可以简单地将整个sqlite文件复制到设备上。让您了解这个想法,这很可能是设置数据库的最快方法(文件复制速度)


如果出于某种原因,您确实需要在运行时插入大量数据,我建议您寻找加快速度的方法。

我花了很多时间寻找一个简单的解决方案,并亲自编写了这段代码。对于像我一样寻找这个的未来人,你可以使用:

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
文件没有标题,只有两列,但超过两列应该不是问题。请记住指定拆分列的内容,并为每列添加另一个
RowData[#]
(必须从0开始)。在调用.close()中的
之前,您需要确保对每一行执行的操作都已完成。我使用的是一个内容提供者,但是您可以真正地对数据执行任何您想要的操作,比如将其附加到
字符串[]
或其他任何内容


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

感谢回复Josef,我已经尝试将sqlite3.db文件发送到.apk的assets文件夹中(如reigndesign post大纲)。reigndesign解决方案的问题是,当我的数据库版本改变时,不会调用onUpgrade()。事实上,我能让它用新版本替换现有数据库的唯一方法是绕过onUpgrade()并添加一条语句,在调用createDataBase()之前显式删除数据库(这基本上迫使您在每次运行活动时重新创建数据库=(至于使用事务,这可能是一个可行的解决方案。当我实现此解决方案()时,我能够使onUpgrad()保持调用一致性,但考虑到升级和使设计解决方案工作所需的调整(即“\u id”列和“android\u metadata”表),简单的sql导入语句仍然是理想的选择)。虽然这些调整并不难实施,但我担心这会增加Android平台对其数据库创建方式的不必要依赖性。如果这种情况发生变化,我们的解决方案也会发生变化……附带预构建的sqlite3文件不是一种好做法。制造商可以在幕后实施/利用他们想要的任何技术但必须遵守sqlite3接口-因此,您预构建的sqlite3可能无法在某些设备上工作。因此,最好/最安全的做法是始终让您的设备创建数据库,然后批量导入到数据库中。这不仅仅是使用事务。这个分隔符是一个难题。我不知道人们为什么从一开始就使用它。我正在尝试将它从文件中删除并删除它只是停留。有没有办法使用逗号或其他字符,或者是来自某个web服务器的字符?没有。它必须是“|”,因为有700-800k条记录,我使用“,”作为数据..:(…不管怎样,我已经开始工作了…我使用StringTokenizer进行拆分..我甚至还没有接近解决问题..我确实将文件拆分为每个1mb..我使用AsyncTask并能够插入5k记录..缓冲区在那之后就中断了…奇怪的是,仅仅复制和创建db需要很长时间…我甚至还没有开始使用应用程序…:(是的,我有2049条记录要导入,导入时间长达60秒。这太长了。我尝试过事务,但得到了NullPointerException。但我确实将数据导入了我的数据库。导入5k记录需要多长时间?如何删除数据周围的“”??