2013-04-18 44 views
3

我有大约7000行想要插入到设备的(Android galaxy tab2)sqlite数据库。目前,我正在解析JSON文件并使用“for”循环将行插入到数据库中。但它需要超过120秒才能解析和插入数据到sqlite数据库中。有没有其他更快的方法来做到这一点?什么是在sqlite数据库中插入行的最快方式

谢谢...

+3

使用数据库事务。 –

+1

你可以用一个查询插入所有数据吗?或按批次处理,如每批500个? – dongshengcn

+0

另一个想法是预先插入到sqlite数据,并将数据库文件托管在某处,然后下载该文件并直接打开它。这是相当戏剧性的变化。 – dongshengcn

回答

1

我遇到了完全相同的情况。首先我使用的是DatabaseUtil.insertHelper,它为我带来了+30秒的600个参赛作品。

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

为了解决这个问题,我切换到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"); 
} 
} 

这里的想法是,他们这样做对象的数组的插入,然后在最后只能做一个大的承诺。在这个开关后插入变得几乎是瞬间的。

+0

@ wangyyif2:非常感谢,我会试试这个。希望它能工作:-) – RHL

0

您应该使用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条记录,正常插入需要1657ms,而带有endTransaction()的语句需要92ms)

相关问题