如何避免app对大型数据库操作失败

时间:2013-08-02 09:29:26

标签: android android-sqlite

我正在开发一个Android应用程序,我需要在其中下载JSON字符串并以特定格式将其保存在SQlite数据库中(在我看来,我没有其他选择来选择任何其他数据存储)。这是我的表结构:

problem_table(pid INTEGER PRIMARY KEY, 
              num TEXT, title TEXT, 
              dacu INTEGER, 
              verdict_series TEXT)

在发布时,我需要将 4200行输入到数据库表中。我正在使用模拟器,当我启动应用程序时,它完美无缺。但是,在数据库操作开始后,应用程序似乎冻结了一段时间。最终,该应用程序设法插入所有行,但需要花费很多时间。即使在某一点上它也显示出以下外观:

enter image description here

那么我怎样才能减少时间内存的复杂性,或者如何以更优化的方式实现这一目标或避免这种临时故障呢?

N.S。 :由于我的范围不足,我没有在任何真实设备中检查它。我的模拟器使用512 RAM和48堆大小。

2 个答案:

答案 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();
}