2012-03-18 5 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でそれを格納することによって、自分のデータベースを保持しようとしていますので、[OK]をクリックしてデータベースを使用して、私はonDestroyメソッドでデータベースを閉じていない場合、私は、実行時エラーが発生します。アンドロイド - onRetainNonConfigurationInstance

私はそれを得ることはできませんが、私はonDestroyでデータベースを閉じると、どこかで再び開く必要がありますが、最初にそれを保持するオブジェクトを倒すことはありませんか?

これは、ユーザーがデバイスを回転させたときにデータベースを再利用する最もよい方法ですか?

+1

あなたのデータベースは内部ストレージにファイルとして存在しますが、なぜそれを保持する必要があると感じますか?方向変更の結果として 'Activity'が破壊された場合、それは再作成され、' onCreate(...) 'は単に' getData() 'メソッドを呼び出し、' Cursor'が再び作成されます。私はあなたがしようとしていることを理解していません。 – Squonk

+0

私は、ユーザーがビューを回転するたびにデータベースを閉じたままにしておくことが大丈夫かどうかを知りたいだけです。私はそれがコストがかかるかもしれないと思っていました。 – Neil

+0

私はこれを考えていますが、代わりにlistSourceのdataSourceを保持するだけですか? – Neil

答えて

0

一般的に、このようなことについては心配しないでください。Androidは実際にはこの種のことを行う際には非常に効率的です。すべてをゼロから再作成する必要があります。ほとんどの場合、ただそのようにしましょう。

DBを開くと、膨大な数の結果を返す可能性のあるクエリと比較して、コストが最小限に抑えられます。それは効率的な方法でクエリからの結果を扱うように設計されている点で、それはCursorのポイントです。

彼らは今までListViewとしてリサイクルされているいずれかの時点で「項目」の有限数がスクロールされていると姿勢変更時に、ListViewは異なる番号で、通常は再描画する必要があります。ListViewsについて目に見えるリスト項目の

onRetainNonConfigurationInstance()の使用は、より複雑なシーンアリアスのために設計された特別なケースです。ユーザーが描いているキャンバスや、セッション状態(認証トークンなど)を維持している「ライブ」ネットワーク接続を保持しています。

関連する問題