1

Stock Google Calendar古いデバイスの非公式APIを使用してイベントを取得しています。現在、手動でバインドするだけでなく、selection使用するコードをリファクタリングしています(これにより、有効なSQLが生成され、テストデバイス[2.2および2.3.3]で問題なく動作します)。selectionArgsandroid.content.ContentResolver.query()selection

問題:引数をすぐにバインドすると(例:) deleted = 0、テストアプリケーションは予期されたイベントを返しますが、Androidがバインドするdeleted = ?と(例:String[] { "0" }イベントなしで返されます。無視する理由は何selectionArgsですか? )

LogCatはエラーを表示しません。


例(予想)

STATIC: cursor=225
DYNAMIC: cursor=255

今年のカレンダーには255のイベントが発生しているため、255のイベントが返されます。

例(テストケース)

テスト済み:Motorolaマイルストーン、CyanogenMod 7(Android 2.3.3)。

STATIC: cursor=225
DYNAMIC: cursor=0

私はAndroidまたはカレンダーアプリケーションがバインドに失敗したと思います(しかし、私が何か間違ったことをしていることを願っています)。同様の問題のバグレポートを見つけましたが、カレンダーアプリケーションが影響を受けるかどうかはわかりません:http ://code.google.com/p/android/issues/detail?id = 4467

コード

package com.example;

import java.util.Calendar;

import android.app.Activity;
import android.database.Cursor;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.util.Log;


/**
 * Related bugs?
 *
 *   - http://code.google.com/p/android/issues/detail?id=4467
 */
public class CalendarCursorTestActivity extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);


        Calendar begin = Calendar.getInstance();
        Calendar end = Calendar.getInstance();
                 end.add(Calendar.YEAR, 1);

        String uriPrefix = Build.VERSION.SDK_INT >= 8 ? "content://com.android.calendar" : "content://calendar";
        Uri uri = Uri.parse(uriPrefix + "/instances/when/" + begin.getTimeInMillis() + "/" + end.getTimeInMillis());

        String[] projection = null;
        String sortOrder = null;

        // test static - log() returns: STATIC: cursor=225 => 225 events found
        {
            String selection = "deleted = 0";
            String[] selectionArgs = null;

            log("STATIC: ", getBaseContext().getContentResolver().query(
                uri, projection, selection, selectionArgs, sortOrder));
        }

        // test dynamic - log() returns: DYNAMIC: cursor=0 => no events found (!)
        {
            String selection = "deleted = ?";
            String[] selectionArgs = new String[] { "0" };

            log("DYNAMIC: ", getBaseContext().getContentResolver().query(
                uri, projection, selection, selectionArgs, sortOrder));
        }
    }


    public void log (String title, Cursor c) {
        Log.d(getClass().getName(), String.format(
            "%s cursor=%s", title, c == null ? "null" : c.getCount()));
    }
}
4

1 に答える 1

2

CalendarProviderにはバグがあるようです。

の実装queryは、ユーザーが指定したパラメーターを単に無視しselectionArgsます。

Android2.3.3Android4.0.3の実装を比較すると、それらがselectionArgsasパラメーターを追加しcombine、独自のパラメーターを作成し、ユーザーが提供したものをビルドしていることがわかります。

バグはここで修正されました:Calendar.javaのクリーンアップをサポートします

于 2012-04-24T17:23:24.753 に答える