Close () никогда не вызывался явно для базы данных в Android - PullRequest
0 голосов
/ 19 января 2012

Я попробовал этот код на DatabaseHelper.java

Номер строки 34

public DatabaseHelper(Context context) throws IOException {
    super(context, DB_NAME, null, 1);
    this.mycontext = context;
    boolean dbexist = checkdatabase();
    if (dbexist) {
        // System.out.println("Database exists");
        opendatabase();
    } else {
        // System.out.println("Database doesn't exist");
        createdatabase();
    }
}

Номер строки 64

private boolean checkdatabase() {
    // SQLiteDatabase checkdb = null;
    boolean checkdb = false;
    try {
        String myPath = DB_PATH + DB_NAME;
        File dbfile = new File(myPath);
        checkdb = SQLiteDatabase.openDatabase(myPath, null,
                SQLiteDatabase.OPEN_READWRITE) != null;
        checkdb = dbfile.exists();
    } catch (SQLiteException e) {
        System.out.println("Database doesn't exist");
    }

    return checkdb;
}

Номер строки 44

При создании метода menu.java

try {
        db = new DatabaseHelper(this);
    } catch (IOException e2) {

        e2.printStackTrace();
    }

    try {
        db.createdatabase();
    } catch (IOException e) {

        e.printStackTrace();
    }
     db.getReadableDatabase();

    db.opendatabase();
    Random rand = new Random();
    randomJokId = rand.nextInt(603 - 1) + 1;
    cur = db.jokOfTheDay(randomJokId);
    cur.moveToFirst();
    String fullJok = cur.getString(cur.getColumnIndex("body"));
    String Jok = "";
    Jok = fullJok.substring(0, 55);
    jok_of_the_day.setText(Jok + "...  Read more");

    Log.d(TAG, "" + randomJokId);
}

Получение этого сообщения об ошибке

Еще одна важная вещь, у меня это сообщение об ошибке появляется три раза .

01-19 13:49:41.284: ERROR/Database(10932): close() was never explicitly called on database '/data/data/com.horror.android/databases/jokesdatabase.sql' 
01-19 13:49:41.284: ERROR/Database(10932): android.database.sqlite.DatabaseObjectNotClosedException: Application did not close the cursor or database object that was opened here
01-19 13:49:41.284: ERROR/Database(10932):     at android.database.sqlite.SQLiteDatabase.<init>(SQLiteDatabase.java:1847)
01-19 13:49:41.284: ERROR/Database(10932):     at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:820)
01-19 13:49:41.284: ERROR/Database(10932):     at com.horror.android.DatabaseHelper.checkdatabase(DatabaseHelper.java:64)
01-19 13:49:41.284: ERROR/Database(10932):     at com.horror.android.DatabaseHelper.createdatabase(DatabaseHelper.java:45)
01-19 13:49:41.284: ERROR/Database(10932):     at com.horror.android.UltimateJokesMenu.onCreate(UltimateJokesMenu.java:51)
01-19 13:49:41.284: ERROR/Database(10932):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
01-19 13:49:41.284: ERROR/Database(10932):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1611)
01-19 13:49:41.284: ERROR/Database(10932):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1663)
01-19 13:49:41.284: ERROR/Database(10932):     at android.app.ActivityThread.access$1500(ActivityThread.java:117)
01-19 13:49:41.284: ERROR/Database(10932):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:931)
01-19 13:49:41.284: ERROR/Database(10932):     at android.os.Handler.dispatchMessage(Handler.java:99)
01-19 13:49:41.284: ERROR/Database(10932):     at android.os.Looper.loop(Looper.java:130)
01-19 13:49:41.284: ERROR/Database(10932):     at android.app.ActivityThread.main(ActivityThread.java:3683)
01-19 13:49:41.284: ERROR/Database(10932):     at java.lang.reflect.Method.invokeNative(Native Method)
01-19 13:49:41.284: ERROR/Database(10932):     at java.lang.reflect.Method.invoke(Method.java:507)
01-19 13:49:41.284: ERROR/Database(10932):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
01-19 13:49:41.284: ERROR/Database(10932):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
01-19 13:49:41.284: ERROR/Database(10932):     at dalvik.system.NativeStart.main(Native Method)

Ответы [ 5 ]

1 голос
/ 19 января 2012

Когда использование базы данных закончилось, лучше использовать SQLiteDatabase.close() .Закройте курсор также cursor.close();

Для курсора используйте startmanagincursor (курсор). Просто после присвоения ему некоторого значения

И помните, что если вы не закрываете базу данных, это может создать серьезную проблему

0 голосов
/ 12 декабря 2012

Закрытие в onPause достаточно, поскольку оно предшествует onStop в жизненном цикле действий . Использование startManagingCursor помимо того, что оно устарело, может привести к проблемам обработки случаев обновления представления. Я вижу две проблемы для оценки:

  • Закрытие базы данных. Достаточно следовать ответу, приведенному здесь Ошибка Android - метод close () никогда не вызывался явно для базы данных , то есть:

    Буквально понимают, что база данных обычно не закрыта, фактическая потому что повторная инстанцирование вашей базы данных, или подключение вы настрои, а ты и попробуй открыть другое соединение не будет исключение. Таким образом, решение, убедитесь, что вы открываете только подключение.

    Одним словом: каждый раз, когда вы открываете соединение БД, закрывайте его. Это может быть реализовано, гарантируя, что есть только одно соединение, вы можете, например, использовать метод isOpen или гарантировать, что при каждом открытии оно закрывается.

  • Закрытие курсоров, как я уже сказал перед использованием startManagingCursor, не очень хорошая идея. Вместо этого вам следует использовать библиотеку поддержки и использовать подход CursorLoader, который включает использование ContentProvider, но если вы считаете, что это излишнее количество, вы можете прочитать о использовании CursorLoader без ContentProvider

0 голосов
/ 19 января 2012

Закройте базу данных по методу onStop() и используйте startmanagingcursor() со всеми вашими курсорами для автоматической обработки его жизненного цикла.

0 голосов
/ 19 января 2012

используйте db.close(); для закрытия базы данных и cur.close(); для закрытия курсора после окончания работы с ними.

0 голосов
/ 19 января 2012

Попробуйте позвонить SQLiteDatabase.close() в конце вашего try в методе checkDatabase.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...