Android SQLite数据库什么时候closures

我正在使用Android上的SQLite数据库。 我的数据库pipe理器是一个单身人士,现在打开一个连接到数据库的初始化。 将数据库全部打开是安全的,这样当有人打电话给我的class级处理数据库时,它已经打开了? 还是应该在每次访问需要之前和之后打开和closures数据库。 整个开放时间是否有害?

谢谢!

我会保持它打开整个时间,并closures它在一些生命周期的方法,如onStoponDestroy 。 通过这种方式,您可以在每次使用之前通过在单个SQLiteDatabase对象上调用isDbLockedByCurrentThreadisDbLockedByOtherThreads来轻松检查数据库是否已被使用。 这将防止对数据库进行多重操作,并将您的应用程序从可能的崩溃中保存下来

所以在你的单身人士,你可能有这样的方法来获得你的单个SQLiteOpenHelper对象:

 private SQLiteDatabase db; private MyDBOpenHelper mySingletonHelperField; public MyDBOpenHelper getDbHelper() { db = mySingletonHelperField.getDatabase();//returns the already created database object in my MyDBOpenHelper class(which extends `SQLiteOpenHelper`) while(db.isDbLockedByCurrentThread() || db.isDbLockedByOtherThreads()) { //db is locked, keep looping } return mySingletonHelperField; } 

所以每当你想使用你的开放的帮助对象,调用这个getter方法(确保它是线程)

你的单身人士中的另一种方法可能是(在您尝试调用上面的getter之前称为“每次”):

 public void setDbHelper(MyDBOpenHelper mySingletonHelperField) { if(null == this.mySingletonHelperField) { this.mySingletonHelperField = mySingletonHelperField; this.mySingletonHelperField.setDb(this.mySingletonHelperField.getWritableDatabase());//creates and sets the database object in the MyDBOpenHelper class } } 

你可能想closures单例中的数据库:

 public void finalize() throws Throwable { if(null != mySingletonHelperField) mySingletonHelperField.close(); if(null != db) db.close(); super.finalize(); } 

如果您的应用程序的用户能够非常快地创build多个数据库交互,则应该使用上面演示的内容。 但是如果数据库交互很less,我不用担心,每次创build和closures数据库。

到目前为止,不需要检查数据库是否被另一个线程locking。 当你在每个线程中使用单例SQLiteOpenHelper时,你都是安全的。 来自isDbLockedByCurrentThread文档:

这个方法的名字来自于有一个到数据库的活动连接,意味着这个线程在数据库上保存了一个实际的锁。 现在,不再有真正的“数据库锁”,尽pipe线程可能会阻塞,如果他们无法获得数据库连接来执行特定的操作。

isDbLockedByOtherThreads自API Level 16以来已弃用。

关于问题:

我的数据库pipe理器是一个单身人士,现在打开一个连接到数据库的初始化。

我们应该划分“开放数据库”,“开放连接”。 SQLiteOpenHelper.getWritableDatabase()提供一个打开的数据库。 但是我们不必像内部完成一样控制连接。

将数据库全部打开是安全的,这样当有人打电话给我的class级处理数据库时,它已经打开了?

是的。 如果交易正确closures,连接不会挂起。 请注意,如果GC完成它,您的数据库也将自动closures。

还是应该在每次访问需要之前和之后打开和closures数据库。

closuresSQLiteDatabase实例除了closures连接之外没有什么大的作用,但是如果现在有一些连接的话,这是一个开发者的错误。 另外,在SQLiteDatabase.close()之后,SQLiteOpenHelper.getWritableDatabase()将返回一个新的实例。

整个开放时间是否有害?

不,没有。 还要注意的是,在与Activity.onStop()无关的时刻和线程closures数据库可能会closures活动连接,并使数据处于不一致的状态。

你也可以使用ContentProvider。 它会为你做这个东西。

创build您自己的应用程序上下文,然后从那里打开和closures数据库。 该对象还有一个可用于closures连接的OnTerminate()方法。 我还没有尝试过,但似乎是一个更好的办法。

@binnyb:我不喜欢使用finalize()来closures连接。 可能会工作,但从我理解的Java finalize()方法中编写代码是一个坏主意。