Android 如何使用已更改列名的新数据库迁移现有Sqlite数据库?安卓

Android 如何使用已更改列名的新数据库迁移现有Sqlite数据库?安卓,android,sqlite,android-sqlite,sqliteopenhelper,Android,Sqlite,Android Sqlite,Sqliteopenhelper,嗨,我在play store上有一个记事本应用程序,有用户数据。。。没有这些新更改的应用程序可以更新、导出和导入备份,并且可以毫无问题地完美运行。但是,当我更改旧的SQLiteOpenHelper安排时,现在它不会执行我上面提到的任何操作,除非我将这些新更改重新更改为旧安排 旧SQLiteOpenHelper排列 static final String DATABASE_NAME = "note.db"; static final String TABLE_NOTE = "tb_

嗨,我在play store上有一个记事本应用程序,有用户数据。。。没有这些新更改的应用程序可以更新、导出和导入备份,并且可以毫无问题地完美运行。但是,当我更改旧的SQLiteOpenHelper安排时,现在它不会执行我上面提到的任何操作,除非我将这些新更改重新更改为旧安排

旧SQLiteOpenHelper排列

    static final String DATABASE_NAME = "note.db";
    static final String TABLE_NOTE = "tb_note";
    static final String KEY_ID_NOTE = "id";
    private static final String KEY_TITLE_NOTE = "title";
    private static final String KEY_CONTENT_NOTE = "content";
    private static final String KEY_LAST_MODIFIED_NOTE = "last_modified";


    private static final String CREATE_TABLE_NOTE =
            "CREATE TABLE " + TABLE_NOTE + "(" +
                    KEY_ID_NOTE + " INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL" +
                    ", " + KEY_TITLE_NOTE + " TEXT NOT NULL" +
                    "," + KEY_CONTENT_NOTE + " TEXT NOT NULL" +
                    "," + KEY_LAST_MODIFIED_NOTE + " TEXT DEFAULT \'\'" +
                    ")";


    private static final int DATA_VERSION = 2;
但是我在应用程序中更改了一个列名,我的新SQLiteOpenHelper变成了这样,除了我在代码下面用粗体字更改了那些行之外,一切都是一样的

    static final String DATABASE_NAME = "note.db";
    static final String TABLE_NOTE = "tb_note";
    static final String KEY_ID_NOTE = "id";
    private static final String KEY_TITLE_NOTE = "title";
    private static final String KEY_CONTENT_NOTE = "content";
    private static final String KEY_UPDATE_TIME = "update_time";


    private static final String CREATE_TABLE_NOTE =
            "CREATE TABLE " + TABLE_NOTE + "(" +
                    KEY_ID_NOTE + " INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL" +
                    ", " + KEY_TITLE_NOTE + " TEXT NOT NULL" +
                    "," + KEY_CONTENT_NOTE + " TEXT NOT NULL" +
                    "," + KEY_UPDATE_TIME + " TEXT NOT NULL" +
                    ")";


    private static final int DATA_VERSION = 2;
他们是这样的

私有静态最终字符串键\u LAST\u MODIFIED\u NOTE=“LAST\u MODIFIED”

”,“+KEY\u LAST\u MODIFIED\u NOTE+“TEXT DEFAULT\'\'”+

但是现在

私有静态最终字符串键\u UPDATE\u TIME=“UPDATE\u TIME”

,“+KEY\u UPDATE\u TIME+”文本不为空“+

最后,这是我的onupgrade代码

 @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        // update database for database version < 2
        if (oldVersion < 2) {
            db.execSQL("ALTER TABLE " + TABLE_NOTE + " ADD COLUMN " + KEY_UPDATE_TIME + " TEXT DEFAULT \'\'");
        }
    }
@覆盖
public void onUpgrade(SQLiteDatabase db,int-oldVersion,int-newVersion){
//更新数据库版本<2的数据库
如果(旧版本<2){
db.execSQL(“ALTER TABLE”+TABLE\u NOTE+“ADD COLUMN”+KEY\u UPDATE\u TIME+“TEXT DEFAULT\”);
}
}

现在,如何使用新的Sqlite数据库迁移现有的Sqlite数据库而不丢失任何数据?

首先,重命名旧表,然后使用旧表名和更新的列名创建新表,然后将第一个表内容复制到新创建的表中并删除旧表

    @Override 
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
       // change old table name 
        db.execSQL("ALTER TABLE "+orig_table_name +" RENAME "+ " TO "+ tmp_table_name;
     // create new table with old table name and updated coulmn
         db.execSQL( "CREATE TABLE " + TABLE_NOTE + "(" +
                    KEY_ID_NOTE + " INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL" +
                    ", " + KEY_TITLE_NOTE + " TEXT NOT NULL" +
                    "," + KEY_CONTENT_NOTE + " TEXT NOT NULL" +
                    "," + KEY_UPDATE_TIME + " TEXT NOT NULL" +
                    ")");
// then insert old table data into new one
db.execSQL(""INSERT INTO " + NEW_TABLE NAME + " SELECT * FROM " + OLD_TABLE_NAME");
//and finally delete old table
 db.execSQL("DROP TABLE "+OLD_TABLE_NAME); 
    }

并使用sqlite浏览器检查上述所有已成功执行的查询。

谢谢@Anil您能否编写它以查看其工作原理。。。我真的很感激它,因为我的应用程序依赖它:)