gpt4 book ai didi

Android - 将数据库与 onRetainNonConfigurationInstance 一起使用

转载 作者:行者123 更新时间:2023-11-29 14:00:21 26 4
gpt4 key购买 nike

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 中关闭了数据库,那么我需要在某个地方再次重新打开它,但这不是破坏了最初坚持它的目的吗?

这是在用户旋转设备时重用数据库的最佳方式吗?

最佳答案

一般来说,不用担心这些事情 - Android 在执行此类事情时实际上非常高效。一切都必须从头开始重新创建,因此在大多数情况下,顺其自然。

与可能返回大量结果的查询相比,打开数据库的成本最低。也就是说,这就是 Cursor 的意义所在,因为它旨在以高效的方式处理查询结果。

至于 ListViews 它们在任何时候都只有有限数量的“项目”,这些项目在 ListView 滚动和方向更改期间被回收, ListView 通常需要使用不同数量的可见列表项重新绘制。

onRetainNonConfigurationInstance() 的使用是为更复杂的场景设计的特殊情况 - 可能保留用户正在绘制的 Canvas ,或者保持某种 session 状态的“实时”网络连接(身份验证 token 等)。

关于Android - 将数据库与 onRetainNonConfigurationInstance 一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9761753/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com