繁体   English   中英

没有调用Android SQLite onUpgrade

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM