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中关闭数据库,那么我需要在某个地方再次重新打开它,但是这不是首先打败了坚持它的对象吗?
这是用户旋转设备时重用数据库的最佳方法吗?
答案 0 :(得分:0)
一般情况下,不要担心这个问题 - 在执行此类操作时,Android实际上非常有效。一切都必须从头开始重新创建,所以在大多数情况下,只要让它发生。
与可能返回大量结果的查询相比,打开数据库的成本最低。在说这是Cursor
的重点,因为它旨在以有效的方式处理查询的结果。
至于ListViews
,他们在任何时候都只有有限数量的“项目”,在ListView
滚动时会被回收,而在定位更改期间,ListView
会需要通常使用不同数量的可见列表项重新绘制。
onRetainNonConfigurationInstance()
的使用是为更复杂的场景设计的特殊情况 - 可能保留用户正在使用的画布,或者保持某种会话状态的“实时”网络连接(身份验证令牌等)