我想在下一次升级时向Android数据库中批量插入大约700条记录。做这件事最有效的方法是什么?从不同的帖子中,我知道如果我使用Insert
语句,我应该将它们包装在一个事务中。还有一个关于使用你自己的数据库的post,但我需要这些数据进入我的应用程序的标准安卓数据库。请注意,每台设备只能执行一次此操作。
一些想法:
作为一个大字符串。然后一次读取一行并执行SQL。
最好的方法是什么?有没有其他加载数据的方法?3和4有可能吗?
发布于 2010-10-05 13:51:40
我不认为有任何可行的方法来完成你清单中的第三或第四。
在其他解决方案中,您列出了两个数据文件包含直接SQL的解决方案,另一个包含非SQL格式的数据。
这三种方法都可以很好地工作,但后一种建议从格式化文件中获取数据并自己构建SQL似乎是最干净的。如果以后添加了批量更新功能,那么您的数据文件仍然可以使用,或者至少可以很容易地处理为可用的形式。此外,数据文件的创建更简单,更不容易出错。最后,拥有“原始”数据将允许导入到其他数据存储格式。
在任何情况下,您都应该(正如您所提到的)将插入组包装到事务中,以避免创建每行事务日志。
发布于 2011-09-22 01:36:22
通常,每次使用db.insert()
时,SQLite都会创建一个事务(以及文件系统中的结果日志文件),这会降低速度。
如果使用db.beginTransaction()
和db.endTransaction()
,SQLite只会在文件系统上创建一个日志文件,然后同时提交所有插入操作,从而大大提高速度。
下面是Batch insert to SQLite database on Android中的一些伪代码:
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.setTransactionSuccessful()
)的情况下执行db.endTransaction()
。
另一种有用的方法是使用db.inTransaction()
(返回true
或false
)来确定您当前是否正在处理事务。
发布于 2010-12-17 02:18:09
我发现对于批量插入,(显然很少使用的) DatabaseUtils.InsertHelper类比使用SQLiteDatabase.insert
快几倍。
另外两个优化也对我的应用程序的性能有所帮助,尽管它们可能并不适用于所有情况:
暂时关闭数据库的内部锁定对performance.也有帮助:
bind
)。我有一个包含更多细节的blog post。
https://stackoverflow.com/questions/3860008
复制相似问题