2016-05-03 10 views
0

アーキテクチャのヘルプが必要です。私はServiceActivityからなるアプリケーションを構築しています。 ServiceSQLite DBにデータを書き込み、Activityはそれを読み取り表示する必要があります。 2つの問題があります:1)Activityはオンザフライでアップデートを受け取るべきです。 2)Activityがバックグラウンドになると、フォアグラウンドを返すときにすべての変更がロードされます。データベースへのサービス書き込みとそのアクティビティの読み取り

2日間の研究の後、私はそれを実装する唯一の方法が中間層としてContentProviderを作成し、アクティビティでCursorLoaderを使用していると仮定します。私は正しい?その他の提案はありますか?どんな助けもありがとう。ありがとうございました。

答えて

1

もう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コールバックでアクティビティが死んでいないことを確認してください。

+0

onUpdate()がトリガされたときにどのようなメソッドを呼び出す必要がありますか?以前のLoaderを投げて新しいものを再起動する必要がありますか? –

+0

Loaderを使用している場合は、onStartLoading()のオブザーバと、onContentChanged()を呼び出すだけの変更済みテーブルがあることを確認した後でonUpdateコールバックを作成することをお勧めします。 –

+0

AsyncTaskLoaderも拡張することをお勧めします。 –

関連する問題