Android onUpgrade SQLiteException:删除表

时间:2016-08-27 10:11:22

标签: android sqlite android-sqlite

我正在使用SQLiteHelper来包装我的数据库。我通过ContentProvider访问它。我使用CursorLoarders来在UI中显示数据。

数据库创建如下:

private static final String SQL_CREATE_DATA= "CREATE TABLE " + DatabaseContract.Data.TABLE_NAME + " (" +
        DatabaseContract.Data.COLUMN_NAME_NAME + " TEXT PRIMARY KEY)";

private static final String SQL_CREATE_USER =
        "CREATE TABLE " + DatabaseContract.User.TABLE_NAME + " (" +
                DatabaseContract.User.COLUMN_NAME_ID + " INTEGER PRIMARY KEY)";

public void onCreate(SQLiteDatabase db) {
    db.execSQL(SQL_CREATE_DATA);
    db.execSQL(SQL_CREATE_USER);
}

onUpgrade和onDowngrade看起来如下:

private static final String SQL_DELETE_DATA =
        "DROP TABLE IF EXISTS " + DatabaseContract.Data.TABLE_NAME;

private static final String SQL_DELETE_USER =
        "DROP TABLE IF EXISTS " + DatabaseContract.User.TABLE_NAME;
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    db.execSQL(SQL_DELETE_DATA);
    db.execSQL(SQL_DELETE_USER);
    onCreate(db);
}

@Override
public void onDowngrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    onUpgrade(db, oldVersion, newVersion);
}

当我更改数据库的版本号时,我收到以下错误:

08-27 11:58:20.559 5811-5868/com.application.myapp E/SQLiteLog: (1) no such table: main.my_data
08-27 11:58:20.565 5811-5869/com.application.myapp D/OpenGLRenderer: Use EGL_SWAP_BEHAVIOR_PRESERVED: true
08-27 11:58:20.592 5811-5868/com.application.myapp E/AndroidRuntime: FATAL EXCEPTION: AsyncTask #1
                                                                  Process: com.application.myapp, PID: 5811
                                                                  java.lang.RuntimeException: An error occurred while executing doInBackground()
                                                                      at android.os.AsyncTask$3.done(AsyncTask.java:309)
                                                                      at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:354)
                                                                      at java.util.concurrent.FutureTask.setException(FutureTask.java:223)
                                                                      at java.util.concurrent.FutureTask.run(FutureTask.java:242)
                                                                      at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)
                                                                      at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)
                                                                      at java.lang.Thread.run(Thread.java:818)
                                                                   Caused by: android.database.sqlite.SQLiteException: no such table: main.my_data (code 1): , while compiling: DROP TABLE IF EXISTS my_user
                                                                      at android.database.sqlite.SQLiteConnection.nativePrepareStatement(Native Method)
                                                                      at android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:887)
                                                                      at android.database.sqlite.SQLiteConnection.prepare(SQLiteConnection.java:498)
                                                                      at android.database.sqlite.SQLiteSession.prepare(SQLiteSession.java:588)
                                                                      at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:58)
                                                                      at android.database.sqlite.SQLiteStatement.<init>(SQLiteStatement.java:31)
                                                                      at android.database.sqlite.SQLiteDatabase.executeSql(SQLiteDatabase.java:1674)
                                                                      at android.database.sqlite.SQLiteDatabase.execSQL(SQLiteDatabase.java:1605)
                                                                      at com.application.myapp.data.DatabaseHelper.onUpgrade(DatabaseHelper.java:92)
                                                                      at android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:256)
                                                                      at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:163)
                                                                      at com.application.myapp.data.MyDataContentProvider.query(MyDataContentProvider.java:139)
                                                                      at android.content.ContentProvider.query(ContentProvider.java:1017)
                                                                      at android.content.ContentProvider$Transport.query(ContentProvider.java:238)
                                                                      at android.content.ContentResolver.query(ContentResolver.java:491)
                                                                      at android.content.CursorLoader.loadInBackground(CursorLoader.java:64)
                                                                      at android.content.CursorLoader.loadInBackground(CursorLoader.java:56)
                                                                      at android.content.AsyncTaskLoader.onLoadInBackground(AsyncTaskLoader.java:312)
                                                                      at android.content.AsyncTaskLoader$LoadTask.doInBackground(AsyncTaskLoader.java:69)
                                                                      at android.content.AsyncTaskLoader$LoadTask.doInBackground(AsyncTaskLoader.java:66)
                                                                      at android.os.AsyncTask$2.call(AsyncTask.java:295)
                                                                      at java.util.concurrent.FutureTask.run(FutureTask.java:237)
                                                                      at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113) 
                                                                      at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588) 
                                                                      at java.lang.Thread.run(Thread.java:818) 

我无法理解这一点,特别是行

Caused by: android.database.sqlite.SQLiteException: no such table: main.my_data (code 1): , while compiling: DROP TABLE IF EXISTS my_user

首先,我只有一个表“my_data”,我不确定“主要”是什么。手段。其次,为什么在尝试删除表my_user时my_data不存在是一个问题?谢谢!

1 个答案:

答案 0 :(得分:0)

如果存在外键约束,则会发生此错误。也许是颠倒了删除的顺序。

相关问题