0

私はしばらくこの問題に悩まされてきました。

複数のデータベース カーソルを持つブロードキャスト レシーバーの良い例はありますか?

問題: PagerTabStrip を実装し、BroadCast レシーバーとリマインダーの通知も実装しました。

したがって、デバイス画面で通知をクリックすると、最初のカーソルのみが開き、他のカーソルも開きません..カーソルを閉じたことは確かです。

これは、私が欲しいものなしで空白の活動を開くだけです.

public class ReminderService extends WakeReminderIntentService{

public ReminderService(){
    super("ReminderService");
}

@SuppressWarnings("deprecation")
void doReminderWork(Intent intent){
    Log.d("ReminderService", "Doing work.");
    Long rowId = intent.getExtras().getLong(TaskDatabase.KEY_ROWID);

    NotificationManager mgr = (NotificationManager)getSystemService(NOTIFICATION_SERVICE);

    Intent notificationIntent = new Intent(this, TaskEdit.class);
    notificationIntent.putExtra(TaskDatabase.KEY_ROWID, rowId);

    PendingIntent pi = PendingIntent.getActivity(this, 0, notificationIntent, PendingIntent.FLAG_ONE_SHOT);

/// コードの残りの部分。

BROADCASTRECEIVER(このクラスはカーソルを取得します)

public void onReceive(Context context, Intent intent){
    ReminderManager reminderMgr = new ReminderManager(context);

    TaskDatabase dbHelper = new TaskDatabase(context);
    dbHelper.open();
    Cursor cursor = dbHelper.fetchAllGeneralRemindersByDefault();
    if(cursor != null){

        cursor.moveToFirst();
        int rowIdColumnIndex = cursor.getColumnIndex(TaskDatabase.KEY_ROWID);
        int dateTimeColumnIndex = cursor.getColumnIndex(TaskDatabase.KEY_DATE_TIME);

        while(cursor.isAfterLast() == false){
            Log.d(TAG, "Adding alarm from boot.");
            Log.d(TAG, "Row Id Column Index - " + rowIdColumnIndex);
            Log.d(TAG, "Date Time Column Index - " + dateTimeColumnIndex);

            Long rowId = cursor.getLong(rowIdColumnIndex);
            String dateTime = cursor.getString(dateTimeColumnIndex);

            Calendar cal = Calendar.getInstance();
            SimpleDateFormat format = new SimpleDateFormat(TaskEdit.DATE_TIME_FORMAT);
            try{
                java.util.Date date = format.parse(dateTime);
                cal.setTime(date);

                reminderMgr.setReminder(rowId, cal);
            }catch(java.text.ParseException e){
                Log.e("OnBootReceiver", e.getMessage(), e);
            }
            cursor.moveToNext();
        }
4

1 に答える 1

0

あなたの質問を理解した上で、fetchAllGeneralRemindersByDefault() に問題があると確信しています。空のカーソルを返しています。これがコードによるものなのか、データベースが空なのかはわかりません。

コード リファクタリングの提案:

public void onReceive(Context context, Intent intent){
ReminderManager reminderMgr = new ReminderManager(context);

TaskDatabase dbHelper = new TaskDatabase(context);
dbHelper.open();
// returns an empty cursor at index -1 (that is normal behaviour for cursors)
Cursor cursor = dbHelper.fetchAllGeneralRemindersByDefault();
if(cursor != null && cursor.size() > 0){ // added check 

    int rowIdColumnIndex = cursor.getColumnIndex(TaskDatabase.KEY_ROWID);
    int dateTimeColumnIndex = cursor.getColumnIndex(TaskDatabase.KEY_DATE_TIME);

    // when you called moveToNext on the empty cursor
    // it corresponds to calling list.get(0) on an empty ArrayList
    while(cursor.moveToNext()){
        Log.d(TAG, "Adding alarm from boot.");
        Log.d(TAG, "Row Id Column Index - " + rowIdColumnIndex);
        Log.d(TAG, "Date Time Column Index - " + dateTimeColumnIndex);

        Long rowId = cursor.getLong(rowIdColumnIndex);
        String dateTime = cursor.getString(dateTimeColumnIndex);

        Calendar cal = Calendar.getInstance();
        SimpleDateFormat format = new SimpleDateFormat(TaskEdit.DATE_TIME_FORMAT);
        try{
            java.util.Date date = format.parse(dateTime);
            cal.setTime(date);

            reminderMgr.setReminder(rowId, cal);
        }catch(java.text.ParseException e){
            Log.e("OnBootReceiver", e.getMessage(), e);
        }
    }
} else {
    Log.e("OnBootReceiver", "fetchAllGeneralRemindersByDefault() returned empty cursor");
}
}
于 2013-09-28T21:54:45.510 に答える