0

私はいたずら好きで、Android開発者サイトの公式メモ帳アプリケーションからメソッドをコピーしました。これは私のクラスです:

package com.example.prva;

import android.app.ListActivity;
import android.database.Cursor;
import android.os.Bundle;
import android.support.v4.widget.SimpleCursorAdapter;


public class ListView extends ListActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        setContentView(R.layout.listview);
        fillData();
        }

    private void fillData() {
        // Get all of the notes from the database and create the item list
        Cursor c = DatabaseManager.getAllData();
        startManagingCursor(c);

        String[] from = new String[] { DatabaseManager.TABLE_COLUMN_ONE };
        int[] to = new int[] { R.id.text1 };

        // Now create an array adapter and set it to display using our row
        SimpleCursorAdapter notes =
            new SimpleCursorAdapter(this, R.layout.notes_row, c, from, to);
        setListAdapter(notes);
    }
    }

このListActivityを実行しようとすると、次のエラーが発生します。

01-31 02:39:14.259: E/AndroidRuntime(1845): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.prva/com.example.prva.ListView}: java.lang.IllegalArgumentException: column '_id' does not exist

これは本当です。データベースに_id列がありません(メモ帳アプリケーションデータベースには_id列があり、使用していますが、独自のデータベースがあります)。ListActivityでその列がどこにあるのかわかりません。クラス?どこから呼び出されているのでエラーが発生しますか?

4

1 に答える 1

1

CursorAdapterのドキュメントを参照してください。

カーソルには_idという名前の列が含まれている必要があります。含まれていない場合、このクラスは機能しません。

コードでは、派生クラスであるSimpleCursorAdapterを使用しているため、このステートメントが適用されるように見えます。

カーソルはイテレータやポインタのようなもので、データをトラバースするためのメカニズムしか含まれていません。列自体は含まれていません。

別のドキュメントから、上記のステートメントをよりよく理解できます。

コンテンツURIIDの処理

慣例により、プロバイダーは、URIの最後にある行のID値を持つコンテンツURIを受け入れることにより、テーブル内の単一の行へのアクセスを提供します。また、慣例により、プロバイダーはID値をテーブルの_ID列と照合し、一致する行に対して要求されたアクセスを実行します。

この規則により、プロバイダーにアクセスするアプリの一般的なデザインパターンが容易になります。アプリはプロバイダーに対してクエリを実行し、CursorAdapterを使用して結果のカーソルをListViewに表示します。CursorAdapterの定義では、カーソルの列の1つが_IDである必要があります。

問題を解決するためのいくつかの方法:

  1. テーブルに列「_id」を追加します。

  2. エイリアスを使用してcurosrを取得します。例えば:

    SELECT someid as _id、name、number FROM TABLE1;

于 2013-01-31T02:56:22.133 に答える