Android ترقية db لا يتم تحديث إصدار db بعد الترقية الناجحة

StackOverflow https://stackoverflow.com//questions/11687473

سؤال

أحاول إضافة ثلاثة جداول جديدة إلى قاعدة بيانات sqlite الموجودة لدي وأواجه مشكلات مع عدم تحديث إصدار قاعدة البيانات بعد الترقية الناجحة.يوجد أدناه DatabaseHelper الذي يتم تشغيله:

private static class DatabaseHelper extends SQLiteOpenHelper {

    public DatabaseHelper(Context context, String name, CursorFactory factory, int version) {
        super(context, name, factory, version);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        Log.w(TAG, "Current db version is " + db.getVersion());
        db.execSQL(ORIGINAL_DATABASE_CREATE);

    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        Log.w(TAG, "Old Version " + oldVersion + " New Version " + newVersion + " db.getVersion is " + db.getVersion());
        db.execSQL(NEW_TABLE_1_DATABASE_CREATE);
        db.execSQL(NEW_TABLE_2_DATABASE_CREATE);
        db.execSQL(NEW_TABLE_3_DATABASE_CREATE);
        db.setVersion(newVersion);
        Log.w(TAG, "Version after onUpgrade is " + db.getVersion());
    }       
}

فيما يلي وظيفتي المفتوحة ():

public VehicleExpDbAdapter open() throws SQLException {
    mDbHelper = new DatabaseHelper(mCtx, DATABASE_NAME, null, DATABASE_VERSION);
    mDb = mDbHelper.getWritableDatabase();
    return this;
}

فيما يلي وظيفة الإغلاق () الخاصة بي:

public void close() {
    mDb.close();
    mDbHelper.close();
}

لذا فإن ما يحدث عند التشغيل الأول باستخدام DATABASE_VERSION الأعلى هو أول قراءة لسجل الترقية:الإصدار القديم 1 الإصدار الجديد 2 db.getVersion هو 1

السجل الثاني هو:الإصدار بعد onUpgrade هو 2

ولكن عند الوصول إلى قاعدة البيانات مرة أخرى بعد تشغيل onUpgrade، لا يتم تحديث رقم إصدار قاعدة البيانات ويتم تشغيله من خلال onUpgrade مع السجل الأول في قراءة onUpgrade:الإصدار القديم 1 الإصدار الجديد 2 db.getVersion هو 1

ثم تعطل التطبيق لأنه يحاول إنشاء جدول موجود بالفعل.

لقد حاولت عدم تعيين إصدار db يدويًا في onUpgrade أيضًا.هذا لم ينجح أيضا.لقد حاولت أيضًا تحديث رقم الإصدار عن طريق تشغيل ...

db.execSQL("PRAGMA user_version = " + newVersion);

...في نهاية onUpgrade.

يحرر:

وفقًا لاقتراح Aswin Kumar، قمت بتغيير onUpgrade الخاص بي لإجراء نسخ احتياطي لجدولي الحالي وإسقاط كل الجدول ثم إعادة إنشائه.هذا لم يحل مشكلة الإصدار الخاص بي.فيما يلي onUpgrade وonCreate:

@Override
    public void onCreate(SQLiteDatabase db) {
        Log.w(TAG, "Current db version is " + db.getVersion());

        db.execSQL(ORIGINAL_DATABASE_CREATE);

        db.execSQL(NEW_TABLE_1_DATABASE_CREATE);
        db.execSQL(NEW_TABLE_2_DATABASE_CREATE);
        db.execSQL(NEW_TABLE_3_DATABASE_CREATE);

    }

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

        Log.w(TAG, "Old Version " + oldVersion + " New Version " + newVersion + " db.getVersion is " + db.getVersion());

        mOldDbContents = backupTables(db);

        db.execSQL("DROP TABLE IF EXISTS " + ORIGINAL_DATABASE_CREATE);
        db.execSQL("DROP TABLE IF EXISTS " + NEW_TABLE_1_DATABASE_CREATE);
        db.execSQL("DROP TABLE IF EXISTS " + NEW_TABLE_2_DATABASE_CREATE);
        db.execSQL("DROP TABLE IF EXISTS " + NEW_TABLE_3_DATABASE_CREATE);

        onCreate(db);
    }   

فيما يلي عبارات sqlite التي أستخدمها لإنشاء الجداول:

private static final String ORIGINAL_DATABASE_CREATE = "create table " + VEHICLE_EXPENSE_TABLE_NAME + 
        " (" + KEY_ROW_ID + " integer primary key autoincrement, " + 
        KEY_UNIX_DATE + " integer, " + 
        KEY_DATE + " not null default current_date, " +
        KEY_TIME + " not null default current_time, " + 
        KEY_DESCRIPTION + " text, " + 
        KEY_START_MILE + " integer, " + 
        KEY_END_MILE + " integer, " + 
        KEY_MILES + " text, " + 
        KEY_AMOUNT + " text, " 
        + KEY_PARTY_ID + " integer)";

private static final String NEW_TABLE_1_DATABASE_CREATE = "CREATE TABLE " + PURCHASE_HISTORY_TABLE_NAME + 
        "(" + HISTORY_ORDER_ID_COL + " TEXT PRIMARY KEY, " +
        HISTORY_STATE_COL + " INTEGER, " + 
        HISTORY_PRODUCT_ID_COL + " TEXT, " + 
        HISTORY_DEVELOPER_PAYLOAD_COL + " TEXT, " + 
        HISTORY_PURCHASE_TIME_COL + " INTEGER)";

private static final String NEW_TABLE_2_DATABASE_CREATE = "CREATE TABLE " + PURCHASED_ITEMS_TABLE_NAME + 
        "(" + PURCHASED_PRODUCT_ID_COL + " TEXT PRIMARY KEY, " + 
        PURCHASED_QUANTITY_COL + " INTEGER)";

private static final String NEW_TABLE_3_DATABASE_CREATE = "CREATE TABLE " + TRIAL_LIMIT_TABLE_NAME + 
        "(" + TRIAL_PRODUCT_ID_COL + " TEXT PRIMARY KEY, " + 
        TRIAL_PRODUCT_NAME + " TEXT, " + 
        TRIAL_START_DATE + " INTEGER)";

أي مساعدة سيكون موضع تقدير كبير.

شكرا لك كيفن

هل كانت مفيدة؟

المحلول 2

تم إصلاح مشكلتي الخاصة.كانت القضية هي أنني قمت بإنشاء فئة مساعد منفصلة DB التي كانت تصل إلى نفس DB كان يحاول الترقية.في هذا الفئة DB Helper منفصلة، تم تعيين رقم الإصدار على 1. وكان هذا التطبيق أول برنامج Java و Android الخاص بي وأعداد فئات DB بشكل فظيع.لقد قمت بدمج جميع فئة DB إلى المرجع الذي قمت بالترقية الآن والآن إصدار DB الخاص بي هو تحديث مثله.فيما يلي دروسي النهائية إذا كان أي شخص مهتم.

giveacodicetagpre.

نصائح أخرى

في onUpgrade(), ، عليك أن drop الجداول الموجودة (بعد ترحيل البيانات إلى بنية بيانات مؤقتة)، ثم قم بإنشاء الجداول الجديدة (باستخدام البيانات القديمة من بنية البيانات).إذا لم تقم بذلك، ستظل الجداول القديمة موجودة.

إذا لم يحل هذا المشكلة، فالصق الأوامر المحددة التي تستخدمها فيها db.execSQL()

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top