gpt4 book ai didi

Android onUpgrade() 失败,因为数据库被锁定,我应该怎么做?

转载 作者:搜寻专家 更新时间:2023-10-30 22:02:27 25 4
gpt4 key购买 nike

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

每个表管理类都包含 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

使用我的表管理类在 onUpgrade() 中迁移数据比使用 db.execSQL() 语句或重写我所有的 CRUD 方法以采用 onUpgrade() 的 SQLiteDatabase 要容易得多。

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

谢谢!

最佳答案

这是你的问题:

db = dbAdapter.getWritableDatabase();

当您在 onUpgrade() 中时,您必须使用 onUpgrade() 为您提供的 SQLiteDatabase 句柄。所以你的解决方案是重写你的 addPerson 函数以接受一个参数——一个 SQLiteDatabase 句柄:

public void addPerson(Person person, SQLiteDatabase db) {...}

如果您需要从项目的其他地方调用 addPerson() ,那么请保留当前的 ​​addPerson(Person person) 函数,让它执行此操作 db = dbAdapter.getWritableDatabase()调用,并将 db 传递给 addPerson() 的双参数版本。

关于Android onUpgrade() 失败,因为数据库被锁定,我应该怎么做?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9526316/

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