Android SQLite DB, объекты которой должны быть закрыты - PullRequest
3 голосов
/ 15 мая 2019

Я использую SQLite DB в своем приложении для Android.Я не уверен на 100%, какие объекты базы данных мне нужно закрыть, когда я закончу чтение / запись с БД:

Например, этот код:

public int getLocalSavedPartsAmount() {
    int partsAmount;
    PartsAppDbHelper dbHelper = new PartsAppDbHelper(context);
    SQLiteDatabase db = dbHelper.getReadableDatabase();

    String[] columns = {...};
    Cursor cursor = db.(...);
    partsAmount = cursor.getCount();

    //which one do I have to close here?
    cursor.close(); //1
    dbHelper.close(); //2
    db.close(); //3

    return partsAmount ;
}

Должен ли янужно закрыть 1, 2 и 3?Важно ли в каком порядке закрыться?

Ответы [ 2 ]

3 голосов
/ 15 мая 2019

Вы должны всегда закрывать Курсор, когда закончите с ним, Курсор также требует, чтобы База данных была открыта.

Вам вообще не нужно закрывать базу данных.

dbHelper.close закрывает базу данных.

Когда вы вызываете getWritableDatabase или getReabableDatabase (это обычно получает базу данных с возможностью записи в любом случае), она открывает базу данных и кэширует ее, поэтому, как правило, одно и то же открытие используется, пока вы не закроете Это.

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

Cusrors, каждый из которых имеет базовый файловый слот. Файловые слоты ограничены, используйте их все, и приложение упадет.

Итак

public int getLocalSavedPartsAmount() {
    int partsAmount;
    PartsAppDbHelper dbHelper = new PartsAppDbHelper(context);
    SQLiteDatabase db = dbHelper.getReadableDatabase();

    String[] columns = {...};
    Cursor cursor = db.(...);
    partsAmount = cursor.getCount();

    //which one do I have to close here?
    cursor.close(); //1
    return partsAmount ;
}

Было бы достаточно.

0 голосов
/ 15 мая 2019

Вам нужно закрыть курсор и соединение с базой данных, они очень важны.Потому что оба они вызывают проблемы с памятью в вашем приложении.

После завершения операции сначала необходимо закрыть курсор

if(cursor != null)
    {
        cursor.close();
    }

И закрыть соединение с базой данных,

if(db.isOpen())
    {
        db.close();
    }

Надеюсь, это поможет вам.

...