【问题标题】:Speeding up database writes加速数据库写入
【发布时间】:2011-09-27 00:06:40
【问题描述】:

我有一个 ListActivity,它使用 CursorAdapter 来显示一些数据。此数据是 Web 服务调用的结果。

我从 Web 服务调用中获取响应,使用 org.json.* 库对其进行解析,然后将结果写入应用程序的 SQLite3 数据库。然后重新查询 ListActivity 的光标,数据显示在列表中。

我的问题是数据库写入速度过慢。我唯一能想到的就是不使用 CursorAdapter 并将这些数据保存在内存中。我希望有人有另一个建议来加快速度。也许是某种批量插入?

应该注意的是,我正在使用 ContentProvider 进行插入。所以我调用 getContentResolver().insert(...)。

以下是通过 LAN 检索 56 行数据并显示它们的测试中的一些时间:

响应时间:178ms

解析json的时间:16ms

向数据库写入 56 行的时间:5714ms

对于这么多数据,我最终希望数据库写入时间低于 1000 毫秒。

【问题讨论】:

  • 我想看看代码,这似乎真的很慢。
  • 您是否使用事务将数据作为块写入数据库?
  • 我已更新 OP 以显示我正在使用 ContentProvider

标签: android listview sqlite android-cursoradapter


【解决方案1】:

我曾经遇到过一些问题,发现首先在您的数据库上调用 beginTransaction() 然后执行您的插入查询。示例代码:

    public void insertClassBatch(ArrayList<Class> batch) throws Exception
{
    this.getWritableDatabase().beginTransaction();
    for (Class c : batch)
    {
        this.insertClassStatement.bindString(1, c.getClassName());
        this.insertClassStatement.bindString(2, c.getClassValue());
        this.insertClassStatement.executeInsert();
    }
    this.getWritableDatabase().setTransactionSuccessful();
    this.getWritableDatabase().endTransaction();
}

这将插入 100 行(在这种情况下为批处理的大小)从大约 30 秒减少到 300 毫秒左右。

【讨论】:

    【解决方案2】:

    您是对写入数据库的每一行进行一次往返,还是可以将它们全部批处理为一次往返?我敢打赌,如果您不进行批处理,网络延迟是罪魁祸首。

    【讨论】:

    • 我从 getContentResolver().insert(...) 更改为 getContentResolver().bulkInsert(...)。这减轻了一些延迟,但不是很多。我已经下降了大约 700 毫秒,但仍然超过 5000 毫秒。
    猜你喜欢
    • 1970-01-01
    • 2010-11-26
    • 2019-07-01
    • 2020-04-27
    • 1970-01-01
    • 2019-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多