Все примеры, которые я видел при использовании registerContentObserver()
, делают это через интерфейс ContentProvider
. Но курсор имеет вызов registerContentObserver()
, поэтому я подумал, что, возможно, люди Android собрали некоторую глубокую магию, которая позволила бы получать обновления курсора SQLite
, когда одна из строк из активного набора результатов изменилась. Либо я делаю это неправильно, либо нет такой магии. Здесь код, с которым я работаю, ожидание заключается в том, что, когда я нажимаю кнопку, чтобы обновить значение в строке №1, я получаю обратный вызов onChange()
. Любые идеи?
public class MainActivity extends Activity {
private static final String DATABASE_NAME = "test.db";
public static final String TAG = "dbtest";
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Button make = (Button)findViewById(R.id.btn_make_record);
make.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
MyOpenHelper oh = new MyOpenHelper(v.getContext());
SQLiteDatabase wdb = oh.getWritableDatabase();
ContentValues cv = new ContentValues();
cv.put("value", String.valueOf(System.currentTimeMillis()));
if (wdb.insert(MyOpenHelper.TABLE_NAME, null, cv) == -1) {
Log.d(TAG, "Unable to insert row");
} else {
Log.d(TAG, "Inserted row ");
}
wdb.close();
}
});
Button update = (Button)findViewById(R.id.btn_update_record);
update.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
MyOpenHelper oh = new MyOpenHelper(v.getContext());
SQLiteDatabase wdb = oh.getWritableDatabase();
ContentValues cv = new ContentValues();
cv.put("value", String.valueOf(System.currentTimeMillis()));
int count = wdb.update(MyOpenHelper.TABLE_NAME, cv, "_id = ?", new String[] {"1"});
Log.d(TAG, "Updated " + count + " row(s)");
wdb.close();
}
});
MyOpenHelper oh = new MyOpenHelper(this);
SQLiteDatabase rdb = oh.getReadableDatabase();
Cursor c = rdb.query(MyOpenHelper.TABLE_NAME, null, "_id = ?", new String[] {"1"}, null, null, null);
startManagingCursor(c);
contentObserver = new MyContentObserver(new Handler());
c.registerContentObserver(contentObserver);
}
private class MyContentObserver extends ContentObserver {
MyContentObserver(Handler handler) {
super(handler);
}
public boolean deliverSelfNotifications() {
return true;
}
public void onChange(boolean selfChange) {
super.onChange(selfChange);
Log.d(TAG, "Saw a change in row # 1");
}
}
MyContentObserver contentObserver;
public class MyOpenHelper extends SQLiteOpenHelper {
private static final int DATABASE_VERSION = 1;
private static final String TABLE_NAME = "test";
private static final String TABLE_CREATE =
"CREATE TABLE " + TABLE_NAME + " (" +
"_id INTEGER PRIMARY KEY AUTOINCREMENT," +
"value TEXT);";
MyOpenHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(TABLE_CREATE);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// TODO Auto-generated method stub
}
}
}