2016-05-03 3 views
0

Требуется помощь в архитектуре. Я создаю приложение, которое будет состоять из Service и Activity. Service будет записывать данные в SQLite DB и Activity следует прочитать и отобразить. Есть две проблемы: 1) Activity должен получать обновления «на лету». 2) Если Activity переходит в фоновый режим, он должен загружать все изменения, когда возвращается на переднем плане.Служба записи в базу данных и активность читает от нее

После двухдневного исследования я предполагаю, что единственным способом его реализации является создание ContentProvider в качестве среднего слоя и использование CursorLoader в действии. Я прав? Любые другие предложения? Любая помощь будет оценена по достоинству. Спасибо.

ответ

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) после изменения базы данных.

Теперь любой компонент может подписаться на эту вспомогательную базу данных для обновления. Убедитесь, что активность не отключена в обратном вызове onUpdate, прежде чем пытаться обновить интерфейс.

+0

Какой метод следует использовать при вызове onUpdate()? должен ли я бросать предыдущий загрузчик и перезапускать новый? –

+0

Если вы используете Loader, я предлагаю сделать загрузчик наблюдателем в onStartLoading() и в обратном вызове onUpdate после проверки того, что измененная таблица представляет интерес, вы просто вызываете onContentChanged() –

+0

Я также предлагаю расширить AsyncTaskLoader. –

 Смежные вопросы

  • Нет связанных вопросов^_^