Las actualizaciones de la base de datos de Sqlite activan el servicio para actualizarse a través de Content Observer
Estoy tratando de usar un Content Observer para actualizar un Servicio cuando ocurre algún cambio en la base de datos sqlite en mi aplicación.
Estoy confundido en cuanto a qué hacer, así que armé un código a continuación. Por lo general, los Observadores de contenido se utilizan con contactos o mediaplayer con un servicio en segundo plano. En mi investigación, leí que se puede usar con la base de datos sqlite en el teléfono.
Preguntas: 1. Dado que la base de datos de Sqlite no tiene un uri, ¿qué información sustituyo?People.CONTENT_URI
en
this.getContentResolver().registerContentObserver (People.CONTENT_URI, true, contentObserver);
2. En mi investigación no encontré ningún código que entraría en la clase de base de datos que alertaría a ContentObserver. ¿Funciona todo el código para el observador de contenido dentro de la clase de servicio?
Tenga en cuenta que esta pregunta es similar aNotificaciones de Android SQLite DB yCómo escuchar los cambios en la base de datos de contactos. Ambas preguntas no responden explícitamente a mi pregunta. Si tiene un código que explica esto, sería muy útil.
Aquí está mi código de semi-pusedo abajo. No funciona. Lo estoy usando para aprender cómo actualizar un servicio cuando cambia la información de la base de datos.
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);
}