15

最初に、私が間違っていたら訂正してください。しかし、データベース接続を閉じると、そこから取得した Cursor を使用できなくなりますよね?

db.open();
Cursor c = db.query(true, "MyTable", columns, null, null, null, null, null, null);
db.close();

// The Cursor is empty now because the db was closed...
c.moveToNext();
Log.v(TAG, c.toString(0));

データベースを閉じた後にカーソルを使用する方法はありますか? それを他の場所に渡して、オブジェクトのように使用する方法はありますか? または、カーソルの操作が完了するまで、常にデータベース接続を開いたままにしておく必要がありますか?

4

3 に答える 3

11

いいえ、下のリンクにあるように、データベースを閉じるとカーソルが無効になります。

データベースが閉じられた後、カーソルはまだ生きていますか?

于 2011-11-01T21:42:48.527 に答える
3

最初に、私が間違っていたら訂正してください。しかし、データベース接続を閉じると、そこから取得した Cursor を使用できなくなりますよね?

正しい。

データベースを閉じた後にカーソルを使用する方法はありますか?

私はそうは思わない。カーソルを別の Cursor オブジェクトに渡したとしても、Cursor を使い終わったら、常にデータベースを閉じていました。

それを他の場所に渡して、オブジェクトのように使用する方法はありますか?

メソッドを作成しreturn cursorobject;、必要な場所でメソッドを使用します。(完了後にdbを閉じるメソッドも作成します)

または、カーソルの操作が完了するまで、常にデータベース接続を開いたままにしておく必要がありますか?

そうしないと、カーソルが台無しになります。

于 2011-11-01T21:45:18.650 に答える
0

を使用cursor.moveToLast()しましたが、データベースを閉じた後の反復にカーソルを使用できました。これが意図的なものかどうかはわかりません。

ただし、オープン ヘルパー フレームワークの使用目的は、アクティビティの開始時にデータベースを開き、アクティビティが破棄されたときにデータベースを閉じることです。

onCreate() 内からの AsyncTask で...

new StartupTask().execute();

以下の AsyncTask Thread.sleep() は、ダイアログが機能するのを確認できるように、ダイアログを表示するのに十分な時間を与えるためのものです。もちろん、遊び終わったら外してください。;)

private class StartupTask extends AsyncTask
{

    private ProgressDialog progressDialog;

    @Override
    protected Object doInBackground(final Object... objects)
    {
        openHelperRef.getWritableDatabase();
        try
        {
            Thread.sleep(5000);
        }
        catch (InterruptedException e)
        {
            e.printStackTrace();
        }
        return null;
    }

    @Override
    protected void onPreExecute()
    {
        super.onPreExecute();
        runOnUiThread(new Runnable()
        {
            public void run()
            {
                progressDialog = ProgressDialog.show(
                    MyActivity.this, "Title",
                    "Opening/Upgrading the database, please wait", true);
            }
        });
    }

    @Override
    protected void onPostExecute(Object object)
    {
        super.onPostExecute(object);
        progressDialog.dismiss();
    }

}

onDestroy() で... openHelper.close();

そうしないと、android SimpleCursorAdapter などを使用できなくなります。もちろん、この点に関しては、andriod のドキュメントは非常に不足しています。ただし、 getWriteableDatabase() は、閉じない限り、常に同じキャッシュされた参照を毎回返すことに注意してください。そのため、同じデータベースを使用しているバックグラウンド スレッドなどの参照を勝手に閉じると、死んでしまいます。

于 2011-11-11T05:08:48.633 に答える