0

WHERE 句を使用してクエリを実行すると結果が返されないという問題がありますが、WHERE を null のままにしておくと、すべてのレコードで実行され、一致が見つかります。クエリの何が問題なのか誰か教えてもらえますか?

私のコードでは、contactURI が「content://com.android.contacts/contacts/lookup/953i7d73a639091bc5b6/164」に等しく、contactUriId が「164」に等しいとしましょう。

                // Put data in the contactURI
                contactURI = data.getData();

                // get the contact id from the URI
                contactUriId = contactURI.getLastPathSegment();

                //TEST TODO Fix URI Issue
                String [] PROJECTION = new String [] {  Data.CONTACT_ID, Data.LOOKUP_KEY };

                Cursor cursor = this.managedQuery(Data.CONTENT_URI, PROJECTION, Data.CONTACT_ID + "=?" + " AND "
                        + Data.MIMETYPE + "='*'",
                new String[] { String.valueOf(contactUriId) }, null);

                Log.e(DEBUG_TAG, contactUriId+"-164-");
                for(cursor.moveToFirst(); cursor.moveToNext(); cursor.isAfterLast()) {
                     Log.v(DEBUG_TAG, "lookupKey for contact: " + cursor.getString(1) + " is: -" + cursor.getString(0) + "-");
                     if(cursor.getString(0).equals("164")){
                         Log.e(DEBUG_TAG, "WE HAVE A MATCH");
                     }
                }

これは私のログです...

05-14 19:08:40.764: D/OpenGLRenderer(21559): Flushing caches (mode 0)
05-14 19:08:46.944: E/MyDebug(22269): 164-164-
4

1 に答える 1

4

問題はこれにあります:

Data.MIMETYPE + "='*'"

MIMETYPEそれは、文字どおり という名前のを検索してい*ます。すべてMIMETYPEの を選択する場合は、何もしないでください。デフォルトでは、クエリはこれらすべての行を返します。

また、このループは実行されているように見えますが、正しくありません。

for(cursor.moveToFirst(); cursor.moveToNext(); cursor.isAfterLast()) {

インデックス -1 から移動されcursor ていないため。これは最初から安全に開始され、最後の行まで繰り返されます。

while(cursor.moveToNext()) {

移動しcursor最初からやり直したい場合は、次を使用できます。

for(cursor.moveToFirst(); cursor.moveToNext(); ) {

詳細な説明 理由: cursor.isAfterLast()はカーソルを移動せず、カーソルがまだ有効なデータを参照しているかどうかを確認するだけです。cursor.moveToNext()カーソルを次の行に移動し、カーソルtrueがまだ境界内にある場合は戻ります。(つまり、 ifcursor.isAfterLast()truethen をcursor.moveToNext()返しますfalse。)

于 2012-05-14T23:19:35.830 に答える