2015-10-18 64 views
0

我想为我的Android应用程序创建一个SQLite数据库。
一切工作正常,直到我在ContentProvider中查询功能的JUnit测试。SQLiteException:没有这样的列Android

我看了非常深入的论坛,看到有些人有以下

  1. 错误创建表中有错别字吧 - 这里是我的表创建语句

    CREATE TABLE电影(
    _id INTEGER PRIMARY KEY,
    title TEXT NOT NULL,
    overview TEXT DEFAULT'NO OVERVIEW',
    poster_path TEXT DEFAULT'NO POSTER',
    RELEASE_DATE TEXT DEFAULT '否可用日期',
    vote_average TEXT DEFAULT '还没有投票',
    SORT_TYPE INTEGER NOT NULL,
    喜爱INTEGER DEFAULT 0
    );

  2. 添加列后未更新Database_Version常量。
    我试着更新Database_Version常量,我也尝试更改数据库的名称,所以它从头开始创建。

  3. 从我的Android设备中删除了我的所有旧应用程序。

  4. 阅读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 

我的测试用例的方法。
错误被抛出就行光标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我的查询方法;所以当我有'选择'定义它会引发'没有这样的列',但如果我把所有的空,除了URI它会抛出未知的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

+0

内容提供商字段区分大小写。 'MovieContract.Movie。FAVORITE'与'MovieContract.Movie.favorite'不一样' – t0mm13b

+0

@ t0mm13b嗯,从来没有新的东西,但点了。我将它们改为小写,但仍不能解决问题。我更新了上面的错误消息 – Jenny

+0

尝试从你的设备卸载你的应用程序,并重新安装它再次 –

回答

1

请更改这些行:

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"; 
相关问题