在Android中,这是设置SQLiteDatabase助手的正确方法吗?
例外情况:在Android中,这是设置SQLiteDatabase助手的正确方法吗?,android,database,sqlite,Android,Database,Sqlite,例外情况: CREATE TABLE android_metadata failed Failed to setLocale() when constructing, closing the database android.database.sqlite.SQLiteException: database is locked 我的应用程序工作正常,没有数据库问题,除非调用onUpgrade() 当自动调用onUpgrade时,它会尝试使用下面的CarManager类来执行升级所需的数据操作。
CREATE TABLE android_metadata failed
Failed to setLocale() when constructing, closing the database
android.database.sqlite.SQLiteException: database is locked
我的应用程序工作正常,没有数据库问题,除非调用onUpgrade()
当自动调用onUpgrade时,它会尝试使用下面的CarManager类来执行升级所需的数据操作。此操作失败,因为数据库已锁定
因为这似乎应该是一件正常的事情,所以我必须正确构造以下代码(后面有两个类,一个助手和一个表管理器):
有什么想法吗?
人们对表管理器(例如dao)的设置是否与此不同
编辑:我和谷歌团队@android开发者谈了几个小时,他们说onUpgrade3从来没有打算做任何类似结构改变(alters)的事情。因此,是的,现在似乎有一些黑客必须在许多情况下使用。我通过扩展
应用程序
类使用以下模型。我维护我的db helper的一个静态实例,所有其他应用程序组件都使用它
public class MyApp extends Application {
protected static MyAppHelper appHelper = null;
protected static MyDbHelper dbHelper = null;
@Override
protected void onCreate() {
super.onCreate();
...
appHelper = new MyAppHelper(this);
dbHelper = MyAppHelper.createDbHelper();
dbHelper.getReadableDatabase(); // Trigger creation or upgrading of the database
...
}
}
从那时起,任何需要使用db助手的类都只需执行以下操作
if (MyApp.dbHelper == null)
MyApp.appHelper.createDbHelper(...);
// Code here to use MyApp.dbHelper
出于好奇,OrmLite()是设置DAO类的一种很好的方法。创建表android_元数据在构建时未能设置Locale(),关闭数据库android.database.sqlite.SQLiteException:数据库被锁定DbHelper的原始实例在何处创建?在
CarManager
构造函数中(如上所示)还是在其他地方?是否确实没有创建多个DbHelper
实例?我创建多个实例,但一次只创建一个。我可以只有一个实例,但如果是这样,关闭和打开是如何处理的?我假设您需要传递一个上下文引用MyAppHelper.createDbHelper(…),我认为该引用可能会过时(例如,如果您从活动类传递“this”)。你觉得怎么样?我刚查过密码。实际上,我将应用程序上下文传递到保存引用的“app helper”中。然后,“app helper”将其作为createDbHelper()
方法的一部分传递给“db helper”。维护对应用程序上下文的引用的区别在于,只能有一个应用程序实例,并且上下文在其生命周期内有效。活动可以一次又一次地创建/销毁,而且任何给定的活动类都可能有多个实例,因此POJO保存活动上下文永远都不好。
if (MyApp.dbHelper == null)
MyApp.appHelper.createDbHelper(...);
// Code here to use MyApp.dbHelper