1

この平和なコードの問題点を指摘していただけませんか。ジャンルカーソルには、「アプリケーションは、ここで開かれたカーソルまたはデータベースオブジェクトを閉じませんでした」という例外が含まれています。挿入後にこのカーソルを実際に閉じるにはどうすればよいですか? ありがとう。

UPD: まったく問題がなかったようです。データを抽出できる例外が含まれていますが。私は実際のアプリケーションで間違っていたに違いありません。この例外により、それが問題だったという結論に達しました。参加してくれてありがとう。

public class DatabaseCursorActivity extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        HashMap<Integer, String> _dummy = new HashMap<Integer, String>();

        OpenDatabaseHelper helper = new OpenDatabaseHelper(this);
        SQLiteDatabase db = helper.getWritableDatabase();
        ContentValues values = new ContentValues();
        values.put(OpenDatabaseHelper.GENRES_ID_KEY, 1);
        values.put(OpenDatabaseHelper.GENRES_TITLE_KEY, "Test");
        db.insert(OpenDatabaseHelper.GENRES_TABLE_NAME, null, values);
        db.close();
        helper.close();

        db = helper.getReadableDatabase();
        Cursor genresCursor = db.query(OpenDatabaseHelper.GENRES_TABLE_NAME, new String[]{OpenDatabaseHelper.GENRES_ID_KEY, OpenDatabaseHelper.GENRES_TITLE_KEY }, null, null, null, null, null);
        int i = genresCursor.getColumnCount();
        genresCursor.moveToFirst();
    }

    public class OpenDatabaseHelper extends SQLiteOpenHelper {

        public static final String GENRES_TABLE_NAME = "genres";
        public static final String GENRES_ID_KEY = "id";
        public static final String GENRES_TITLE_KEY = "title";

        public OpenDatabaseHelper(Context context) {
            super(context, "ttt.db", null, 1);
        }

        @Override
        public void onCreate(SQLiteDatabase db) {
            db.execSQL("CREATE TABLE " + GENRES_TABLE_NAME + "( id integer primary key not null, title text);" );
        }

        @Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

        }

    }

}
4

3 に答える 3

0

カーソルとデータベースを操作するためのベスト プラクティスは、同じコード ブロックで開いて閉じることです。データベースに行を挿入するために使用するときは、最初にデータベースを開いてから、多くの列を挿入し、戻る直前に閉じます。

API before Honeycomb では、閉じられていないカーソルに関するログ メッセージとパフォーマンスの問題は発生しませんが、API before Honeycomb には、カーソルが閉じられていないというメッセージをログに記録する Cursor not closed 検出機能があります。

編集:同じコードブロック内でデータベースを閉じます。カーソルはシナリオに従って閉じることができますが、コンテキストの削除の前に閉じる必要があります。

于 2014-06-03T17:49:42.437 に答える
0

このコードを挿入する理由がわかりません:

db = helper.getReadableDatabase();
Cursor genresCursor = db.query(OpenDatabaseHelper.GENRES_TABLE_NAME, new String[]{OpenDatabaseHelper.GENRES_ID_KEY, OpenDatabaseHelper.GENRES_TITLE_KEY }, null, null, null, null, null);
int i = genresCursor.getColumnCount();
genresCursor.moveToFirst();

問題はコードのこの部分にあります。カーソルを閉じたいだけの場合は、 を呼び出しますgenresCursor.close()。しかし、アーキテクチャの観点からは、なぜこのコードが必要なのかわかりません。

于 2012-05-23T11:20:34.223 に答える
0

最初にデータベースを開き、挿入後にデータベースを閉じてから、再度開いて値を読み取ります。

最初に、閉じて再度開く必要はありません。すべての操作を実行して、同じコードブロックにいるので閉じることができます。

操作を行った後、genlesCursor を行った後、genlesCursor.close() で閉じてから、db を閉じます。うまくいくことを願っています。

于 2012-05-23T09:00:31.220 に答える