在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