我不相信有任何可行的方法来完成你的名单上的#3或#4。
在其他解决scheme中,列出了两个数据文件包含直接SQL的数据库,另一个包含非SQL格式的数据。
三者都可以正常工作,但后一种从格式化文件中获取数据并自行构buildSQL的build议似乎是最干净的。 如果在以后的date添加了真正的批量更新function,您的数据文件仍然可用,或者至less可以轻松处理成可用的格式。 而且,创build数据文件更直接,也更不容易出错。 最后,拥有“原始”数据将允许导入其他数据存储格式。
在任何情况下,您都应该(如您所述)将插入组包装到事务中,以避免创build每行事务日记。
通常,每次使用db.insert()
,SQLite都会创build一个事务(并在文件系统中生成日志文件),从而减慢速度。
如果使用db.beginTransaction()
和db.endTransaction()
SQLite将在文件系统上只创build一个日志文件,然后同时提交所有的插入,显着加快速度。
这里有一些伪代码: 批量插入到Android上的SQLite数据库
try { db.beginTransaction(); for each record in the list { do_some_processing(); if (line represent a valid entry) { db.insert(SOME_TABLE, null, SOME_VALUE); } some_other_processing(); } db.setTransactionSuccessful(); } catch (SQLException e) {} finally { db.endTransaction(); }
如果由于意外错误或其他原因想要中止事务,只需简单地使用db.endTransaction()
而不事先将事务设置为成功( db.setTransactionSuccessful()
)。
另一个有用的方法是使用db.inTransaction()
(返回true
或false
)来确定您当前是否处于事务中间。
文档在这里
我发现对于批量插入, DatabaseUtils.InsertHelper类(显然很less使用)比使用SQLiteDatabase.insert
快几倍。
另外两个优化也帮助我的应用程序的性能,但它们可能并不适合所有情况:
我有一个更详细的博客文章 。
那么,我的解决scheme,这有点奇怪,但工作正常…我编译大量的数据,并一次性插入(批量插入?)
我使用db.execSQL(Query)
命令,我用下面的语句构build“查询”…
INSERT INTO yourtable SELECT * FROM ( SELECT 'data1','data2'.... UNION SELECT 'data1','data2'.... UNION SELECT 'data1','data2'.... UNION . . . SELECT 'data1','data2'.... )
唯一的问题是查询的build立可能有点混乱。 我希望它有帮助
下面的这个例子将完美的工作
以上就是android开发分享在Android设备上批量插入相关内容,想了解更多android开发(异常处理)及android游戏开发关注(编程笔记)。
String sql = "INSERT INTO " + DatabaseHelper.TABLE_PRODUCT_LIST + " VALUES (?,?,?,?,?,?,?,?,?);"; SQLiteDatabase db = this.getWritableDatabase(); SQLiteStatement statement = db.compileStatement(sql); db.beginTransaction(); for(int idx=0; idx