Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/190.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android升级数据库成功升级后未更新数据库版本_Android_Sqlite_Database Versioning - Fatal编程技术网

Android升级数据库成功升级后未更新数据库版本

Android升级数据库成功升级后未更新数据库版本,android,sqlite,database-versioning,Android,Sqlite,Database Versioning,我试图将三个新表添加到我现有的sqlite数据库中,但在成功升级后,我遇到了数据库版本不更新的问题。下面是运行的DatabaseHelper: private static class DatabaseHelper extends SQLiteOpenHelper { public DatabaseHelper(Context context, String name, CursorFactory factory, int version) { super(contex

我试图将三个新表添加到我现有的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());
    }       
}
下面是我的open()函数:

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();
}
下面是我的close()函数:

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();
}
因此,在第一次使用更高版本的数据库运行时,第一个onUpgrade日志将读取: 旧版本1新版本2 db.getVersion为1

第二个日志是: onUpgrade之后的版本为2

但是,当运行onUpgrade后再次访问数据库时,数据库的版本号不会更新,它会通过onUpgrade运行,onUpgrade中的第一个日志读取: 旧版本1新版本2 db.getVersion为1

然后应用程序崩溃,因为它试图创建一个已经存在的表

我也尝试过不在onUpgrade中手动设置db版本。这也没用。我还尝试通过运行

db.execSQL("PRAGMA user_version = " + newVersion);
…在行动结束时

编辑:

根据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)";
任何帮助都将不胜感激

谢谢,, Kevin

onUpgrade()
中,必须
删除现有表(将数据迁移到某个临时数据结构后),然后创建新表(使用数据结构中的旧数据)。如果不是,则旧表仍将存在

如果这不能解决问题,请将您在
db.execSQL()

中使用的确切命令粘贴到
onUpgrade()
中,您必须
删除现有表(将数据迁移到某个临时数据结构后),然后创建新表(使用数据结构中的旧数据)。如果不是,则旧表仍将存在


如果这不能解决问题,请粘贴您在
db.execSQL()中使用的确切命令。
修复了我自己的问题。问题是,我创建了一个单独的DB helper类,该类正在访问尝试升级的同一个DB。在这个单独的DB helper类中,版本号设置为1。这个应用程序是我的第一个Java和Android程序,我对DB类的设置非常糟糕。我已经将所有的DB类整合到我现在正在升级的DB类中,现在我的DB版本正在更新。下面是我最后的课程,如果有人感兴趣的话

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

        db.execSQL(VEHICLE_EXPENSE_DATABASE_CREATE);

        db.execSQL(PURCHASE_HISTORY_DATABASE_CREATE);
        db.execSQL(PURCHASE_ITEMS_DATABASE_CREATE);
        db.execSQL(TRIAL_TIME_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());

        if (oldVersion < newVersion) {

            if (oldVersion == 1) {
                db = upgradeTo2(db);
            }
        }
    }

private SQLiteDatabase upgradeTo2(SQLiteDatabase db) {

        db.beginTransaction();
        try {
            db.execSQL(PURCHASE_HISTORY_DATABASE_CREATE);
            db.execSQL(PURCHASE_ITEMS_DATABASE_CREATE);
            db.execSQL(TRIAL_TIME_DATABASE_CREATE);
            db.setTransactionSuccessful();
        } catch (Exception e) {
            Log.w(TAG, "onUpgrade failed");
        } finally {
            db.endTransaction();
        }

        return db;
    }
@覆盖
public void onCreate(SQLiteDatabase db){
w(标记,“当前数据库版本为”+db.getVersion());
db.execSQL(车辆费用数据库创建);
db.execSQL(购买\历史\数据库\创建);
db.execSQL(购买项目、创建数据库);
execSQL(试用时间数据库创建);
}
@凌驾
public void onUpgrade(SQLiteDatabase db,int-oldVersion,int-newVersion){
Log.w(标记,“旧版本”+oldVersion+“新版本”+newVersion+“db.getVersion是”+db.getVersion());
如果(旧版本<新版本){
如果(旧版本==1){
db=升级到2(db);
}
}
}
专用SQLiteDatabase升级到2(SQLiteDatabase db){
db.beginTransaction();
试一试{
db.execSQL(购买\历史\数据库\创建);
db.execSQL(购买项目、创建数据库);
execSQL(试用时间数据库创建);
db.setTransactionSuccessful();
}捕获(例外e){
Log.w(标记“onUpgrade失败”);
}最后{
db.endTransaction();
}
返回分贝;
}

修复了我自己的问题。问题是,我创建了一个单独的DB helper类,该类正在访问尝试升级的同一个DB。在这个单独的DB helper类中,版本号设置为1。这个应用程序是我的第一个Java和Android程序,我对DB类的设置非常糟糕。我已经将所有的DB类整合到我现在正在升级的DB类中,现在我的DB版本正在更新。下面是我最后的课程,如果有人感兴趣的话

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

        db.execSQL(VEHICLE_EXPENSE_DATABASE_CREATE);

        db.execSQL(PURCHASE_HISTORY_DATABASE_CREATE);
        db.execSQL(PURCHASE_ITEMS_DATABASE_CREATE);
        db.execSQL(TRIAL_TIME_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());

        if (oldVersion < newVersion) {

            if (oldVersion == 1) {
                db = upgradeTo2(db);
            }
        }
    }

private SQLiteDatabase upgradeTo2(SQLiteDatabase db) {

        db.beginTransaction();
        try {
            db.execSQL(PURCHASE_HISTORY_DATABASE_CREATE);
            db.execSQL(PURCHASE_ITEMS_DATABASE_CREATE);
            db.execSQL(TRIAL_TIME_DATABASE_CREATE);
            db.setTransactionSuccessful();
        } catch (Exception e) {
            Log.w(TAG, "onUpgrade failed");
        } finally {
            db.endTransaction();
        }

        return db;
    }
@覆盖
public void onCreate(SQLiteDatabase db){
w(标记,“当前数据库版本为”+db.getVersion());
db.execSQL(车辆费用数据库创建);
db.execSQL(购买\历史\数据库\创建);
db.execSQL(购买项目、创建数据库);
execSQL(试用时间数据库创建);
}
@凌驾
public void onUpgrade(SQLiteDatabase db,int-oldVersion,int-newVersion){
Log.w(标记,“旧版本”+oldVersion+“新版本”+newVersion+“db.getVersion是”+db.getVersion());
如果(旧版本<新版本){
如果(旧版本==1){
db=升级到2(db);
}
}
}
专用SQLiteDatabase升级到2(SQLiteDatabase db){
db.beginTransaction();
试一试{
db.execSQL(购买\历史\数据库\创建);
db.execSQL(购买项目、创建数据库);
execSQL(试用时间数据库创建);
db.setTransactionSuccessful();
}捕获(例外e){
Log.w(标记“onUpgrade失败”);
}最后{
db.endTransaction();
}
返回分贝;
}

在删除表之前,这个数据库中只有一个表需要迁移,您知道一个好的源代码可以帮助我了解如何做到这一点吗?谢谢嗯,这取决于您存储的数据、有多少列等。在野外,我想到的一种方法是使用
ContentValues
数组。获取表中当前所有对象的游标,并将每一行放入
ContentValues
对象中<代码>删除
表格,
创建
新表格,a