【问题标题】:What is fastest way to insert rows in sqlite database [duplicate]在sqlite数据库中插入行的最快方法是什么[重复]
【发布时间】:2013-04-11 23:26:56
【问题描述】:

我有大约 7000 行想要插入到设备的(Android Galaxy tab2)sqlite 数据库中。目前我正在解析 JSON 文件并使用“for”循环将行插入数据库。但是将数据解析和插入到 sqlite 数据库需要 120 多秒。还有其他更快的方法吗?

谢谢...

【问题讨论】:

  • 使用数据库事务。
  • 一个查询能插入所有数据吗?还是分批,比如每批 500 个?
  • 另一个想法是预先插入一个sqlite数据,并将数据库文件托管在某个地方,然后下载文件并直接打开它。这是相当戏剧性的变化。
  • @dongshengcn:好主意!但我认为,我必须先创建一个 .sqlite 文件。我可以从 .sql 生成 .sqlite 文件吗?
  • 这里有很多很棒的信息:Improve INSERT-per-second performance of SQLite

标签: android json sqlite


【解决方案1】:

你应该使用statements

database.beginTransaction();
SQLiteStatement stmt = database.compileStatement(sql);

for (int i = 0; i < NUMBER_OF_ROWS; i++) {
    //generate some values

    stmt.bindString(1, randomName);
    stmt.bindString(2, randomDescription);
    stmt.bindDouble(3, randomPrice);
    stmt.bindLong(4, randomNumber);

    long entryID = stmt.executeInsert();
    stmt.clearBindings();
}

database.setTransactionSuccessful();
database.endTransaction();

Reference

这是one more link,其中给出了这两种插入方法之间的比较。 (对于 100 条记录,正常插入需要 1657 毫秒,而带有 endTransaction() 的语句需要 92 毫秒)

【讨论】:

    【解决方案2】:

    我遇到了完全相同的情况。首先,我使用的是 DatabaseUtil.insertHelper,600 个条目花了我 +30 秒的时间。

    我做了更多的挖掘,发现我插入的每一行都被提交了,这非常昂贵。

    为了解决这个问题,我切换到ORMLite,使用 insertAll 方法:

    /**
    * Inserts multiple objects into the database quickly by committing them all at once
    *
    * @param objects The objects to insert
    */
    public void insertAll(final T[] objects) {
        try {
            dao.callBatchTasks(new Callable<Void>() {
    
            @Override
            public Void call() throws Exception {
                for (T object : objects) {
                    dao.create(object);
                }
                return null;    
            }
            });
        } catch (Exception e) {
        AdbLogger.error("Error inserting new " + className + "s in the database");
    }
    }
    

    这里的想法是他们插入对象数组,然后最后只做一个大提交。在此切换之后,插入几乎是瞬间完成的。

    【讨论】:

    • @wangyyif2 :非常感谢,我会试试这个。希望它会工作:-)
    猜你喜欢
    • 2010-10-20
    • 1970-01-01
    • 1970-01-01
    • 2020-02-28
    • 2016-04-20
    • 2022-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多