2012-06-18 3 views
1

У меня есть небольшая БД и прочитать необходимую выписку из данных в объекте Singleton хранится статический, как это в классе под названием MainDataManager:хранение данных, когда приложение «заканчивается»

public class MainDataManager { 
    private static Context context; 
    public static MainDataManager mainDataManager = null; 

    public static MainDataManager getInstance(Context ctx) { 
     context = ctx; 
     if (mainDataManager == null) { 
      ...get the data from DB 
      ...put the data in static mainDataManager variable 
      } 
     return mainDataManager; 
     } 

Теперь в каждом классе/деятельностях приложение я могу легко получить доступ к данным MainDataManager.mainDataManager.

В какой-то момент я хотел бы сохранить данные обратно в базу данных.

В настоящее время я делаю это на каждый вид деятельности в

@Override 
    protected void onPause() { 
    super.onPause(); 
    saveState(); //saves the mainDataManager's data to the DB 
    } 

Я хотел бы избежать этого и думаю, что это на самом деле «сохранить» достаточно, если я обновить базу данных только тогда, когда пользователь выходит из приложения (что бы это средство) - или даже лучше, когда Android хочет уничтожить объект MainDataManager.

Хотя я мог бы поместить свой saveState() вызов в действие в методе onDestroy() - я бы предпочел сохранить данные только в DB, ​​если объект MainDataManager будет уничтожен. Но для нормального объекта нет onDestroy().

Что было бы лучшим способом справиться с этим?

ps Причина, по которой я не хочу сохранятьState() в каждом действии onDestroy(), заключается в том, что сохранение в базе данных довольно медленно даже с очень маленькими данными (например, на старых телефонах Android!), И это просто не логика - только потому, что любая деятельность уничтожается, а затем обновляет БД.

Большое спасибо

ответ

1

Что бы лучший способ справиться с этим?

, как вы в настоящее время его обработки, хотя, возможно, используя AsyncTask из onPause(), и только от деятельности, где вы изменяющих данные, и, возможно, с помощью какого-то isDirty флага, чтобы вы знаете, если данные действительно необходимо сохраняться.

реальной причине вы не хотите ждать, пока onDestroy() является то, что onDestroy() не гарантируется называться.

Я бы предпочел сохранить данные только в DB, ​​если объект MainDataManager будет уничтожен.

Этот объект никогда не будет «разрушен» - он будет жить до тех пор, пока процесс не будет прерван.

+0

Еще раз спасибо :-). Хорошо, тогда я оставляю это так, как это указано, однако, как уже упоминалось, обновление даже самой маленькой БД происходит довольно медленно, возможно, «isDirty» -flag может сократить время, необходимое для обновления. Выполнение в AsyncTask - отличный выход - однако я не уверен, что порядок выполнения AsyncTasks на самом деле всегда правильный. Помимо незначительной проблемы обеспечения «синхронизированных» методов обновления. – user387184

+0

@ user387184: Доступ к SQLiteDatabase синхронизирован на уровне SQLiteDatabase, поэтому вам не нужно беспокоиться об этой конкретной проблеме. Вы также можете более активно хранить свои данные (например, на основе события пользовательского интерфейса), а не ждать, когда это необходимо. – CommonsWare

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