Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/225.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 升级sqllite db的正确方法是什么?_Android_Database_Sqlite - Fatal编程技术网

Android 升级sqllite db的正确方法是什么?

Android 升级sqllite db的正确方法是什么?,android,database,sqlite,Android,Database,Sqlite,以前的db版本没有f字段。 这是升级数据库的正确方法吗? 我需要onUpgrade中的onCreatedb吗 我这样做了好几次,每次都有另一个例外: 1个表已存在,因此我添加了(如果不存在) 2无法读取第0行,第5列错误此处我丢失了它 这是升级数据库的正确方法吗 我想保留我的数据您无需在onUpgrade中调用onCreate。正在对db.execSQLTABLE\u MAIN\u进行足够的升级,以便进行更新。 现在,您应该清除应用程序中的数据。为此,请重新安装应用程序或在android she

以前的db版本没有f字段。 这是升级数据库的正确方法吗? 我需要onUpgrade中的onCreatedb吗

我这样做了好几次,每次都有另一个例外: 1个表已存在,因此我添加了(如果不存在) 2无法读取第0行,第5列错误此处我丢失了它

这是升级数据库的正确方法吗


我想保留我的数据

您无需在onUpgrade中调用onCreate。正在对db.execSQLTABLE\u MAIN\u进行足够的升级,以便进行更新。 现在,您应该清除应用程序中的数据。为此,请重新安装应用程序或在android shell中执行

private static final String TABLE_MAIN_CREATE = "CREATE TABLE IF NOT EXISTS " + TABLE_MAIN_NAME + " ( a INTEGER, b LONG, c TEXT, d TEXT, e DATETIME, f TEXT)";
private static final String TABLE_MAIN_UPGRADE = "ALTER TABLE " + TABLE_MAIN_NAME + " ADD Column f TEXT";

    @Override
public void onCreate(SQLiteDatabase db) {
    db.execSQL(TABLE_MAIN_CREATE);
}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    if (oldVersion < newVersion) {
        db.execSQL(TABLE_MAIN_UPGRADE);
    }
    onCreate(db);
}
在onUpgrade方法中可以执行的一种方法是删除表并重新创建它。这样,只会删除该特定表的数据,而不会删除整个数据库数据

pm clear your.app.package

此方法在配置数据库连接后以及在创建、升级或降级数据库架构(如有必要)后调用

onCreatedb;升级数据库时没有必要使用此选项。

警告:这是一个很好且有效的解决方案,但有很多人因为个人原因而不赞成此答案

你必须根据旧版本做些什么

fx:你可以有10-14的db版本,旧的10个版本你不支持,在每一个新版本你添加一个新的列,代码应该看起来像WVersion是14:

私有静态最终字符串表\u MAIN\u CREATE\u 14= 如果不存在,则创建表+表\u主\u名称+ a整数、b长、c文本、d文本、e日期时间、f文本、g文本、h文本、i文本; 私有静态最终字符串表\u MAIN\u升级\u 10\u 11= ALTER TABLE+TABLE\u MAIN\u NAME+添加文本列; 私有静态最终字符串表\u MAIN\u升级\u 11\u 12= ALTER TABLE+TABLE\u MAIN\u NAME+添加g列文本; 私有静态最终字符串表\u MAIN\u升级\u 12\u 13= ALTER TABLE+TABLE\u MAIN\u NAME+添加h列文本; 私有静态最终字符串表\u MAIN\u升级\u 13\u 14= 更改表格+表格主名称+添加第一列文本; @凌驾 public void onCreateSQLiteDatabase db{ db.execSQLTABLE_MAIN_CREATE_14; } @凌驾 public void ONUPGRADESQLITEDB数据库,int-oldVersion,int-newVersion{ 切换版本{ 案例10://从10到11,然后转到下一个案例 db.execSQLTABLE\u MAIN\u升级\u 10\u 11; 案例11://从11到12,然后转到下一个案例 db.execSQLTABLE\u MAIN\u升级\u 11\u 12; 案例12://从12到13,然后转到下一个案例 db.execSQLTABLE\u MAIN\u升级\u 12\u 13; 案例13://从13到新版本 db.execSQLTABLE\u MAIN\u升级\u 13\u 14; 打破 违约: //不要太老,所以我们应该放弃,重新创造; db.execSQLDROP TABLE如果存在+TABLE\u MAIN\u NAME; onCreatedb; 打破 } }
卸载并重新安装应用程序进行此操作我想保留我的数据除此之外,当用户在google play上重新安装应用程序时,它会降低搜索率如果没有任何合理的评论,我看不到任何投票下降的点nx,但我可以看到这一点。。。有时我真的会成为讽刺性的评论,等等。唯一能踢我一脚的方法就是否决这个问题:
@Override  
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) 
{
    Log.w("TAG", "Upgrading database from version " + oldVersion + " to " + newVersion);
    switch (oldVersion) 
    {
        case 1:
               db.execSQL("DROP TABLE IF EXISTS " + TABLE_MAIN_NAME);
               db.execSQL(TABLE_MAIN_CREATE);
        default:
            break;
    }
}