Android onUpgrade SQLiteException:删除 table 时没有这样的 table
Android onUpgrade SQLiteException: no such table when dropping table
我正在使用 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.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.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
首先,我只有一个table"my_data",我不清楚"main."是什么意思。其次,为什么在尝试删除 table my_user 时 my_data 不存在会是一个问题?谢谢!
如果存在外键约束,可能会出现此错误。也许颠倒删除顺序。
我正在使用 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.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.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
首先,我只有一个table"my_data",我不清楚"main."是什么意思。其次,为什么在尝试删除 table my_user 时 my_data 不存在会是一个问题?谢谢!
如果存在外键约束,可能会出现此错误。也许颠倒删除顺序。