Android - использование базы данных с onRetainNonConfigurationInstance - PullRequest
2 голосов
/ 18 марта 2012
package com.commonsware.cwac.wakeful.demo;

import android.app.ListActivity;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.provider.BaseColumns;
import android.util.Log;
import android.widget.SimpleCursorAdapter;

public class FlightListActivity extends ListActivity {

private SQLiteDatabase database;
private String fields[] = {BaseColumns._ID, "name", "flights", "distance"};
private SimpleCursorAdapter dataSource;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    Log.v(ACTIVITY_SERVICE, "onCreate flights");
    database = (SQLiteDatabase) getLastNonConfigurationInstance();
    if (database == null) {
        database = getData();
        Log.v(ACTIVITY_SERVICE, "first load data");
    }

    Cursor data = database.query("pilots", fields, null, null, null, null, null);

    dataSource = new CustomCursorAdapter(this, R.layout.row, data, fields, new int[] { R.id.id, R.id.name, R.id.flights, R.id.distance });
    setListAdapter(dataSource);
}

protected SQLiteDatabase getData() {
    DataBaseHelper myDbHelper = new DataBaseHelper(this.getApplicationContext());
    return myDbHelper.openDataBase();
}

@Override
public Object onRetainNonConfigurationInstance() {
    Log.v(ACTIVITY_SERVICE, "reusing data");
    final SQLiteDatabase myData = database;
    return myData;
}

@Override
protected void onDestroy() {
    database.close();
    super.onDestroy();
}

}

Хорошо, поэтому я пытаюсь сохранить свою базу данных, сохранив ее в onRetainNonConfigurationInstance, но получаю ошибку времени выполнения, если не закрываю базу данных в методе onDestroy.

Что я не получу, если я закрою базу данных в onDestroy, то мне нужно будет снова открыть ее где-нибудь, но разве это не побеждает объект удержания в первую очередь?

Это лучший способ повторно использовать базу данных, когда пользователь поворачивает устройство?

1 Ответ

0 голосов
/ 19 марта 2012

В общем, не беспокойтесь об этом - Android на самом деле очень эффективен, когда дело доходит до такого рода вещей.Все должно быть воссоздано с нуля, поэтому в большинстве случаев просто позвольте этому случиться.

Открытие БД требует минимальных затрат по сравнению с запросом, который может вернуть огромное количество результатов.Говоря об этом, смысл Cursor в том, что он предназначен для эффективной обработки результатов запроса.

Что касается ListViews, то они имеют только конечное число «элементов».'в любой момент, которые перерабатываются при прокрутке ListView и во время изменения ориентации, ListView необходимо будет перерисовывать обычно с другим количеством видимых элементов списка.

ИспользованиеonRetainNonConfigurationInstance() - это особый случай, разработанный для более сложных сценариев - возможно, сохранить холст, на котором рисует пользователь, или «живые» сетевые подключения, которые поддерживают какое-то состояние сеанса (токены аутентификации и т. д.).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...