Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/211.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android onUpgrade()由于数据库被锁定而失败,我应该采取什么不同的措施?_Android_Database_Locked - Fatal编程技术网

Android onUpgrade()由于数据库被锁定而失败,我应该采取什么不同的措施?

Android onUpgrade()由于数据库被锁定而失败,我应该采取什么不同的措施?,android,database,locked,Android,Database,Locked,我有一个项目,其中有一组类负责各自的数据库表 每个表管理类都包含CRUD方法,这些方法遵循以下模式:获取连接、运行CRUD操作、关闭连接: public class PersonManager { SQLiteDatabase db; DbAdapter dbAdapter; //This is a subclass of SQLiteOpenHelper public void addPerson(Person person) { Conte

我有一个项目,其中有一组类负责各自的数据库表

每个表管理类都包含CRUD方法,这些方法遵循以下模式:获取连接、运行CRUD操作、关闭连接:

public class PersonManager {

    SQLiteDatabase db;
    DbAdapter dbAdapter; //This is a subclass of SQLiteOpenHelper

    public void addPerson(Person person)
    {
        ContentValues contentValues = new ContentValues();
        contentValues.put("email", person.email);
        contentValues.put("first_name", person.firstName);

        db = dbAdapter.getWritableDatabase();
        db.insert("person", null, contentValues);
        db.close();
    }

    ...other crud/utility methods omitted...
}
现在我正在通过onUpgrade升级数据库,我遇到了数据库锁定问题

确切的错误信息如下所示:

CREATE TABLE android_metadata failed
Failed to setLocale() when constructing, closing the database
android.database.sqlite.SQLiteException: database is locked
onUpgrade的目的似乎是:

1 run db.execSQL() calls or
2 use helper classes that use onUpgrade()'s SQLiteDatabase rather than their own
与db.execSQL语句相比,使用我的表管理类迁移onUpgrade中的数据要容易得多,或者重写所有CRUD方法以获取onUpgrade的SQLiteDatabase

我是否正确设置了数据库访问权限?如果上面的代码遵循正确的模式,我应该如何解决这个问题


谢谢

我没有得到任何答案,所以我问了一个开发人员的问题


据安卓开发者挂断团队称,onUpgrade只用于结构更改,不用于数据迁移/操作。

我没有得到任何答案,所以我在一个开发者挂断上询问

据安卓开发者挂断团队称,onUpgrade只用于结构更改,不用于数据迁移/操作。

这是您的问题:

db = dbAdapter.getWritableDatabase();
在onUpgrade中,必须使用onUpgrade提供的SQLiteDatabase句柄。因此,您的解决方案是重写addPerson函数,以获取另一个参数—SQLiteDatabase句柄:

public void addPerson(Person person, SQLiteDatabase db) {...}
如果您需要从项目中的其他地方调用addPerson,那么保留当前的addPerson函数,让它这样做 db=dbAdapter.getWritableDatabase 调用,并将db传递给双参数版本的addPerson。

这是您的问题:

db = dbAdapter.getWritableDatabase();
在onUpgrade中,必须使用onUpgrade提供的SQLiteDatabase句柄。因此,您的解决方案是重写addPerson函数,以获取另一个参数—SQLiteDatabase句柄:

public void addPerson(Person person, SQLiteDatabase db) {...}
如果您需要从项目中的其他地方调用addPerson,那么保留当前的addPerson函数,让它这样做 db=dbAdapter.getWritableDatabase
调用,并将db传递给双参数版本的addPerson。

我以前遇到过这个问题。只有几个问题可以帮助您缩小范围,您是否正在执行任何线程,以及您的SQLiteOpenHelper在本例中是一个单例吗?应该只有一个访问点。我有一个扩展SQLiteOpenHelper的类。我实例化这个类,而不是返回一个静态实例。我不确定是否可以将上下文引用传递给singleton,以防该引用消失。我还打开和关闭每个CRUD方法上的连接。我不明白的是为什么它在升级时在特定的表上失败-android_元数据应该在升级之前存在。你能从你的助手那里发布你的onUpgrade方法吗?我仍然在巩固正在发生的事情,但是看起来你不能从onUpgrade调用getWritableDatabase,即使getWritableDatabase调用是通过表管理器类间接进行的。这是一个问题,因为大多数文献都指出一个人在使用连接时要打开和关闭连接,而不是保持一些全局连接打开。我以前遇到过这个问题。只有几个问题可以帮助您缩小范围,您是否正在执行任何线程,以及您的SQLiteOpenHelper在本例中是一个单例吗?应该只有一个访问点。我有一个扩展SQLiteOpenHelper的类。我实例化这个类,而不是返回一个静态实例。我不确定是否可以将上下文引用传递给singleton,以防该引用消失。我还打开和关闭每个CRUD方法上的连接。我不明白的是为什么它在升级时在特定的表上失败-android_元数据应该在升级之前存在。你能从你的助手那里发布你的onUpgrade方法吗?我仍然在巩固正在发生的事情,但是看起来你不能从onUpgrade调用getWritableDatabase,即使getWritableDatabase调用是通过表管理器类间接进行的。这是一个问题,因为大多数文献都指出一个人在使用连接时需要打开和关闭连接,而不是保持某些全局连接打开。