8

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

IllegalArgumentException: 列 '_id' が存在しません

を使用SimpleCursorAdapterしてデータベースから取得する場合、テーブルには実際にこの_id列があります。これは一般的な問題であることに気づき、オンラインでいくつかの解決策を考えて回避しようとしましたが、どれも機能しません。これは私のカーソルクエリです:

SimpleCursorAdapter mAdapter = new SimpleCursorAdapter(this, R.layout.quoterow, myCursor, new String[]{"_id", "quote"}, new int[]{R.id.quote});

元の列には列が含まれていなかったことに言及する必要があり_idますが、問題を解決するために最近これを追加しました. 問題の解決に役立つアイデアはありますか?

4

3 に答える 3

15

データベースに '_id' という列を含める必要はありませんが、SimpleCursorAdaptor には列を返す必要があります。エイリアスを使用してこれを行うことができます。

例は、列を持つテーブルがあることです...

uid,name,number

これを SimpleCursorAdapter に対して照会するには、データベースでこれを行いますrawQuery...

SELECT uid as _id,name,number FROM MY_TABLE

これは正常に機能し、必要な「_id」列を SimpleCursorAdapter に提供します。

編集:私が理解している限り、_id フィールドは一意のキーとして使用され、カーソルが処理するデータをアダプターやアダプタービューなどで正しく処理できるようにします。

コンテンツ プロバイダーのドキュメントのデータ モデルを参照してください。

あらゆる種類の「データベース」で一意のキーを使用することは、ほとんど普遍的な慣行であり、私が知る限り、列名「_id」(または「_ID」) の使用は、単純に標準化して単純化する方法です。データベース、コンテンツ プロバイダ、カーソル、アダプタなど

つまり、これらのさまざまなコンポーネントが正しく機能するためには、一意の値を持つデータ列が必要ですが、その列の名前が何であるかを「知っている」必要もあります。いわば、私の「name」列と「number」列ではなく、私の列名「uid」が必要なものであることを「知りません」。

于 2011-04-28T21:53:57.217 に答える
0

テーブルに列「_id」がないか、クエリに含めていません。それが例外の原因です。以下も修正する必要があります。

CursorAdapter コンストラクターの最後の引数に、_id の to 列参照がありません。

int[] 引数は、カーソルから値を入力するビュー ID の配列です。String[] 引数は、カーソルが指している行の列名の配列です。

to 配列と同じ数の値を from 配列に含める必要があります。Cursor からのデータは Cursor から取得され、ビューに配置されるためです。各配列に同じ数の値がない場合、アダプターはデータをビューにマップするための適切な量の情報を持っていないため、例外をスローします。

また、SimpleCursorAdapter の JavaDoc によると、UI スレッドでクエリが実行されるため、そのコンストラクターは推奨されていません。これは悪いことです。代わりにこれを使用してください:

http://developer.android.com/reference/android/widget/SimpleCursorAdapter.html#SimpleCursorAdapter%28android.content.Context,%20int,%20android.database.Cursor,%20java.lang.String[],%20int[ ],%20int%29

簡単な修正は、引数リストの最後に「,0」を追加することです。

于 2011-04-28T21:10:49.467 に答える
0

Android アプリケーションで既存の sqlite データベースを使用しようとしている場合は、適切に機能させるためにいくつかの準備作業を行う必要があります。このブログ投稿では、プロセスについて詳しく説明しています。

http://www.reigndesign.com/blog/using-your-own-sqlite-database-in-android-applications/

于 2011-04-28T23:30:24.967 に答える