Wszystkie przykłady, które widziałem podczas korzystania z registerContentObserver()
, czynią to poprzez interfejs ContentProvider
. Ale Cursor ma wywołanie registerContentObserver()
, więc doszedłem do wniosku, że może ludzie z Androidem stworzyli trochę głębokiej magii, która pozwoliłaby uzyskać aktualizacje na kursorze SQLite
, gdy zmieni się jeden z wierszy z aktywnego zestawu wyników. Albo robię to źle, albo nie ma takiej magii. Oto kod, nad którym pracuję, oczekując, że po kliknięciu przycisku, aby zaktualizować wartość w wierszu # 1, otrzymam wywołanie zwrotne onChange()
. Jakieś pomysły?registerContentObserver() na surowym SQLite Cursor
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
}
}
}
Hej człowieku, przyjęta odpowiedź jest błędna, wiem, że to twoja odpowiedź, ale nie jest właściwa. –