打开db时,Android sqlite数据库setlocale太慢了。怎么解决?

时间:2011-03-08 09:45:38

标签: android sqlite

我使用以下方法读取/写入db:

  1. 数据库位于/data/data/{packagename}/databases/Database.db 由于数据库大于3Mb,我们找到了一个特定的解决方案,将其复制到那里,并用适当的数据填充。

  2. 以下是实现获取打开的数据库的任务的类。这个班是一个单身人士。

    public class DatabaseHelper extends SQLiteOpenHelper
    
  3. 打开数据库我们使用以下方法:

    SQLiteDatabase db = DatabaseHelper.getInsance().getReadableDatabase();
    
  4. 然后使用rawquery查询db:

    Cursor cursor = db.rawQuery(query, null);
    
  5. 那么最符合我们目的的是,我们将数据库数据提取到不同结果集实例的内存中:

    while (cursor.moveToNext()) {
        ResultSet rs = new ResultSet();
        rs.setThis(cursor.getInt(0));
        rs.setThat(cursor.getString(1));
        // and so on.. this is just an example
        ResultList.add(rs);
    }
    
  6. 最后:

    cursor.close();
    db.close();
    
  7. 如果有必要,请提及交易,但使用交易不会导致加速。

  8. 对于每个查询,上面的模式都是(完全)遵循的。但不幸的是,这个解决方案似乎很慢。因此,进行了一些方法分析,并且清楚地表明,sqlite setlocale总是在getReadableDatabase()运行(创建!不要忘记),并且该方法占用大部分时间。平均只有40%..

    请指教如何解决这个问题!或者请提供其他模式以满足我们的需求!

    提前致谢

3 个答案:

答案 0 :(得分:0)

Szia!

最有趣的是,native_setLocale(导致DB缓慢打开)显然甚至无法工作:http://code.google.com/p/android/issues/detail?id=2625

答案 1 :(得分:0)

6)最后:

cursor.close();
db.close();

在查询之间不能保持数据库打开?

答案 2 :(得分:0)

与此处提出的问题(SQLCipher for Android getReadableDatabase() Overherad)一样,您看到的性能问题可能是由于SQLCipher密钥派生所致。由于密钥派生,打开数据库的性能有意降低。您应该缓存数据库连接,以便可以多次使用它,而无需重复打开和键入数据库。如果可以,在启动期间打开数据库一次是首选的操作过程。对同一数据库句柄的后续访问不会触发密钥派生,因此性能会更快。