В Android это правильный способ установки помощников SQLiteDatabase? - PullRequest
0 голосов
/ 02 марта 2012

Исключение:

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

Мое приложение работает нормально и не имеет проблем с БД, кроме случаев, когда вызывается onUpgrade ().

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

Поскольку это кажется нормальным делом, кажется, что я не должен правильно структурировать следующий код (следуют два класса, помощник и менеджер таблиц).):

public class DbHelper extends SQLiteOpenHelper {

    private Context context;

    //Required constructor
    public DbAdapter(Context context)
    {
        super(context, "my_db_name", null, NEWER_DB_VERSION);
        this.context = context;
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)
    {
        overrideDB = db;
        CarManager.migrateDataForOnUpgrade(context);
    }
}


public class CarManager {

    DbHelper dbHelper;

    public CarManager(Context context)
    {
        dbHelper = new DbHelper(context);
    }

    public void addCar(String make, String model)
    {
        ContentValues contentValues = new ContentValues();
        contentValues.put("make", make);
        contentValues.put("model", model);

        SQLiteDatabase db = dbHelper.getWritableDatabase();
        db.insert("car", null, contentValues);
        db.close();
    }

    public static void migrateDataForOnUpgrade()
    {
        //Code here that migrates data when onUpgrade() is called
        //Db lock happens here
    }
}

Есть идеи?Люди настраивают менеджер таблиц (например, dao) иначе, чем этот?

edit: я разговаривал с google team @ android developer hours, и они говорили, что onUpgrade3 никогда не предназначался для того, чтобы делать что-то вроде структурных изменений (изменяет),Так что да, похоже, что есть некоторые хаки, которые нужно использовать во многих случаях прямо сейчас.

1 Ответ

0 голосов
/ 02 марта 2012

Я использую следующую модель, расширяя класс Application.Я поддерживаю один статический экземпляр моего помощника по БД, который используют все остальные компоненты приложения ...

public class MyApp extends Application {

    protected static MyAppHelper appHelper = null;
    protected static MyDbHelper dbHelper = null;

    @Override
    protected void onCreate() {
        super.onCreate();
        ...
        appHelper = new MyAppHelper(this);
        dbHelper = MyAppHelper.createDbHelper();
        dbHelper.getReadableDatabase(); // Trigger creation or upgrading of the database
        ...
    }
}

С тех пор любой класс, которому необходимо использовать помощник по БД, просто выполняет следующие действия:

if (MyApp.dbHelper == null)
    MyApp.appHelper.createDbHelper(...);
// Code here to use MyApp.dbHelper
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...