Leo*_*eoa 5 sqlite service android contentobserver
我正在尝试使用内容观察器在我的应用程序中的sqlite数据库发生任何更改时更新服务.
我很困惑该怎么做,所以我把下面的代码放在一起.通常,内容观察者与联系人或媒体播放器一起使用后台服务.在我的研究中,我读到它可以与手机上的sqlite数据库一起使用.
问题:1.由于SQLite数据库没有一个URI,我更换了什么信息People.CONTENT_URI在
this.getContentResolver().registerContentObserver (People.CONTENT_URI, true, contentObserver);
Run Code Online (Sandbox Code Playgroud)
2.在我的研究中,我没有发现任何会进入数据库类的代码会提醒ContentObserver.Content Observer的所有代码都在服务类中工作吗?
请注意,此问题类似于Android SQLite数据库通知以及 如何监听联系人数据库中的更改 这两个问题都没有明确回答我的问题.如果您有解释此问题的代码,那将非常有帮助.
这是我下面的半pusedo代码.这是行不通的.我正在使用它来了解如何在数据库信息更改时更新服务.
package com.example.com.test.content.observer;
import java.sql.Date;
import java.util.Calendar;
import java.util.List;
import com.google.android.gcm.demo.app.Alerts.AlarmsService;
import com.google.android.gcm.demo.app.Alerts.Alerts;
import com.google.android.gcm.demo.app.sqllite.DatabaseSqlite;
import android.os.Bundle;
import android.os.Handler;
import android.os.IBinder;
import android.provider.Contacts.People;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.app.AlarmManager;
import android.app.PendingIntent;
import android.content.Intent;
import android.database.ContentObserver;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.Toast;
import android.support.v4.app.NavUtils;
public class AlarmService extends Service
{
Handler mHandler = new Handler();
DatabaseSqlite db = new DatabaseSqlite(this);
List<Alerts> listAlerts;
PendingIntent pendingIntent;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
this.getApplicationContext()
.getContentResolver()
.registerContentObserver(?????, true,
contentObserver);
}
public int onStartCommand(Intent intent, int flags, int startId) {
Log.d("TAG", "started onstart command Created from Alerts service .");
return super.onStartCommand(intent, flags, startId);// START_STICKY;
}
@Override
public void onStart(final Intent intent, int startId) {
super.onStart(intent, startId);
runThread();
}
@Override
public void onDestroy() {
super.onDestroy();
Toast.makeText(this, "Service destroyed...", Toast.LENGTH_LONG).show();
}
@Override
public IBinder onBind(Intent intent) {
return null;
}
private class MyContentObserver extends ContentObserver {
@SuppressLint("ParserError")
public MyContentObserver(Handler mHandler) {
super(mHandler);
}
@Override
public void onChange(boolean selfChange) {
runThread();
super.onChange(selfChange);
}
public void runThread(){
Thread thread = new Thread() {
@Override
public void run() {
Boolean x = true;
while (x) {
db.open();
listAlerts = db.getAlarmsForService();
db.close();
int alerts=listAlerts.size();
for (int i = 0; i < alerts; i++) {
Alerts item = listAlerts.get(i);
item.getRowId();
item.getRemoteServerId();
String alertInMills = item.getAlertDateInMills();
String alertDuration = item.getAlertDurationInMinutes();
String eventName = item.getEventName();
long longAlertInMills = Long.parseLong(alertInMills);
pendingIntent = PendingIntent.getService(AlarmsService.this, 0,intent, 0);
AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);
Calendar calendar = Calendar.getInstance();
// go to data base for time in mills
calendar.setTimeInMillis(longAlertInMills);
alarmManager.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(),
pendingIntent);
//
System.out.println(calendar.toString());
}
//
System.out.println("thread");
x = false;
}
}
};
thread.start();
}
}
MyContentObserver contentObserver = new MyContentObserver(mHandler);
this.getContentResolver().registerContentObserver (People.CONTENT_URI, true, contentObserver);
}
Run Code Online (Sandbox Code Playgroud)
一般来说,有两个部分来处理这个问题:正如您所指出的,ContentObserver需要注册以接收更改,而SQLiteDatabase必须将任何更改通知注册的观察者。如果这是您拥有的数据库,您可以创建可用于侦听的 URI。
(1) 首先定义您的 URI,通常在数据库定义文件中。
public static final Uri CONTENT_URI = Uri.parse("mycontent://packagename/something");
Run Code Online (Sandbox Code Playgroud)
(2) 对于您的数据库Content Provider:
每个数据库函数(插入、更新、删除)应该在完成操作后调用 to notifyChange(),以便通知观察者发生了更改。
rowId = db.insert(tableName, null, cv);
...
getContext().getContentResolver().notifyChange(newUri, null);
Run Code Online (Sandbox Code Playgroud)
(3)在服务中创建并注册您的ContentObserver ,如您在上面提供的同一链接中所述(请记住覆盖deliverSelfNotifications()以返回 true)
public class MyService extends Service {
private MyContentObserver mObserver;
@Override
public void onStartCommand(Intent intent, int flags, int startId) {
...
mObserver = new MyContentObserver();
getContentResolver().registerContentObserver(Dbfile.CONTENT_URI, null, mObserver);
}
@Override
public void onDestroy() {
...
if (mObserver != null) {
getContentResolver().unregisterContentObserver(mObserver);
mObserver = null;
}
}
// define MyContentObserver here
}
Run Code Online (Sandbox Code Playgroud)
(4) 在您的 中ContentObserver.onChange(),您可以在服务中发布内容或在可能的情况下处理更改。
另外,如果它对您的事业有帮助,您可以自定义 URI 定义来处理您正在观察的不同类型的数据,为每个 URI 注册观察者,然后重写ContentObserver.onChange(boolean, Uri)。
希望这可以帮助!
| 归档时间: |
|
| 查看次数: |
4490 次 |
| 最近记录: |