2017-11-12 22 views
0

本当に単純な解決策で完全にn00bの質問になるだろうが、私はコンテンツプロバイダーを通じてアクセスしているアプリケーションにSQLite dbを持っている。where節を使用しようとするとコンテンツリゾルバ.queryの問題が発生する

アクティビティの1つでは、イメージへのパスと(itemTable)への外部キーを含むテーブル(picturesTable)の1つを照会しようとしています。

私はpictureTableに保存された外部キーであるitemTableの_idフィールド(によって返された画像をフィルタリングするクエリをしたい。

テストなくなり、私はただのTextViewで返されたパスを表示しています。文字列はItemIdがありますintentExtraとして前のアクティビティから渡される。

Uri imgUri = mProvider.CONTENT_URI; 
    String[] columns = mDbHelper.ALL_IMG_COLUMNS; 
    String selection = mDbHelper.IMG_ITEM_ID; 
    String[] selectionArgs = new String[]{ItemId}; 
    String groupBy = null; 

    Cursor imgCursor = getContentResolver().query(imgUri, columns, 
      selection , selectionArgs, groupBy); 

    String imgPath = ""; 
    assert imgCursor != null; 
    imgCursor.moveToFirst(); 
     do { 
      imgPath += imgCursor.getString(
        imgCursor.getColumnIndex(mDbHelper.IMG_PATH)) + "\n"; 
      imgPath += "Image ID " + imgCursor.getString(
        imgCursor.getColumnIndex(mDbHelper.IMG_TREE_ID)) + "\n" + "\n"; 
     } while (imgCursor.moveToNext()); 

    imgCursor.close(); 
    tv.setText(imgPath); 

私が午前問題は、現在、そのだけでpicturesTableの最後の項目を返すということです。

私はを変更した場合〜mDbHelper.IMG_ITEM_ID + " = ?"、実行中にアプリがクラッシュする

selectionselectionArgsnullを予想通りに変更すると、返されたアイテムがすべて取得されます。

私がこれを解決するために何ができるかについてのアドバイスは、現在受け入れられているでしょう、今私は夢中になるでしょう!

+0

エミュレータ「app restarted」に@pskinkダイアログが表示されます。 Logcatは、IMG_PATHフィールドを取得しているカーソル行を指しています。 – AvieRose

+0

dumpCursorがすべての予期された列を表示しています – AvieRose

答えて

1

WHERE句に一致するデータがないため、空のカーソルが返された可能性があります。

空のカーソルは、クエリによって返されないnullカーソルとはまったく異なります。そのため、assertは、空のカーソルが置かれたカーソルには影響しません(これがアサートの意図であると仮定します)。

カーソルのmoveToFirstメソッドは、空のカーソルの場合のように、移動先の最初の行がない場合はfalseを返します。しかし、これがチェックされていないので、空のCursorは、移入されたCursorとまったく同じように処理/処理されません。

do... whileのように、入力されたカーソルではなく空のカーソルが存在する場合、imgPath += imgCursor.getString( imgCursor.getColumnIndex(mDbHelper.IMG_PATH)) + "\n";は、データを取得できる有効な行がないために例外が発生します。 moveToNextとして

、動きは、私は、少なくとも、コードのこの部分のためのデータを処理しないと、最も簡単な解決策は、置き換えることであろうことをお勧めしたい行うことができない場合moveToFirstのように、falseを返します: -

assert imgCursor != null; 
imgCursor.moveToFirst(); 
    do { 
     imgPath += imgCursor.getString(
       imgCursor.getColumnIndex(mDbHelper.IMG_PATH)) + "\n"; 
     imgPath += "Image ID " + imgCursor.getString(
       imgCursor.getColumnIndex(mDbHelper.IMG_TREE_ID)) + "\n" + "\n"; 
    } while (imgCursor.moveToNext()); 

で: -

while (imgCursor.moveToNext) { 
    imgPath += imgCursor.getString(
       imgCursor.getColumnIndex(mDbHelper.IMG_PATH)) + "\n"; 
    imgPath += "Image ID " + imgCursor.getString(
       imgCursor.getColumnIndex(mDbHelper.IMG_TREE_ID)) + "\n" + "\n"; 
} 

これは、空のカーソルのためimgPathに値を代入しようとしません。

もちろん、空のカーソルが返されるという根本的な問題は解決しません。

関連する問題