もう1つの方法は、独自のオブザーバーパターンの実装です。
オブザーバー
/**
* Receives notification of updates on database contents.
*/
public interface DatabaseObserver {
/**
* This method is called if the observable database's notifyObservers
* method is called (because the observable database has been updated.
*/
void onUpdate(String tableName);
}
観測可能
/**
* Used to notify a group of Observer objects when a change occurs.
*/
public interface ObservableDatabase {
/**
* Adds the specified observer to the list of observers.
*/
void addObserver(DatabaseObserver observer);
/**
* Removes the specified observer from the list of observers.
*/
void removeObserver(DatabaseObserver observer);
}
データベースヘルパー
public class DatabaseHelper extends SQLiteOpenHelper implements ObservableDatabase {
private static DatabaseHelper sInstance;
private CopyOnWriteArrayList<DatabaseObserver> mObservers = new CopyOnWriteArrayList<>();
/**
* Returns the single instance of Database helper
*/
public static synchronized DatabaseHelper getInstance(Context context) {
if (sInstance == null) {
sInstance = new DatabaseHelper(context.getApplicationContext());
}
return sInstance;
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(CREATE_STATEMENT);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL(DROP_STATEMENT);
onCreate(db);
}
/**
* Adds the specified observer to the list of observers.
*/
public void addObserver(DatabaseObserver observer) {
mObservers.addIfAbsent(observer);
}
/**
* Removes the specified observer from the list of observers.
*/
public void removeObserver(DatabaseObserver observer) {
mObservers.remove(observer);
}
private DatabaseHelper(Context context) {
super(context, DB_NAME, null, BuildConfig.VERSION_CODE);
}
private void notifyObservers(String tableName) {
for (DatabaseObserver observer: mObservers) {
observer.onUpdate(tableName);
}
}
}
:ここに私のバージョンです。データベースヘルパーの各書き込みメソッドは、データベースを変更した後にnotifyObservers(tableName)を呼び出す必要があることに注意してください。
ここで、どのコンポーネントもこのデータベースヘルパーに登録して更新することができます。また、UIを更新する前に、onUpdateコールバックでアクティビティが死んでいないことを確認してください。
onUpdate()がトリガされたときにどのようなメソッドを呼び出す必要がありますか?以前のLoaderを投げて新しいものを再起動する必要がありますか? –
Loaderを使用している場合は、onStartLoading()のオブザーバと、onContentChanged()を呼び出すだけの変更済みテーブルがあることを確認した後でonUpdateコールバックを作成することをお勧めします。 –
AsyncTaskLoaderも拡張することをお勧めします。 –