これは私がショックを受けた興味深い質問ですが、インターネット上でこれほど頻繁に尋ねられることはありません。AndroidのCursorAdaptersは、ContentProviderを起動して実行し、その使用方法を学ぶと非常に便利ですが、クエリの一部として_idフィールドを含める必要があるため制限されています(これがないとエラーがスローされます)。理由は次のとおりです。
私の特定の問題は、2つのスピナーがあることです。1つのスピナーにはデータベースからの一意の「カテゴリ」名が含まれ、もう1つには選択した「カテゴリ」からのすべてのデータベースエントリが入力されます(カテゴリはここでは列名です)。これは、多くのプログラムが使用する可能性のある非常に単純なセットアップのようです。その最初のスピナーを実装しようとすると、問題が発生します。
その最初のスピナーに必要なクエリは次のとおりです。
SELECT DISTINCT category FROM table;
クエリの一部として_id列が必要なため、このクエリを実行するとCursorAdapterでエラーがスローされます。_id列をプロジェクションに追加すると、テーブルのすべての行が自然に返されます。これは、個別のIDも要求しているためであり、すべてのIDは(定義上)個別です。明らかに、カテゴリ名ごとに1つのエントリだけを表示したいと思います。
私はすでに回避策を実装しました。それは、上記のクエリを実行してから、結果をArrayAdapterにコピーすることです。この投稿の私の理由は、この奇妙な小さな問題に対してよりエレガントな解決策があるかどうかを確認し、私がより良くできることについての議論を開始することです。さまざまな種類のコントロールやアダプターを使用するなど、別の実装提案を歓迎します。