【问题标题】:Android, SQLite: Inserting data in while clause is very slowAndroid,SQLite:在while子句中插入数据很慢
【发布时间】:2013-05-12 14:50:36
【问题描述】:

问题底部的解决方案

我有一个 FTP 服务器,上面有 3'000 多张图片,我将图片名称保存到 ArrayList。在此之后,我想将它们从数组列表保存到数据库,这需要非常非常非常非常多的时间!见:

        FTPFile[] files = ftpClient.listFiles();

        for (FTPFile file : files) {
            imageNames.add(file.getName());
        }

我得到所有这些文件的列表并将它们保存到 ArrayList imageNames 中。 这非常快,不会超过 1 - 最多 2 秒。

现在我想把这个数组写回我的 sqlite 数据库。 当我这样做时,需要很长时间才能完成!我等了2多分钟……

        int i = imageNames.size() - 1;
        int q = 0;

        while(i >= 0){
                String insert_arraylist = "INSERT INTO ARRAYLIST (STRING) VALUES ('"+imageNames.get(q)+"')";
                db.execSQL(insert_arraylist);
            i--;
            q++;
        }

那么我怎样才能加快这种插入速度??

提前致谢!

解决方案:(从超过 2 分钟到不到 3 秒;))

        FTPFile[] files = ftpClient.listFiles();
        insert_arraylist = "";
        ContentValues con = new ContentValues();

        for (FTPFile file : files) {
            imageUrls.add("http://192.168.99.104/GetThePicture/thumbs/"+file.getName());
        }

        int i = imageUrls.size() - 1;
        int q = 0;

        db.beginTransaction();

        try{
            while(i >= 0){
                String insert_arraylist = "INSERT INTO ARRAYLIST (STRING) VALUES ('"+imageUrls.get(q)+"')";
                db.execSQL(insert_arraylist);
                i--;
                q++;
            }
            db.setTransactionSuccessful();
        } catch(Exception e){

        } finally {
            db.endTransaction();
        }

【问题讨论】:

  • execSQL 不适用于 SELECT/INSERT/UPDATE/DELETE

标签: android sqlite arraylist insert ftp


【解决方案1】:

问题在于,对于每个 execSQL,您都在创建一个新事务并提交。要解决此问题,请创建一个事务并立即提交所有内容。或者您可以创建组(例如,每 100 行提交一次)

db.beginTransaction();
try {
    while(i >= 0){
        String insert_arraylist = "INSERT INTO ARRAYLIST (STRING) VALUES ('"+imageNames.get(q)+"')";
        db.execSQL(insert_arraylist);
        i--;
        q++;
    }
    db.setTransactionSuccessful();
} catch {
    // Handle exceptions.
} finally {
    db.endTransaction();
}

【讨论】:

    【解决方案2】:

    我建议按照以下帖子中的说明进行批量插入:

    Android SQLite database: slow insertion

    它为您提供了多个示例。就我个人而言,我注意到 SQLite 插入非常慢,并且对于 3000 次插入,它通常需要很长时间,除非您进行批量插入。

    所以想法与发布的其他海报相同,即在一次交易中完成所有操作:

    db.beginTransaction();
      for (entry : listOfEntries) {
      db.insert(entry);
    }
    db.setTransactionSuccessful();
    db.endTransaction();
    

    【讨论】:

    • 嗯听起来不错。但是如何将 ArrayList 转换为 ContentValues? db.insert(String, String, ContentValues)...?
    • 就是这样!我将在顶部发布工作且非常快速的代码。 3072 个条目现在只需不到 3 秒 ;)
    • 非常好,感谢您接受这个作为您的回答。我很高兴你找到了你的解决方案,我明白这感觉有多好 :)
    猜你喜欢
    • 2017-01-07
    • 2015-01-05
    • 2014-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多