簡體   English   中英

Android-將數據庫與onRetainNonConfigurationInstance一起使用

[英]Android - using database with onRetainNonConfigurationInstance

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()的使用是為更復雜的場景設計的一種特殊情況-可能保留用戶正在繪制的畫布,或者保持某些會話狀態(身份驗證令牌等)的“實時”網絡連接。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM