2012-03-18 41 views
2
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方法關閉數據庫。Android的 - 使用數據庫onRetainNonConfigurationInstance

我不明白,如果我在onDestroy中關閉數據庫,那麼我需要在某個地方重新打開它,但是這並沒有打敗首先堅持它的對象?

這是在用戶旋轉設備時重用數據庫的最佳方式嗎?

+1

您的數據庫作爲您的內部存儲中的文件存在 - 您爲什麼覺得需要「堅持下去」?如果'Activity'由於方向改變而被破壞,那麼它將被重新創建,'onCreate(...)'將簡單地調用你的getData()方法,然後再次創建'Cursor'。我不明白你想要做什麼。 – Squonk 2012-03-18 20:05:21

+0

我只想知道,如果每當用戶旋轉視圖時它能夠繼續關閉並打開數據庫,我認爲它可能是昂貴的,因此保持它並保持開放可能是一個好主意。 – Neil 2012-03-19 00:04:46

+0

也許我會想這個,我應該只是舉行列表視圖的數據源呢? – Neil 2012-03-19 00:05:46

回答

0

一般來說,不要擔心這個問題 - Android在做這類事情時確實非常高效。一切都必須從頭開始重新創建,所以在大多數情況下,就讓它發生。

與查詢相比,打開數據庫的成本最低,可能會返回大量結果。在說,這是Cursor的一點,因爲它旨在以有效的方式處理來自查詢的結果。

至於ListViews他們只曾經有在爲ListView滾動被回收和方向變化過程中的任何一個時間有限數量的「項目」,該ListView將需要與不同數量通常重新繪製可見列表項目。

使用onRetainNonConfigurationInstance()是爲更復雜的情景設計而設計的一種特殊情況 - 可能保留用戶正在使用的畫布或維持某種會話狀態(認證令牌等)的「實時」網絡連接。