最小化SQLite close()调用

时间:2014-09-22 02:58:01

标签: android android-sqlite sqlcipher

简介

我在我的Android项目中使用库SQLCipher,这允许我从我的应用程序中访问预加密的SQLite v3数据库。

唯一的缺点是,在创建新的数据库连接(getReadableDatabase()getWritableDatabase()调用)时,当前存在很多开销,因为每次数据库都会发生所有加密打开。这些调用目前显着减慢了我的应用程序。

我想要实现的目标

所以,我正在寻求通过在我的所有活动中保持与数据库的单个活动连接来最小化进行这些调用所需的次数。

我打算如何实现这个

  1. 在应用程序启动时实例化与数据库的连接
  2. 对于每项活动,请保留一个特殊标志
  3. 每当活动切换到另一个活动(通过意图)时,此布尔标志设置为 true
  4. 每个活动的onDestroy()方法都会关闭应用程序与数据库的连接,除非该活动的标志为 true (即,应用程序不是&n被摧毁,我们只是转向另一种活动)
  5. 一个例子

    public class ExampleActivity extends Activity {
    
        // Used to determine whether we are destroying the activity due to an intent.
        private boolean isIntent = false;
    
        public void someMethod() {
            isIntent = true;
            Intent intent = new Intent(this, SomeOtherActivity.class);
            startActivity(intent);
            finish();
        }
    
        @Override
        public void onDestroy() {
            super.onDestroy();
            if (!isIntent)
                // We haven't started another activity, so we should close the open
                // database connection.
                DatabaseHelper.close();
        }
    
    }
    

    问题

    1. 这个方法有什么问题我还没考虑过吗?我之前没见过它,所以我很谨慎。

    2. 有没有更好的方法来达到预期的效果?

1 个答案:

答案 0 :(得分:1)

您可以围绕基于SQLCipher的SQLiteOpenHelper的子类创建单例类。在SQLiteOpenHelper内,对getWritableDatabase()的调用在内部缓存返回的数据库对象,因此每次调用该方法时都不会发生密钥派生。