3

問題

CursorLoader のインスタンス化は、引数として渡された URI ではなく、以前の CursorLoader の URI を使用しているようです。

CursorLoader cursor = new CursorLoader(this, FLASHCARD_CONTENT_URI, 
FLASHCARD_FROM, null, null, null);

次のエラーが発生しています:

no such column: front (code 1): , while compiling: 
SELECT _ID, front, back, FROM deck

クラス

  1. DeckIndex.java - データベースの「デッキ」テーブルを照会し、デッキの Cursor 配列を返します。
  2. DeckShow.java - データベースの「フラッシュカード」テーブルをクエリし、フラッシュカードの Cursor 配列を返します。
  3. AuducardOpenHelper.java - データベースの DDL と作成を担当します。
  4. DecksProvider - 「デッキ」テーブルの CRUD を担当
  5. FlashcardsProvider - 「flashcard」テーブルの CRUD を担当

説明

渡される URI:

public static final Uri FLASHCARD_CONTENT_URI = 
Uri.parse("content://" + AUTHORITY + "/" + FLASHCARD_TABLE_NAME);

これが FlashcardsProvider ではなく、DecksProvider によって処理されていることは事実です。

そして、FlashcardsProvider の UriMatcher:

@Override
public boolean onCreate(){
    uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
    uriMatcher.addURI(AUTHORITY, "flashcard", FLASHCARDS);

    auducards = new AuducardOpenHelper(getContext());
    return true;
}

DecksIndex クラスが最初に呼び出されるため、DeckProvider への呼び出しが正常に完了することに言及することが重要だと思います。DeckShow onCreate メソッドが呼び出されるのは、(DeckShow アクティビティを開始する) デッキの 1 つをクリックするまでではありません。

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        getLoaderManager().initLoader(1, null, this);
        setContentView(R.layout.activity_deck_show);
        mAdapter = new SimpleCursorAdapter(this, R.layout.flashcard_item, null, 
              FLASHCARD_FROM, FLASHCARD_TO, 0 );

        Intent intent = getIntent();
        String message = intent.getStringExtra(DeckIndex.EXTRA_MESSAGE);

    }

とエラーが発生します。

LoaderManager の初期化行:

DeckIndex.java

getLoaderManager().initLoader(0, null, this);

DeckShow.java

getLoaderManager().initLoader(1, null, this);

私の質問をご覧いただきありがとうございます。追加の詳細やコードが役立つかどうかお知らせください。

4

1 に答える 1