Android:升级时更改SQLite DB

时间:2015-10-12 09:51:27

标签: android sqlite updates

我想在现有数据库中添加一列

然而,我想象的是,我正处于人们已经拥有代码和数据库版本的情况下,我将通过谷歌播放更新进行更改,因此以前的数据不会丢失

要创建我的数据库,我使用了以下代码;

protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_calculation);
  db = openOrCreateDatabase("EJuiceData", Context.MODE_PRIVATE, null);
  db.execSQL("create table if not exists Inventory(_id integer primary key autoincrement, NAME TEXT NOT NULL, AMOUNT TEXT, PRICE TEXT, AMOUNTLEFT TEXT, WEIGHT TEXT);");
....

我在网上浏览过,人们提到使用以下命令进行更新;

public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
  if (newVersion > oldVersion) {
    db.execSQL("ALTER TABLE Recipe ADD COLUMN NOTES TEXT");
  }
}

然而onUpgrade被注释掉,说明它没有被调用,也没有在我的代码中我说明了它是什么版本的数据库或给了一个新版本

任何人都知道如何解决这个问题?

由于

EDIT;

通过查看答案,我决定尝试以最有效的方式实现这一目标,并将其视为最佳实践

所以我创建了一个名为MyDBHelper的新Java类,其中包含以下内容

package com.sjhdevelopment.shaunharrison.myejuiceapp;

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

public class MyDBHelper extends SQLiteOpenHelper {

  public static final String DATABASE_NAME = "EJuiceData.db";
  public static final int DATABASE_VERSION = 1;



  public MovieDatabaseHelper(Context context) {
      super(context, DATABASE_NAME, null, DATABASE_VERSION);

  }

  public void onCreate(SQLiteDatabase database) {
    database.execSQL("create table if not exists Recipe");
    .....

  }

  @Override
  public void onUpgrade(SQLiteDatabase database, int oldVersion, int newVersion) {
    if (newVersion > oldVersion)
        database.execSQL("ALTER TABLE Recipe ADD COLUMN NOTES TEXT");
    onCreate(database);
  }

}

到目前为止,我在MovieDatabaseHelper上有一个错误,声明'声明了无效方法;需要返回类型

3 个答案:

答案 0 :(得分:2)

您使用的是SQLiteOpenHelper吗?如果是,则必须具有从构造函数发送到超类的版本(请参阅documentation

这是一个代码示例。当DATABASE_VERSION更改时,将调用onUpgrade函数。

public class DatabaseHelper extends SQLiteOpenHelper {

    private static final int DATABASE_VERSION = 1;
    private static final String DATABASE_NAME = "EJuiceData.db";

    public DatabaseHelper (Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
    }

    @Override
    public void onCreate(SQLiteDatabase database) {
        database.execSQL("create table if not exists Inventory(_id integer primary key autoincrement, NAME TEXT NOT NULL, AMOUNT TEXT, PRICE TEXT, AMOUNTLEFT TEXT, WEIGHT TEXT);");
    }

    @Override
    public void onUpgrade(SQLiteDatabase database, int oldVersion, int newVersion) {
        if (newVersion > oldVersion) {
            db.execSQL("ALTER TABLE Recipe ADD COLUMN NOTES TEXT");
            onCreate(database);
        }
    }
}

修改

现在您可以使用

访问您的数据库了
DatabaseHelper helper = new DatabaseHelper(getContext());
helper.getReadableDatabase().query(...);
//or
helper.getWritableDatabase().insert(...);

答案 1 :(得分:1)

您可以像下面的代码一样扩展 SQLiteOpenHelper ,并使用版本参数创建您希望打开的db版本的帮助程序类。

如果您使用版本1打开数据库,并且下次使用版本2打开数据库,则将使用param ordVersion = 1和newVersion = 2调用onUpgrade方法,然后您可以执行某些操作来升级数据库模式。 / p>

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.database.sqlite.SQLiteOpenHelper;

public class MyDBHelper extends SQLiteOpenHelper {
    public static final String DATABASE_NAME = "mydata.db";
    public static final int VERSION = 1;    
    private static SQLiteDatabase database;

    public MyDBHelper(Context context, String name, CursorFactory factory,
            int version) {
        super(context, name, factory, version);
    }

    public static SQLiteDatabase getDatabase(Context context) {
        if (database == null || !database.isOpen()) {
            database = new MyDBHelper(context, DATABASE_NAME, 
                    null, VERSION).getWritableDatabase();
        }

        return database;
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        onCreate(db);
    }

}

答案 2 :(得分:0)

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    if (oldVersion < newVersion)
        db.execSQL("DROP TABLE IF EXISTS '" + TABLE_NAME + "'");
        onCreate(db);
    }
}