Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.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中的onUpgrade()sqlite数据库_Android_Sqlite - Fatal编程技术网

Android中的onUpgrade()sqlite数据库

Android中的onUpgrade()sqlite数据库,android,sqlite,Android,Sqlite,我创建了一个Android应用程序,在启动时检查是否有新版本的应用程序。如果是,应用程序将下载新的apk文件并重新安装新的apk。 我的应用程序使用sqlite数据库。但是这个数据库,从一个版本到另一个版本可能会改变。 我认为我必须使用以下方法: onUpgrade() 但我不知道怎么用 启动应用程序时,我将此代码用于CRET数据库(如果不存在): 如果我想使用onUpgrade()方法,我应该更改什么? 什么时候我必须调用它?onUpgrade()(您自己不调用它)是在数据库的版本更改时调

我创建了一个Android应用程序,在启动时检查是否有新版本的应用程序。如果是,应用程序将下载新的apk文件并重新安装新的apk。 我的应用程序使用sqlite数据库。但是这个数据库,从一个版本到另一个版本可能会改变。 我认为我必须使用以下方法:

 onUpgrade()
但我不知道怎么用

启动应用程序时,我将此代码用于CRET数据库(如果不存在):

如果我想使用
onUpgrade()
方法,我应该更改什么? 什么时候我必须调用它?

onUpgrade()
(您自己不调用它)是在数据库的版本更改时调用的,这意味着基础表结构更改等

一般来说,这意味着操作系统会告诉您“嘿,您要求数据库结构版本10,但我发现我们这里有一些更老的东西,所以这是您在开始使用数据库之前修复它的机会(并且可能由于结构不匹配而崩溃)”


用那种方法,你应该做一切必要的事情。。将旧数据库的结构升级到与当前版本要求相匹配的结构,比如添加/删除列、转换行内容,甚至完全删除旧数据库,然后从头开始创建它——对于Android来说,您在这里做什么并不重要——这只是一种紧急回调,让您的代码执行必要的工作(如果有的话)。您需要注意,用户可能不会经常更新,因此您必须始终处理从版本X到版本Y的升级,因为您知道X可能不等于(Y-1)

如果您使用的是SQLiteOpenHelper,则每当您更改DB版本时,都会调用onUpgrade。 这项工作还有一个附加要求。数据库名称必须保持不变

Old Version:
dbName = "mydb.db"
dbVersion = 1

New Version:
dbName = "mydb.db"
dbVersion = 2
在内容提供程序的onCreate中,您创建了一个接受这些参数的SQLiteOpenHelper实例。您的SQLiteOpenHelper实现如下所示:

public static final class MySQLiteOpenHelper extends SQLiteOpenHelper {

        public MySQLiteOpenHelper(Context context, int dbVersion, String dbName) {
            super(context, dbName, null, dbVersion);
        }

        @Override
        public void onCreate(SQLiteDatabase db) {
            //Code to create your db here
        }

        @Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
            // Code to upgrade your db here
        }

}
当您更改表或在数据库中添加更多表时,它也将被调用

我发现这非常有用

@覆盖
public void onUpgrade(SQLiteDatabase db,int-oldVersion,int-newVersion){
如果(旧版本<2){
execSQL(数据库改变团队1);
}
如果(旧版本<3){
execSQL(数据库变更团队2);
}
}

我注意到onUpgrade有两个int参数:oldVersion和newVersion。因此,如果我的应用程序中有版本1的数据库,并且下载的apk包含版本2的数据库,这允许系统自动调用onUpgrade()方法?就像我可以使用switch(oldVersion)中建议的那样,考虑到对每个旧版本所做的不同更改?对吗?此外,如果在新的db版本中,我将新列添加到某个表中,我还必须修改onCreate,以便使用新的附加列创建表?如果还没有安装任何应用程序并且必须创建新的数据库,那么这可能是有意义的。我的假设正确吗?是的。版本号仅为
int
,因此您可以执行常规的
切换/case
。但重要的是,例如,您应该处理从版本2到版本3的升级,但也应该处理从版本1到版本3的升级(我可能只是在这里循环,首先从版本1升级到版本2,然后从版本2升级到版本3),这可能比处理从版本1到版本3的直接更新(或者从版本1到版本80以提供更广泛的视角)更简单
public static final class MySQLiteOpenHelper extends SQLiteOpenHelper {

        public MySQLiteOpenHelper(Context context, int dbVersion, String dbName) {
            super(context, dbName, null, dbVersion);
        }

        @Override
        public void onCreate(SQLiteDatabase db) {
            //Code to create your db here
        }

        @Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
            // Code to upgrade your db here
        }

}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    if (oldVersion < 2) {
         db.execSQL(DATABASE_ALTER_TEAM_1);
    }
    if (oldVersion < 3) {
         db.execSQL(DATABASE_ALTER_TEAM_2);
    }
}