如何在Android的AlarmManager中更新SQLite数据库值

如何在Android的AlarmManager中更新SQLite数据库值,android,sqlite,alarmmanager,Android,Sqlite,Alarmmanager,我有一段代码,只需点击一下按钮就可以很好地运行,但现在我需要在报警服务中自动运行它。当我调用要在**Runnable**接口中执行的方法(updateDays())时,根本不会调用它。数据库未按预期更新。我真的做对了吗 DbAdapter mDbHelper; Cursor mCursor; Runnable mUpdateTask = new Runnable() { public void run() { long maxWaitTime = System.curr

我有一段代码,只需点击一下按钮就可以很好地运行,但现在我需要在报警服务中自动运行它。当我调用要在
**Runnable**
接口中执行的方法(
updateDays()
)时,根本不会调用它。数据库未按预期更新。我真的做对了吗

DbAdapter  mDbHelper;

Cursor mCursor;

Runnable mUpdateTask = new Runnable() {
    public void run() {
      long maxWaitTime = System.currentTimeMillis() + 10*1000;
      while (System.currentTimeMillis() < maxWaitTime) {
        synchronized (mBinder) {
          try {
             updateDays();
             mBinder.wait(maxWaitTime - System.currentTimeMillis());
          } catch (Exception e) {

          }
       }
   }
}



private void updateDays() {
    mDbHelper.open();
    if(mCursor != null) {
      mDbHelper.updateDL (DbAdapter.KEY_ID,
               mCursor.getInt(mCursor.getColumnIndex(DbAdapter.KEY_DAYS))-1,
               DbAdapter.KEY_DATE_TIME);
      mDbHelper.close();

Toast.makeText(this, "Update done !", Toast.LENGTH_SHORT).show();
}
编辑2

我的服务
**onCreate**
方法

@Override
public void onCreate() {
mNofitication = (NotificationManager)getSystemService(NOTIFICATION_SERVICE);

displayNotification();

Thread tr = new Thread(null, mUpdateTask, "AlarmService");
tr.start();
}

根据您的要求,我觉得您需要在使用报警管理器的同时使用待定的意图。下面显示了一个相同的示例:

//Creating a PendingIntent
Intent intent = new Intent(MainActivity.this, MyService.class);
PendingIntent pendingIntent = PendingIntent.getService(
MainActivity.this, UNIQUE_ID_RANDOM, intent, 0);
//Creating an AlarmManager and setting the pendingIntent to him
AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);
alarmManager.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis()
+ (5 * 1000), pendingIntent);
Toast.makeText(MainActivity.this, "Alarm set in " + 5 + " seconds",
Toast.LENGTH_SHORT).show();
现在,在服务中,您可以在5秒钟后启动,您可以输入上述代码并进行尝试。以下是示例:

public class MyService extends Service{

@Override
public void onCreate() {
    super.onCreate();

}

@Override
public int onStartCommand(Intent intent, int flags, int startId) {

    //Your database opening code should come here. But take care of the syntax related constructs.
    return START_NOT_STICKY;
 }


@Override
public IBinder onBind(Intent arg0) {
    // TODO Auto-generated method stub
    return null;
}

}
我希望这对你有帮助

问候,


Zax

我能看到的唯一方法是,如果您的服务覆盖了
onCreate()
,并且没有链接到超类,那么您可以在的第116行获得
NullPointerException

按照以下说明检查与崩溃相关的Java堆栈跟踪:如果您无法解释该堆栈跟踪,编辑您的问题以提供它。@commonware,谢谢您的否决投票,但看起来您并没有正确理解我。我在上面的代码解释中说我得到了空指针异常。其次,在地球上约70亿人中,你是唯一一个可能知道你在哪里得到
NullPointerException
的人。这就是为什么我建议,如果您无法解释堆栈跟踪,请编辑您的问题以提供它。为了能够帮助您,我们需要知道您在代码中的什么地方触发了
NullPointerException
@Dadani:问题还不错,只是您没有提供足够的信息让某人给出答案。投票赞成这个问题。@Commonware,对不起,我认为是你投了反对票,因为你是我看到的唯一一个发表评论的人,我无法知道是谁投了反对票。谢谢你的建议。为了清晰起见,我添加了更多信息。谢谢,但我使用的是alarm manager,而不是操作系统GC提供的简单服务。在我的例子中,时间是至关重要的。我已经添加了onCreate方法及其内容,请检查它是否是导致问题的方法。@Dadani:正如我在回答中指出的,您没有链接到超类。调用
super.onCreate()
,这是您在
onCreate()
方法中所做的第一件事。让我尝试一下,并尽快回复您。谢谢您,它已经成功了。但是,这只回答了有关
NullPointerException
的问题的第一部分。数据库仍然没有更新。根本不会调用方法
updateDays()
public class MyService extends Service{

@Override
public void onCreate() {
    super.onCreate();

}

@Override
public int onStartCommand(Intent intent, int flags, int startId) {

    //Your database opening code should come here. But take care of the syntax related constructs.
    return START_NOT_STICKY;
 }


@Override
public IBinder onBind(Intent arg0) {
    // TODO Auto-generated method stub
    return null;
}

}