Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/190.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 通过attach db更新sqlite表的速度非常慢_Android_Performance_Sqlite - Fatal编程技术网

Android 通过attach db更新sqlite表的速度非常慢

Android 通过attach db更新sqlite表的速度非常慢,android,performance,sqlite,Android,Performance,Sqlite,我在android设备上有一个主sqlite数据库和一个更新sqlite数据库。我喜欢更新数据。 我想用我的android应用程序更新数据库中相同结构的表的数据更新主数据库中的表。 -表示删除更新中存在的main中的所有行。 -将全部从更新插入到主 到目前为止,我的做法是: attach db 'path to update' updatedb delete from mytable where id in ( select id from updatedb.mytable ) inser

我在android设备上有一个主sqlite数据库和一个更新sqlite数据库。我喜欢更新数据。 我想用我的android应用程序更新数据库中相同结构的表的数据更新主数据库中的表。 -表示删除更新中存在的main中的所有行。 -将全部从更新插入到主

到目前为止,我的做法是:

 attach db 'path to update' updatedb
 delete from mytable where id in ( select id from updatedb.mytable )
 insert into mytable select * from mytable 
在我看来,删除和插入是非常缓慢的。
有没有办法更快地执行此操作?

使用批插入来插入大量数据。代码如下:

在databaseHelper中:

在您的活动中:


基本上,您对databaseHelper的执行可能不同。但这就是批量插入大量数据的方法。

主数据库是否位于服务器上?不,两个数据库都是安卓设备文件夹中的文件。为什么不尝试批量插入?。这将大大缩短插入时间。性能如何?您期望的性能如何?删除需要1-2分钟,插入需要1-2分钟。我的应用程序将updatedb从服务器下载到设备,并按照所述进行更新。maindb大小的5%。它比下载更新后的主数据库快一点。我想这应该更快。谢谢。我可以试试。但我有一些担心。我已经尝试从updatedb中逐行获取数据,并将它们插入事务中的maindb中。这比从中选择要慢。我猜这就是databasehelper最后做的事情?是的,您应该期望它会更慢,因为您正在逐行执行多个查询。批量插入,通过单个查询将多条记录插入MySQL。所以你应该期待它更快。另一方面databasehelper只是一个类,它具有用于数据库操作的函数。查询、更新、删除、批插入等。这取决于您的算法。我不会像您在我的问题中看到的那样逐行执行。我只提到,我还逐行测试了这个函数,我希望它的行为与databaseHelper相同。所以我想知道我是否真的得到了更好的性能,因为我的statemant也是一个查询。
public void batchInsert(String sql, ArrayList<String[]> values) {
    SQLiteDatabase db = getWritableDatabase();
    db.beginTransaction();

    SQLiteStatement stmt = db.compileStatement(sql);
    for (int i = 0; i < values.size(); i++) {
        String[] record = values.get(i);

        for (int ii = 0; ii < record.length; ii++) {
            stmt.bindString(ii + 1, record[ii]);
        }

        stmt.execute();
        stmt.clearBindings();
    }

    db.setTransactionSuccessful();
    db.endTransaction();
    db.close();
}
ArrayList<String[]> dataBatch = new ArrayList<String[]>();
        int x = 0;
        for (Data data : dataList) {


            String[] dataArray = { data.getData1(),data.getData2(),data.getData2() };

            dataBatch.add(questionsArray);              

        }

String sql = "INSERT INTO data ";
        sql += "(data1, data2, data3) ";
        sql += "VALUES (?,?,?)";

        DatabaseHelper dbhelper = new DatabaseHelper(context);
        dbhelper.batchInsert(sql, dataBatch);