gpt4 book ai didi

android - SQLite 异常 : Database is locked issue

转载 作者:IT王子 更新时间:2023-10-29 06:19:55 26 4
gpt4 key购买 nike

我的 Android 应用程序中的 SQLite 数据库出现问题。它似乎经常发生,我无法重现,但这是 Android Market 给出的报告。

基本上,我首先有一个闪屏 Activity ,首先检查数据库中是否包含所有需要的数据。如果没有,它将在异步线程中安装数据并关闭数据库连接。

然后并且只有在那时才能启动主要 Activity ,它还会打开并读取/写入数据库。

此代码是从启动画面 Activity 的 onCreate 方法执行的:

dbWord = new WordDBAdapter(this, myUI);
dbWord.open();
if (dbWord.isDataInstalled()) {
dbWord.close();
databaseInstalled = true;
clickToStartView.setText(myUI.PRESS_TO_START);
clickToStartView.startAnimation(myBlinkAnim);
} else {
// If not, try to install in asynchronous thread
progressDialog = new ProgressDialog(this);
progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
progressDialog.setMessage(myUI.INSTALLING_DB);
progressDialog.setCancelable(false);
new InstallDBData().execute("");
}

异步线程的代码是:

private class InstallDBData extends AsyncTask<String, Integer, Integer> {

@Override
protected Integer doInBackground(String... arg0) {
progressDialog.setProgress(0);
dbWord.installData(0, getApplicationContext());
progressDialog.setProgress(20);
dbWord.installData(1, getApplicationContext());
progressDialog.setProgress(40);
dbWord.installData(2, getApplicationContext());
progressDialog.setProgress(60);
dbWord.installData(3, getApplicationContext());
progressDialog.setProgress(80);
dbWord.installData(4, getApplicationContext());
progressDialog.setProgress(100);
return 1;
}

protected void onPreExecute() {
progressDialog.show();
}

protected void onPostExecute(Integer x) {
dbWord.close();
progressDialog.hide();
databaseInstalled = true;
clickToStartView.setText(myUI.PRESS_TO_START);
clickToStartView.startAnimation(myBlinkAnim);
}
}

这些是 WordDBAdapter 类的重要部分,主要 Activity 也使用该类:

public class WordDBAdapter {
private DatabaseHelper mDbHelper;
private SQLiteDatabase mDb;

public WordDBAdapter open() throws android.database.SQLException {
mDbHelper = new DatabaseHelper(mCtx);
mDb = mDbHelper.getWritableDatabase();
return this;
}

public void close() {
mDbHelper.close();
}
...
}

我收到以下异常,它们相似但消息不同:

第一类错误信息:

java.lang.RuntimeException: Unable to start activity 
ComponentInfo{example.flashcards.medical/com.example.flashcards.common.SplashWindow}:
android.database.sqlite.SQLiteException: database is locked: BEGIN EXCLUSIVE;
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1830)
....
Caused by: android.database.sqlite.SQLiteException: database is locked: BEGIN EXCLUSIVE;
at android.database.sqlite.SQLiteDatabase.native_execSQL(Native Method)
at android.database.sqlite.SQLiteDatabase.execSQL(SQLiteDatabase.java:1870)
at android.database.sqlite.SQLiteDatabase.beginTransactionWithListener(SQLiteDatabase.java:602)

第二种错误信息:

java.lang.RuntimeException: Unable to start activity 
ComponentInfo{example.flashcards.medical/com.example.flashcards.common.SplashWindow}:
android.database.sqlite.SQLiteException: database is locked
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1768)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1784)
....
Caused by: android.database.sqlite.SQLiteException: database is locked
at android.database.sqlite.SQLiteDatabase.native_setLocale(Native Method)
at android.database.sqlite.SQLiteDatabase.setLocale(SQLiteDatabase.java:1987)
at android.database.sqlite.SQLiteDatabase.<init>(SQLiteDatabase.java:1855)
at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:820)
at android.database.sqlite.SQLiteDatabase.openOrCreateDatabase(SQLiteDatabase.java:854)

我真的很想不必创建 ContentProvider,因为我相信如果有更简单的解决方案可用,那它就太过分了。此外,只有此应用程序可以访问数据库。

关于如何解决这个问题有什么建议吗?

最佳答案

经过一些努力我做到了(我的应用程序在 android 2.3 之前一直运行完美,但是当我在 HoneyComb 平板电脑上运行它时出现了数据库锁定错误)。
我确实使用了信号量(在关键部分使用锁)。

示例 1

public class DbExp extends SQLiteOpenHelper{
public static String Lock = "dblock";
private static final String DATABASE_NAME = "db.db";
private static final String TABLE_NAME = "table_name";

public void delete(Context mContext){
synchronized(Lock) {
SQLiteDatabase db = getWritableDatabase();
db.delete(TABLE_NAME, null, null);
db.close();
}
}

public void insert(){
synchronized(Lock) {
SQLiteDatabase db = getWritableDatabase();
db.insert(TABLE_NAME, ..., ...);
db.close();
}
}

}

示例 2

public class DB {
public static String Lock = "dblock";
private static final String DATABASE_NAME = "db.db";
private static final String TABLE_NAME = "table_name";

public void delete(Context mContext){
synchronized(Lock) {
SQLiteDatabase db = mContext.openOrCreateDatabase(DATABASE_NAME, Context.MODE_PRIVATE, null);
db.delete(TABLE_NAME, null, null);
db.close();
}
}

public void insert(Context mContext){
synchronized(Lock) {
SQLiteDatabase db = mContext.openOrCreateDatabase(DATABASE_NAME, Context.MODE_PRIVATE, null);
db.insert(TABLE_NAME, ..., ...);
db.close();
}
}


}

希望这对以后的任何人都有帮助:)

关于android - SQLite 异常 : Database is locked issue,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7657223/

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