如何在Android设备上批量插入?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (47)

我想在我的下一次升级时将大约700条记录批量插入到Android数据库中。什么是最有效的方式来做到这一点?从各个岗位,我知道如果我使用Insert语句,我应该把它们包装在一个事务中。请注意,这只会在每个设备上执行一次:

一些想法:

  1. 将一堆SQL语句放在一个文件中,一次读一行,然后执行SQL。
  2. 把数据放在一个CSV文件中,或者JSON,YAML或者XML,或者其他什么。一次读一行,然后执行db.insert()
  3. 找出如何进行导入并完成整个文件的单个导入。
  4. 制作一个包含所有记录的sqlite数据库,将其复制到Android设备上,并以某种方式合并这两个数据库。
  5. 把所有的SQL语句放在res / values的单个文件中作为一个大字符串。然后一次读一行,然后执行SQL。
提问于
用户回答回答于

我不相信有任何可行的方法来完成你的名单上的#3或#4。

在其他解决方案中,列出了其中两个数据文件包含直接SQL,另一个包含非SQL格式的数据。

三者都可以正常工作,但后一种从格式化文件中获取数据并自己构建SQL的建议似乎是最干净的。如果在以后的日期添加真正的批量更新功能,你的数据文件仍然可用,或者至少可以轻松处理成可用的格式。另外,创建数据文件更直接,而且不易出错。最后,拥有“原始”数据将允许导入其他数据存储格式。

用户回答回答于

通常,每次db.insert()使用SQLite都会创建一个事务(并在文件系统中生成日志文件),这会降低速度。

如果你使用db.beginTransaction()并且db.endTransaction()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())。

扫码关注云+社区

领取腾讯云代金券