我正在开发一个Android应用程序,我需要在其中下载JSON
字符串并以特定格式将其保存在SQlite
数据库中(在我看来,我没有其他选择来选择任何其他数据存储)。这是我的表结构:
problem_table(pid INTEGER PRIMARY KEY,
num TEXT, title TEXT,
dacu INTEGER,
verdict_series TEXT)
在发布时,我需要将 4200行输入到数据库表中。我正在使用模拟器,当我启动应用程序时,它完美无缺。但是,在数据库操作开始后,应用程序似乎冻结了一段时间。最终,该应用程序设法插入所有行,但需要花费很多时间。即使在某一点上它也显示出以下外观:
那么我怎样才能减少时间内存的复杂性,或者如何以更优化的方式实现这一目标或避免这种临时故障呢?
N.S。 :由于我的范围不足,我没有在任何真实设备中检查它。我的模拟器使用512 RAM和48堆大小。
答案 0 :(得分:1)
不要在UI线程中进行数据库操作,而是在AsyncTask,Thread,Service等中进行数据库操作,但不要在UI线程中进行。
答案 1 :(得分:1)
我通过给出here
的@Jakobud答案解决了这个问题 <强>答案:强>
通常,每次使用db.insert()
时,SQLite都会创建一个事务(以及文件系统中生成的日志文件)。如果您使用db.beginTransaction()
和db.endTransaction()
,SQLite会同时提交所有插入内容,从而大大加快了速度。
以下是一些伪代码:在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();
}