我正在尝试使用内容观察器在我的应用程序中的sqlite数据库发生任何更改时更新服务.
我很困惑该怎么做,所以我把下面的代码放在一起.通常,内容观察者与联系人或媒体播放器一起使用后台服务.在我的研究中,我读到它可以与手机上的sqlite数据库一起使用.
问题:
1.由于sqlite数据库没有uri,我将用什么信息替换People.CONTENT_URI
this.getContentResolver().registerContentObserver (People.CONTENT_URI,true,contentObserver);
2.在我的研究中,我没有发现任何会进入数据库类的代码会提醒ContentObserver. Content Observer的所有代码都在服务类中工作吗?
请注意,此问题类似于Android SQLite DB notifications和
how to listen for changes in Contact Database
这两个问题都没有明确回答我的问题.如果您有解释此问题的代码,那将非常有帮助.
这是我下面的半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
public static final Uri CONTENT_URI = Uri.parse("mycontent://packagename/something");
(2)为您的数据库Content Provider:
每个db函数(插入,更新,删除)都应在完成操作后调用notifyChange(),以通知观察者发生了更改.
rowId = db.insert(tableName,null,cv);
...
getContext().getContentResolver().notifyChange(newUri,null);
(3)在服务中创建并注册ContentObserver,如same link you provided above所述(记得覆盖deliverSelfNotifications()以返回true)
public class MyService extends Service {
private MyContentObserver mObserver;
@Override
public void onStartCommand(Intent intent,int startId) {
...
mObserver = new MyContentObserver();
getContentResolver().registerContentObserver(Dbfile.CONTENT_URI,mObserver);
}
@Override
public void onDestroy() {
...
if (mObserver != null) {
getContentResolver().unregisterContentObserver(mObserver);
mObserver = null;
}
}
// define MyContentObserver here
}
(4)在您的ContentObserver.onChange()中,您可以向服务发布内容或尽可能处理更改.
此外,如果它有助于您的原因,您可以自定义URI定义以处理您正在观察的不同类型的数据,为每个URI注册观察者,然后重写ContentObserver.onChange(boolean,Uri).
希望这可以帮助!