SQLiteException: 没有这样的列 Android
SQLiteException: no such column Android
我正在尝试为我的 Android 应用程序创建一个 SQLite 数据库。
一切正常,直到我进入 ContentProvider 中的查询功能的 JUnit 测试。
我很深入地阅读了论坛,看到有些人有以下错误
Create table 有拼写错误 - 这是我的 table 创建声明
创建 TABLE 电影(
_id 整数主键,
标题文本不为空,
默认文本 'NO OVERVIEW'、
poster_path 文本默认值 'NO POSTER'、
release_date 文本默认 'NO DATE AVAILABLE',
vote_average 文本默认 'NO VOTES YET',
sort_type 整数不为空,
最喜欢的整数默认值 0
);
添加列后未更新Database_Version常量。
我尝试更新 Database_Version 常量,还尝试更改数据库的名称,因此它是从头开始创建的。
从我的 Android 设备上删除了我所有的旧应用程序。
阅读this post。
我确实检查了它所说的所有细微差别。
但是,我的异常仍然被抛出
android.database.sqlite.SQLiteException: no such column: MovieContract.Movie.favorite (code 1): , while compiling: SELECT * FROM movie WHERE MovieContract.Movie.favorite = ? ORDER BY MovieContract.Movie.title
我的 testCase 方法抛出错误。
在 Cursor movieCursor 行上抛出错误...
public void testBasicMovieQuery(){
MovieDBHelper dbHelper = new MovieDBHelper(mContext);
SQLiteDatabase db = dbHelper.getWritableDatabase();
ContentValues movieValues = TestUtilities.createMovieValues();
long recordNum = db.insert(MovieContract.Movie.TABLE_NAME, null,movieValues);
assertTrue("Unable to Insert WeatherEntry into the Database", recordNum != -1);
db.close();
String selection = "MovieContract.Movie.FAVORITE = ?";
String [] selectionArgs = new String [] {"'1'"};
String sortOrder = "MovieContract.Movie.TITLE";
Cursor movieCursor = mContext.getContentResolver().query(
MovieContract.Movie.CONTENT_URI,
null,
selection,
selectionArgs,
sortOrder
);
TestUtilities.validateCursor("testBasicWeatherQuery", movieCursor, movieValues);
movieCursor.close();
}
这是我在 ContentProvider 中的查询方法;所以当我定义 'selection' 时,它会抛出 'no such column' 但如果我把所有 null,除了 URI,它会抛出默认的 Unknown Uri 异常,即使 Uri 实际上存在于 UriMatcher 中。
@Override
public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
Cursor cursor;
Log.v("QUERY MovieProvider", uri.toString());
switch (uriMathcher.match(uri)){
case MOVIE_WITH_ID:{
Log.v("MovieProvider QUERY", "MOVIE WITH ID");
//cursor = getMovieWithId(uri);
cursor = dbHelper.getReadableDatabase().query(MovieContract.Movie.TABLE_NAME ,null, "MovieContract.Movie._ID =", selectionArgs,null,null,sortOrder);
}
break;
case MOVIE:{
Log.v("MovieProvider QUERY", "MOVIE");
//Log.v("MovieProvider QUERY", selection);
//Log.v("MovieProvider QUERY", selectionArgs[0]);
cursor = dbHelper.getReadableDatabase().query(MovieContract.Movie.TABLE_NAME, null,selection, selectionArgs, null, null, sortOrder);
}
default: {
throw new UnsupportedOperationException("Unknown uri: " + uri);
}
}
cursor.setNotificationUri(getContext().getContentResolver(), uri);
return cursor;
}
如果需要任何其他信息,请告诉我。
我的 Github 存储库是 here
请更改这些行:
String selection = "MovieContract.Movie.FAVORITE = ?";
String [] selectionArgs = new String [] {"'1'"};
String sortOrder = "MovieContract.Movie.TITLE";
至
String selection = MovieContract.Movie.FAVORITE + " = ?";
String [] selectionArgs = new String [] {"1"};
String sortOrder = MovieContract.Movie.TITLE;
或到(同样有效)
String selection = "favorite = ?";
String [] selectionArgs = new String [] {"1"};
String sortOrder = "title";
我正在尝试为我的 Android 应用程序创建一个 SQLite 数据库。
一切正常,直到我进入 ContentProvider 中的查询功能的 JUnit 测试。
我很深入地阅读了论坛,看到有些人有以下错误
Create table 有拼写错误 - 这是我的 table 创建声明
创建 TABLE 电影(
_id 整数主键,
标题文本不为空,
默认文本 'NO OVERVIEW'、
poster_path 文本默认值 'NO POSTER'、
release_date 文本默认 'NO DATE AVAILABLE',
vote_average 文本默认 'NO VOTES YET',
sort_type 整数不为空,
最喜欢的整数默认值 0
);添加列后未更新Database_Version常量。
我尝试更新 Database_Version 常量,还尝试更改数据库的名称,因此它是从头开始创建的。从我的 Android 设备上删除了我所有的旧应用程序。
阅读this post。
我确实检查了它所说的所有细微差别。
但是,我的异常仍然被抛出
android.database.sqlite.SQLiteException: no such column: MovieContract.Movie.favorite (code 1): , while compiling: SELECT * FROM movie WHERE MovieContract.Movie.favorite = ? ORDER BY MovieContract.Movie.title
我的 testCase 方法抛出错误。
在 Cursor movieCursor 行上抛出错误...
public void testBasicMovieQuery(){
MovieDBHelper dbHelper = new MovieDBHelper(mContext);
SQLiteDatabase db = dbHelper.getWritableDatabase();
ContentValues movieValues = TestUtilities.createMovieValues();
long recordNum = db.insert(MovieContract.Movie.TABLE_NAME, null,movieValues);
assertTrue("Unable to Insert WeatherEntry into the Database", recordNum != -1);
db.close();
String selection = "MovieContract.Movie.FAVORITE = ?";
String [] selectionArgs = new String [] {"'1'"};
String sortOrder = "MovieContract.Movie.TITLE";
Cursor movieCursor = mContext.getContentResolver().query(
MovieContract.Movie.CONTENT_URI,
null,
selection,
selectionArgs,
sortOrder
);
TestUtilities.validateCursor("testBasicWeatherQuery", movieCursor, movieValues);
movieCursor.close();
}
这是我在 ContentProvider 中的查询方法;所以当我定义 'selection' 时,它会抛出 'no such column' 但如果我把所有 null,除了 URI,它会抛出默认的 Unknown Uri 异常,即使 Uri 实际上存在于 UriMatcher 中。
@Override
public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
Cursor cursor;
Log.v("QUERY MovieProvider", uri.toString());
switch (uriMathcher.match(uri)){
case MOVIE_WITH_ID:{
Log.v("MovieProvider QUERY", "MOVIE WITH ID");
//cursor = getMovieWithId(uri);
cursor = dbHelper.getReadableDatabase().query(MovieContract.Movie.TABLE_NAME ,null, "MovieContract.Movie._ID =", selectionArgs,null,null,sortOrder);
}
break;
case MOVIE:{
Log.v("MovieProvider QUERY", "MOVIE");
//Log.v("MovieProvider QUERY", selection);
//Log.v("MovieProvider QUERY", selectionArgs[0]);
cursor = dbHelper.getReadableDatabase().query(MovieContract.Movie.TABLE_NAME, null,selection, selectionArgs, null, null, sortOrder);
}
default: {
throw new UnsupportedOperationException("Unknown uri: " + uri);
}
}
cursor.setNotificationUri(getContext().getContentResolver(), uri);
return cursor;
}
如果需要任何其他信息,请告诉我。
我的 Github 存储库是 here
请更改这些行:
String selection = "MovieContract.Movie.FAVORITE = ?";
String [] selectionArgs = new String [] {"'1'"};
String sortOrder = "MovieContract.Movie.TITLE";
至
String selection = MovieContract.Movie.FAVORITE + " = ?";
String [] selectionArgs = new String [] {"1"};
String sortOrder = MovieContract.Movie.TITLE;
或到(同样有效)
String selection = "favorite = ?";
String [] selectionArgs = new String [] {"1"};
String sortOrder = "title";