Android onUpgrade () не работает, потому что база данных заблокирована, что мне делать по-другому? - PullRequest
1 голос
/ 02 марта 2012

У меня есть проект с набором классов, которые отвечают за соответствующие им таблицы базы данных.

Каждый класс управления таблицами содержит методы CRUD, которые следуют шаблону получения соединения, запуска операции crud, закрытия соединения:

public class PersonManager {

    SQLiteDatabase db;
    DbAdapter dbAdapter; //This is a subclass of SQLiteOpenHelper

    public void addPerson(Person person)
    {
        ContentValues contentValues = new ContentValues();
        contentValues.put("email", person.email);
        contentValues.put("first_name", person.firstName);

        db = dbAdapter.getWritableDatabase();
        db.insert("person", null, contentValues);
        db.close();
    }

    ...other crud/utility methods omitted...
}

Теперь, когда я обновляю свою базу данных с помощью onUpgrade (), у меня возникают проблемы с заблокированными базами данных.

Далее следует точное сообщение об ошибке:

CREATE TABLE android_metadata failed
Failed to setLocale() when constructing, closing the database
android.database.sqlite.SQLiteException: database is locked

Похоже, что onUpgrade предназначен для:

1 run db.execSQL() calls or
2 use helper classes that use onUpgrade()'s SQLiteDatabase rather than their own

Было бы намного проще использовать классы управления моей таблицей для переноса данных в onUpgrade (), чем в db.execSQL (), или переписать все мои методы CRUD, чтобы использовать SQLiteDatabase onUpgrade ().

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

Спасибо!

Ответы [ 2 ]

3 голосов
/ 18 марта 2015

Вот ваша проблема:

db = dbAdapter.getWritableDatabase();

Когда вы в onUpgrade (), вы должны использовать дескриптор SQLiteDatabase, который вам предоставляет onUpgrade (). Итак, ваше решение - переписать функцию addPerson, чтобы получить еще один аргумент - дескриптор базы данных SQLite:

public void addPerson(Person person, SQLiteDatabase db) {...}

Если вам нужно вызвать addPerson () из другого места в вашем проекте, то сохраните текущую функцию addPerson (Person person), сделайте это db = dbAdapter.getWritableDatabase () вызовите и передайте db вашей версии addPerson () с двумя аргументами.

1 голос
/ 22 июня 2012

Я не получил ни одного ответа, поэтому я спросил о видеовстрече.

По словам команды разработчиков Android Developer Hangup, onUpgrade предназначен только для структурных изменений, а не для миграции / манипулирования данными.

...