[英]Android SQLite onUpgrade not called
我在事件onCreate
创建了我的数据库,其中我有很多表,但我需要再添加1个表,我不能丢失任何数据,所以我需要使用onUpgrade
事件,所以我希望你们帮助我们我,因为我不知道如何使用它。
示例:
public void onCreate(SQLiteDatabase db) {
sql = "CREATE TABLE IF NOT EXISTS funcionarios"
+"(codigo INTEGER PRIMARY KEY, funcionario TEXT, apelido TEXT , functionTEXT, cartao TEXT , foto TEXT , tipo_foto TEXT);";
db.execSQL(sql);
}
我需要的是什么
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
if(oldVersion < 2){
db.execSQL("CREATE TABLE IF NOT EXISTS calibrar_aceleracao"+
"(limiteMaximo INTEGER, limiteMinimo INTEGER);");
}
}
但它不起作用。
谢谢。
当您的版本数据库递增时,将调用onUpgrade
方法。 在您的类中验证您定义数据库版本的位置并增加此值。
运行应用程序 调用onUpgrade
方法。
这不是onUpgrade
工作方式 。这是一种方法,当你发布一些新版本的应用程序并在google play中下载它时可以调用它(这可能需要对已经安装的应用程序的数据库进行一些更新)在用户的设备上)。对于您的问题的解决方案只需在onCreate()中添加CREATE TABLE IF NOT EXISTS
的查询,就像在onCreate()方法中创建另一个表一样
public void onCreate(SQLiteDatabase db) {
sql = "CREATE TABLE IF NOT EXISTS funcionarios"
+"(codigo INTEGER PRIMARY KEY, funcionario TEXT, apelido TEXT , functionTEXT, cartao TEXT , foto TEXT , tipo_foto TEXT);";
///HERE YOUR Create Table QUERY and call db.execSQL
db.execSQL(sql);
}
要调用onUpgrade
,必须增加提供给SqliteOpenHelper
实现构造函数的数据库版本。 使用类中的字段存储相同的字段,并在更改数据库模式时将其递增。
你不需要改变你的应用程序版本更新数据库-不是说这是不正确,但有这样做的更有效的方式。 这是通过使用你的助手的超级构造函数,它看起来像下面这样:
public class MyDatabaseHelper extends SQLiteOpenHelper {
public MyDatabaseHelper(Context context) {
super(context, "My.db", null, 1 /* This is the version of the database*/);
}
@Override
public void onCreate(SQLiteDatabase database) {
sql = "CREATE TABLE IF NOT EXISTS funcionarios (codigo INTEGER PRIMARY KEY, funcionario TEXT, apelido TEXT , functionTEXT, cartao TEXT , foto TEXT , tipo_foto TEXT);";
db.execSQL(sql);
}
@Override
public void onUpgrade(SQLiteDatabase database, int oldVersion, int newVersion) {
if(oldVersion < 2){
db.execSQL("CREATE TABLE IF NOT EXISTS calibrar_aceleracao (limiteMaximo INTEGER, limiteMinimo INTEGER);");
}
}
}
该方法是onUpgrade未被调用可能是因为sql代码中存在错误,例如在onCreate中:
functionTEXT
在TEXT之前缺少一个空格。
之后,
calibrar_aceleracao"+ "(limiteMaximo
在括号前缺少一个空格。
我遇到了同样的问题,我正在缓存SQLiteException,所以我没有看到错误存在。
将一些logcat放在方法体的开头和末尾,你会看到错误的位置。
编辑:另一件事,你为什么这么说?
if (oldVersion < 2)
根本没有必要。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.