我想用一个内容观察员更新服务时的任何变化发生在我的应用程序的SQLite数据库。
我很困惑,怎么做,所以我放在一起下面的一些code。通常情况下,内容观察家们使用的接触或与媒体播放器的后台服务。在我的研究,我读了它可以用在手机上的SQLite数据库中。
问题:
1.由于SQLite数据库没有一个URI,我更换了什么信息 People.CONTENT_URI
在
this.getContentResolver()registerContentObserver(People.CONTENT_URI,真实,contentObserver)。
2。在我的研究,我没有找到任何code,将进入将提醒ContentObserver数据库类。是否所有的code为服务类中的内容观察员的工作?
请注意,这个问题类似于的Android的SQLite数据库通知并 怎么听的变化联系数据库 这两个问题都没有明确回答我的问题。如果你有code,解释这一点,那将是非常有益的。
下面是我的半pusedo code以下。这不可行。我用它来学习如何当数据库信息的变化更新服务。
包com.example.com.test.content.observer;
进口java.sql.Date;
进口的java.util.Calendar;
进口的java.util.List;
进口com.google.android.gcm.demo.app.Alerts.AlarmsService;
进口com.google.android.gcm.demo.app.Alerts.Alerts;
进口com.google.android.gcm.demo.app.sqllite.DatabaseSqlite;
进口android.os.Bundle;
进口android.os.Handler;
进口android.os.IBinder;
进口android.provider.Contacts.People;
进口android.annotation.Sup pressLint;
进口android.app.Activity;
进口android.app.AlarmManager;
进口android.app.PendingIntent;
进口android.content.Intent;
进口android.database.ContentObserver;
进口android.util.Log;
进口android.view.Menu;
进口android.view.MenuItem;
进口android.widget.Toast;
进口android.support.v4.app.NavUtils;
公共类AlarmService扩展服务
{
处理器mHandler =新的处理程序();
DatabaseSqlite DB =新DatabaseSqlite(本);
名单<通知> listAlerts;
PendingIntent pendingIntent;
@覆盖
公共无效的onCreate(包savedInstanceState){
super.onCreate(savedInstanceState);
的setContentView(R.layout.activity_main);
this.getApplicationContext()
.getContentResolver()
.registerContentObserver(?????,真实,
contentObserver);
}
公众诠释onStartCommand(意向意图,诠释标志,诠释startId){
Log.d(TAG,开始从创建警报服务的OnStart命令。);
返回super.onStartCommand(意向,标志,startId); // START_STICKY;
}
@覆盖
公共无效ONSTART(最终意图的意图,诠释startId){
super.onStart(意向,startId);
runThread();
}
@覆盖
公共无效的onDestroy(){
super.onDestroy();
Toast.makeText(本,服务破坏......,Toast.LENGTH_LONG).show();
}
@覆盖
公众的IBinder onBind(意向意图){
返回null;
}
私有类MyContentObserver扩展ContentObserver {
@燮pressLint(ParserError)
公共MyContentObserver(处理器mHandler){
超(mHandler);
}
@覆盖
公共无效的onChange(布尔selfChange){
runThread();
super.onChange(selfChange);
}
公共无效runThread(){
线程线程=新的Thread(){
@覆盖
公共无效的run(){
布尔X =真;
而(X){
db.open();
listAlerts = db.getAlarmsForService();
db.close();
诠释警报= listAlerts.size();
的for(int i = 0; I<警报;我++){
快讯项目= listAlerts.get(我);
item.getRowId();
item.getRemoteServerId();
串alertInMills = item.getAlertDateInMills();
串alertDuration = item.getAlertDurationInMinutes();
串eventName的= item.getEventName();
长longAlertInMills =的Long.parseLong(alertInMills);
pendingIntent = PendingIntent.getService(AlarmsService.this,0,意向,0);
AlarmManager alarmManager =(AlarmManager)getSystemService(ALARM_SERVICE);
台历挂历= Calendar.getInstance();
//到数据库的时间在造纸厂
calendar.setTimeInMillis(longAlertInMills);
alarmManager.set(AlarmManager.RTC_WAKEUP,calendar.getTimeInMillis(),
pendingIntent);
//
的System.out.println(calendar.toString());
}
//
的System.out.println(线);
X = FALSE;
}
}
};
thread.start();
}
}
MyContentObserver contentObserver =新MyContentObserver(mHandler);
。this.getContentResolver()registerContentObserver(People.CONTENT_URI,真实,contentObserver);
}
解决方案
在一般情况下,有两个部分来处理这样的:你有的 ContentObserver 这需要注册接收的变化,因为你已经指出的那样,和的 SQLiteDatabase 有通知任何更改注册的观察者。如果这是你自己的数据库,你可以创建URI,你可以用它来听。
(1)首先定义的URI,通常是在你的数据库定义文件。
公共静态最终乌里CONTENT_URI = Uri.parse(为myContent://软件包名/某事);
(2)为你的数据库内容供应商:
每个数据库功能(插入,更新,删除)应调用通过对有NotifyChange()
完成操作,以通知观察者的变化发生后。
ROWID = db.insert(tableName值,空,CV);
...
。的getContext()getContentResolver()有NotifyChange(newUri,空)。
(3)创建并注册自己的 ContentObserver 的服务,如您在上面提供href="http://stackoverflow.com/questions/1401280/how-to-listen-for-changes-in-contact-database">同一链路上的
上一篇:从上面的ListView和底部的android删除的影子?影子、ListView、android
下一篇:调用startActivity时DialogFragment崩溃活动()startActivity、DialogFragment