【问题标题】:Cursor.moveToFirst() returning falseCursor.moveToFirst() 返回 false
【发布时间】:2014-12-12 17:35:15
【问题描述】:

我有以下几行代码:-

public class ReminderBroadcastReceiver extends BroadcastReceiver {

    private static final String TAG = "ReminderBroadcastReceiver";
    public static final String EVENT_REMINDER_ACTION = "android.intent.action.EVENT_REMINDER";
    private Context mcontext;

    @Override
    public void onReceive(Context context, Intent intent) {
        // TODO Auto-generated method stub
        mcontext = context;
        String action = intent.getAction();
        Log.i(TAG, "reminder broadcast received ");
        if (action.equals(EVENT_REMINDER_ACTION)) {
            processReminder(intent);
        }

    }

    private void processReminder(Intent intent) {

        Uri uri = intent.getData();

        ContentResolver cr = mcontext.getContentResolver();
        String alarmTime = uri.getLastPathSegment();

        String[] projection = new String[] { CalendarAlerts.EVENT_ID,
                CalendarAlerts.DESCRIPTION, CalendarAlerts.TITLE,
                CalendarAlerts.ALARM_TIME };
        String selection = CalendarContract.CalendarAlerts.ALARM_TIME + "=?";

        Cursor c = cr.query(
                CalendarContract.CalendarAlerts.CONTENT_URI_BY_INSTANCE,
                projection, selection, new String[] { alarmTime }, null);

        ReminderData reminder_data = null;

        if (c != null) {
            if (c.moveToFirst()) {
                do {
                    String event_id = c.getString(c
                            .getColumnIndex(CalendarAlerts.EVENT_ID));
                    String event_desc = c.getString(c
                            .getColumnIndex(CalendarAlerts.DESCRIPTION));
                    String event_title = c.getString(c
                            .getColumnIndex(CalendarAlerts.TITLE));
                    long alarm_time = c.getLong(c
                            .getColumnIndex(CalendarAlerts.ALARM_TIME));

                    SimpleDateFormat sdf = new SimpleDateFormat("HH:mm",
                            Locale.getDefault());
                    String str_alarm_time = sdf.format(new Date(alarm_time));

                    reminder_data = new ReminderData(event_id,event_desc,event_title,str_alarm_time);

                } while (c.moveToNext());
            }

            c.close();
        }

        sendReminder(NotificationType.NOTI_ALARM, 0, reminder_data);

    }
private void sendReminder(int notiType, int arg1, ReminderData data) {
        Message msg = new Message();
        msg.what = notiType;
        msg.arg1 = arg1;
        msg.obj = data;

        NotificationQueueManager.getInstance(mcontext).queueNotification(msg);
    }
}

我想对上述类进行 J UNit 测试,但 (c.moveToFirst()) 总是返回 false。 我怎样才能让它返回true,以便它进入块内。

我的测试代码如下:-

    public void testtestonReceive4(){
ContentValues values = new ContentValues();
    values.put(CalendarAlerts.EVENT_ID, "1");
            values.put(CalendarAlerts.DESCRIPTION, "2");
            values.put(CalendarAlerts.TITLE, "3");
            values.put(CalendarAlerts.ALARM_TIME, "4");

            ContentResolver cr = mContext.getContentResolver();
    cr.insert(CalendarContract.CalendarAlerts.CONTENT_URI_BY_INSTANCE, values);
    ... 
    ...
    }

我的测试代码 Android 清单:-

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.test.app"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk android:minSdkVersion="16" />
    <uses-permission android:name="android.permission.WRITE_CALENDAR" />

    <instrumentation
        android:name="android.test.InstrumentationTestRunner"
        android:targetPackage="com.test.app" />

    <application
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name" >
        <uses-library android:name="android.test.runner" />
    </application>

</manifest>

我收到错误:-

java.lang.SecurityException: Permission Denial: 从 pid=18317 写入 com.android.providers.calendar.CalendarProvider2 uri content://com.android.calendar/calendar_alerts/by_instance,uid=10017 需要 android。 permission.WRITE_CALENDAR 或 grantUriPermission()

【问题讨论】:

  • 当它返回false时,说明你的查询结果是一个空集。
  • 是的,但我想对该类进行 J 单元测试。可以,我将它设置为从我的测试代码中返回 true。
  • 游标中必须有数据,否则调用moveToFirst时会返回false。如果您希望该方法返回 true,则应将一些数据放入您的 ContentResolver
  • 如何使用我的测试代码向其中填充数据?使其返回 true。
  • 使用ContentValues 将数据插入到您的ContentResolver

标签: android junit android-cursor android-contentresolver


【解决方案1】:

如果你的方法c.moveToFirst()返回false是因为你的游标是空的而不是null(你的查询成功了)。

编辑: 如何将项目添加到数据库:

    ContentValues values = new ContentValues();
    values.put(CalendarAlerts.DESCRIPTION, "Description");
    values.put(CalendarAlerts.TITLE, "Title");
    values.put(CalendarAlerts.ALERT_TIME, "Your time");

    cr.insert(CalendarContract.CalendarAlerts.CONTENT_URI_BY_INSTANCE, values);

【讨论】:

  • 是的,它是正确的。但是有什么方法可以从我的测试代码中将其返回为真,以便它进入块内。
  • 以防万一您的数据库有行并且游标从该查询中获取元素。
  • 您能否提供代码来填充数据以使其返回 true?
  • 我尝试了同样的方法,但它给出了上述错误。我也添加了我的 android 清单。
【解决方案2】:

我相信您编辑了 Manifest 文件,因为您显示的错误消息是:

java.lang.SecurityException: Permission Denial: 从 pid=18317 写入 com.android.providers.calendar.CalendarProvider2 uri content://com.android.calendar/calendar_alerts/by_instance,uid=10017 需要 android。 permission.WRITE_CALENDAR 或 grantUriPermission()

这意味着操作失败,因为您没有包含:

<uses-permission android:name="android.permission.WRITE_CALENDAR" />

在您的清单文件中。正如我现在在您的帖子中看到的那样,我会说这是原始错误的原因。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-27
    • 1970-01-01
    • 1970-01-01
    • 2014-10-18
    • 2015-08-02
    相关资源
    最近更新 更多