2013-08-26 52 views
0

我有提醒应用程序。 This是源代码。问题是,当我设置一个闹钟,然后一切都很好。但是当我设置三个闹钟时,我的应用只读取最后一个闹钟,它只会提醒第三个闹钟,并忽略前两个闹钟。你能帮助我正确设置alarmManager,以便在特定时间内安排每个通知吗?Android reminer只能读取一个闹钟

这是ReminderManager.java:

import java.util.Calendar; 

import android.app.AlarmManager; 
import android.app.PendingIntent; 
import android.content.Context; 
import android.content.Intent; 

public class ReminderManager { 

    private Context mContext; 
    private AlarmManager mAlarmManager; 

    public ReminderManager(Context context) { 
     mContext = context; 
     mAlarmManager = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE); 
    } 

    public void setReminder(Long taskId, Calendar when) { 

     Intent i = new Intent(mContext, OnAlarmReceiver.class); 
     i.putExtra(RemindersDbAdapter.KEY_ROWID, (long)taskId); 

     PendingIntent pi = PendingIntent.getBroadcast(mContext, 0, i, PendingIntent.FLAG_ONE_SHOT); 

     mAlarmManager.set(AlarmManager.RTC_WAKEUP, when.getTimeInMillis(), pi); 
    } 
} 

这是RemindersDbAdapter.java:

import android.content.ContentValues; 
import android.content.Context; 
import android.database.Cursor; 
import android.database.SQLException; 
import android.database.sqlite.SQLiteDatabase; 
import android.database.sqlite.SQLiteOpenHelper; 
import android.util.Log; 

/** 
* Simple reminder database access helper class. 
* Defines the basic CRUD operations (Create, Read, Update, Delete) 
* for the example, and gives the ability to list all reminders as well as 
* retrieve or modify a specific reminder. 
* 
*/ 
public class RemindersDbAdapter { 

    // 
    // Databsae Related Constants 
    // 
    private static final String DATABASE_NAME = "data"; 
    private static final String DATABASE_TABLE = "reminders"; 
    private static final int DATABASE_VERSION = 3; 

    public static final String KEY_TITLE = "title"; 
    public static final String KEY_BODY = "body"; 
    public static final String KEY_DATE_TIME = "reminder_date_time"; 
    public static final String KEY_ROWID = "_id"; 


    private static final String TAG = "ReminderDbAdapter"; 
    private DatabaseHelper mDbHelper; 
    private SQLiteDatabase mDb; 

    /** 
    * Database creation SQL statement 
    */ 
    private static final String DATABASE_CREATE = 
      "create table " + DATABASE_TABLE + " (" 
        + KEY_ROWID + " integer primary key autoincrement, " 
        + KEY_TITLE + " text not null, " 
        + KEY_BODY + " text not null, " 
        + KEY_DATE_TIME + " text not null);"; 



    private final Context mCtx; 

    private static class DatabaseHelper extends SQLiteOpenHelper { 

     DatabaseHelper(Context context) { 
      super(context, DATABASE_NAME, null, DATABASE_VERSION); 
     } 

     @Override 
     public void onCreate(SQLiteDatabase db) { 

      db.execSQL(DATABASE_CREATE); 
     } 

     @Override 
     public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
      Log.w(TAG, "Upgrading database from version " + oldVersion + " to " 
        + newVersion + ", which will destroy all old data"); 
      db.execSQL("DROP TABLE IF EXISTS " + DATABASE_TABLE); 
      onCreate(db); 
     } 
    } 


    public RemindersDbAdapter(Context ctx) { 
     this.mCtx = ctx; 
    } 

    /** 
    * Open the database. If it cannot be opened, try to create a new 
    * instance of the database. If it cannot be created, throw an exception to 
    * signal the failure 
    * 
    * @return this (self reference, allowing this to be chained in an 
    *   initialization call) 
    * @throws SQLException if the database could be neither opened or created 
    */ 
    public RemindersDbAdapter open() throws SQLException { 
     mDbHelper = new DatabaseHelper(mCtx); 
     mDb = mDbHelper.getWritableDatabase(); 
     return this; 
    } 

    public void close() { 
     mDbHelper.close(); 
    } 


    /** 
    * Create a new reminder using the title, body and reminder date time provided. 
    * If the reminder is successfully created return the new rowId 
    * for that reminder, otherwise return a -1 to indicate failure. 
    * 
    * @param title the title of the reminder 
    * @param body the body of the reminder 
    * @param reminderDateTime the date and time the reminder should remind the user 
    * @return rowId or -1 if failed 
    */ 
    public long createReminder(String title, String body, String reminderDateTime) { 
     ContentValues initialValues = new ContentValues(); 
     initialValues.put(KEY_TITLE, title); 
     initialValues.put(KEY_BODY, body); 
     initialValues.put(KEY_DATE_TIME, reminderDateTime); 

     return mDb.insert(DATABASE_TABLE, null, initialValues); 
    } 

    /** 
    * Delete the reminder with the given rowId 
    * 
    * @param rowId id of reminder to delete 
    * @return true if deleted, false otherwise 
    */ 
    public boolean deleteReminder(long rowId) { 

     return mDb.delete(DATABASE_TABLE, KEY_ROWID + "=" + rowId, null) > 0; 
    } 

    /** 
    * Return a Cursor over the list of all reminders in the database 
    * 
    * @return Cursor over all reminders 
    */ 
    public Cursor fetchAllReminders() { 

     return mDb.query(DATABASE_TABLE, new String[] {KEY_ROWID, KEY_TITLE, 
       KEY_BODY, KEY_DATE_TIME}, null, null, null, null, null); 
    } 

    /** 
    * Return a Cursor positioned at the reminder that matches the given rowId 
    * 
    * @param rowId id of reminder to retrieve 
    * @return Cursor positioned to matching reminder, if found 
    * @throws SQLException if reminder could not be found/retrieved 
    */ 
    public Cursor fetchReminder(long rowId) throws SQLException { 

     Cursor mCursor = 

       mDb.query(true, DATABASE_TABLE, new String[] {KEY_ROWID, 
         KEY_TITLE, KEY_BODY, KEY_DATE_TIME}, KEY_ROWID + "=" + rowId, null, 
         null, null, null, null); 
     if (mCursor != null) { 
      mCursor.moveToFirst(); 
     } 
     return mCursor; 

    } 

    /** 
    * Update the reminder using the details provided. The reminder to be updated is 
    * specified using the rowId, and it is altered to use the title, body and reminder date time 
    * values passed in 
    * 
    * @param rowId id of reminder to update 
    * @param title value to set reminder title to 
    * @param body value to set reminder body to 
    * @param reminderDateTime value to set the reminder time. 
    * @return true if the reminder was successfully updated, false otherwise 
    */ 
    public boolean updateReminder(long rowId, String title, String body, String reminderDateTime) { 
     ContentValues args = new ContentValues(); 
     args.put(KEY_TITLE, title); 
     args.put(KEY_BODY, body); 
     args.put(KEY_DATE_TIME, reminderDateTime); 

     return mDb.update(DATABASE_TABLE, args, KEY_ROWID + "=" + rowId, null) > 0; 
    } 
} 
+0

在哪里我必须使用这个数据库值来存储报警值? – Karthick

回答

0

这是因为PendingIntent部分,虽然据说

public static PendingIntent getBroadcast (Context context, int requestCode, Intent intent, int flags) 

requestCode发送的私人请求代码r(目前未使用)。

它时,你需要使用不同的requestCodes针对不同PendingIntents,否则系统将认为他们是一个的PendingIntent但多次重置,这是在这里你的问题。

讨论是here