gpt4 book ai didi

Android SQLite DB 何时关闭

转载 作者:IT老高 更新时间:2023-10-28 13:06:10 25 4
gpt4 key购买 nike

我正在使用 android 上的 SQLite 数据库。我的数据库管理器是一个单例,现在在初始化时打开与数据库的连接。让数据库一直保持打开状态是安全的,这样当有人调用我的类(class)使用数据库时,它已经打开了吗?或者我应该在需要每次访问之前和之后打开和关闭数据库。一直开着有什么坏处吗?

谢谢!

最佳答案

我会一直保持打开状态,并在一些生命周期方法中关闭它,例如 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
}
}

您可能还想在单例中关闭数据库:

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

如果您的应用程序的用户能够非常快速地创建许多数据库交互,您应该使用我上面演示过的东西。但是如果数据库交互很少,我就不用担心了,每次都创建和关闭数据库。

关于Android SQLite DB 何时关闭,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4557154/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com