2014-02-17 150 views
0

我有一个主要的sqlite数据库(大量的数据)和更新sqlite数据库在我的android设备上。 (我喜欢更新的数据)。 我想更新main-db中的表与update-db中的表(相同结构)的数据与我的android应用程序。 - 表示删除更新中存在的main中的所有行。 - 将所有内容从更新插入到main。通过附加数据库更新sqlite表非常慢

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

attach db 'path to update' updatedb 
delete from mytable where id in (select id from updatedb.mytable) 
insert into mytable select * from mytable 

删除和插入速度很慢(在我看来)。 有没有办法更快地做到这一点?

+0

位于服务器上的主数据库? – icaneatclouds

+0

没有这两个数据库的文件在Android设备的文件夹中。 –

+0

为什么不尝试批量插入?它会大大减少插入时间.. – icaneatclouds

回答

0

使用批插入插入大量的数据。下面是代码:

在你databaseHelper:

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); 

基本上你对databaseHelper执行可以是不同的。但多数民众赞成如何批量插入大量的数据。

+0

谢谢。我可以尝试。但我有一些担忧。我已经尝试从rowb中逐行读取数据并将它们插入事务中的maindb中。这比选择从“选择”更慢。我想这是数据库帮助最后做了什么? –

+0

是的,你应该预计它会变慢,因为你在逐行进行(多个查询)。批量插入,通过一个查询插入多个记录到MySQL中。所以你应该期待它更快。 另一方面,databasehelper只是一个具有数据库操作功能的类。查询,更新,删除,批处理插入等,这取决于你的算法。 – icaneatclouds

+0

我不是一行一行的行,你可以在我的问题中看到。我只提到我也(另外)逐行测试了这个行,我预计它会和databaseHelper一样。所以我想知道如果我真的获得了更好的性能,因为我的Statemant也是一个查询。 –