Android 通过attach db更新sqlite表的速度非常慢
我在android设备上有一个主sqlite数据库和一个更新sqlite数据库。我喜欢更新数据。 我想用我的android应用程序更新数据库中相同结构的表的数据更新主数据库中的表。 -表示删除更新中存在的main中的所有行。 -将全部从更新插入到主 到目前为止,我的做法是: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
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);