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 个事件。

示例(测试用例)

测试:摩托罗拉里程碑,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参数。

如果您比较Android 2.3.3Android 4.0.3中的实现,您会注意到他们添加了selectionArgsas 参数并构建了combine自己的和用户提供的参数。

该错误已在此处修复:支持 Calendar.java 的清理

于 2012-04-24T17:23:24.753 回答