11

これは私がショックを受けた興味深い質問ですが、インターネット上でこれほど頻繁に尋ねられることはありません。AndroidのCursorAdaptersは、ContentProviderを起動して実行し、その使用方法を学ぶと非常に便利ですが、クエリの一部として_idフィールドを含める必要があるため制限されています(これがないとエラーがスローされます)。理由は次のとおりです。

私の特定の問題は、2つのスピナーがあることです。1つのスピナーにはデータベースからの一意の「カテゴリ」名が含まれ、もう1つには選択した「カテゴリ」からのすべてのデータベースエントリが入力されます(カテゴリはここでは列名です)。これは、多くのプログラムが使用する可能性のある非常に単純なセットアップのようです。その最初のスピナーを実装しようとすると、問題が発生します。

その最初のスピナーに必要なクエリは次のとおりです。

SELECT DISTINCT category FROM table;

クエリの一部として_id列が必要なため、このクエリを実行するとCursorAdapterでエラーがスローされます。_id列をプロジェクションに追加すると、テーブルのすべての行が自然に返されます。これは、個別のIDも要求しているためであり、すべてのIDは(定義上)個別です。明らかに、カテゴリ名ごとに1つのエントリだけを表示したいと思います。

私はすでに回避策を実装しました。それは、上記のクエリを実行してから、結果をArrayAdapterにコピーすることです。この投稿の私の理由は、この奇妙な小さな問題に対してよりエレガントな解決策があるかどうかを確認し、私がより良くできることについての議論を開始することです。さまざまな種類のコントロールやアダプターを使用するなど、別の実装提案を歓迎します。

4

5 に答える 5

6

これが私が最終的に得たクエリです:

SELECT _id, category FROM table_name GROUP BY category;

これを実行するために、SQLiteDatabaseオブジェクトでrawQuery()関数を使用しました。「GROUPBY」の部分が正しい結果を得るための鍵だったので、正しい方向に私を向けてくれたユーザーSagarに感謝します。

この問題に対するより洗練された解決策である可能性があるため、この質問に対するユーザーAlSuttonの回答も検討してください。

みんな、ありがとう!

于 2011-03-15T18:47:31.117 に答える
4

一意のカテゴリごとに1つの行を含む、_idとcategoryだけを含む別のテーブルを用意することをお勧めします。データ行は、カテゴリフィールドをカテゴリテーブルの_idに置き換えることができます。

これには、カテゴリテーブルのカテゴリを変更できるという追加の利点があり、そのカテゴリのすべてのエントリに表示されます。

于 2011-02-15T14:19:42.017 に答える
3
SELECT DISTINCT category,_id FROM table GROUP BY category;

これはあなたが探しているものをあなたに与えるはずだと思います。この結果がカテゴリになり、そのカテゴリの最初の_idになります。2番目の列(_id)は無視してかまいません。

于 2011-02-15T14:22:09.133 に答える
0

selectステートメントで定数値である_idフィールドエイリアスを指定できます。次に例を示します。

SELECT DISTINCT 0 _id, category FROM table;

于 2011-02-15T17:31:40.370 に答える
0

さらに良いことに、私は以下を使用してこの問題を解決しました。

SELECT DISTINCT category AS _id FROM table

これで、_idという名前の列ができました。この列には必要なものが含まれています。

于 2014-02-06T23:29:15.637 に答える