【问题标题】:Android : Change SQLite DB on upgradeAndroid:升级时更改 SQLite DB
【发布时间】:2015-10-12 09:51:26
【问题描述】:

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

但是我想象我处于人们已经获得代码和数据库版本的场景中,我将通过 google play 上的更新进行更改,因此以前的数据不会丢失

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

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 被注释掉,说明它没有被调用,我的代码中也没有说明它是什么版本的数据库或给出了一个新版本

有人知道我是如何解决这个问题的吗?

谢谢

编辑;

通过查看答案,我决定尝试以最有效的方式以及被视为最佳做法的方式进行此操作

所以我创建了一个名为 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 上有一个错误,指出“声明的方法无效;需要返回类型

【问题讨论】:

  • 你能发布日志吗?哪一行是错误?您还忘记了 onCreate 之前的@Override
  • 没有日志因为我还没跑代码,public MovieDatabaseHelper(Context context)下面有一条红线
  • 用你的类名 (MyDBHelper) 替换 MovieDatabaseHelper。这是构造函数!
  • 这确实奏效了,我将此归咎于周一早上!谢谢你
  • 所以现在我在不同的表单上输入了以下MyDBHelper helper = new MyDBHelper(getContext()); 但是getContext 导致错误'无法解析方法'getContext()''

标签: android sqlite updates


【解决方案1】:

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

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

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(...);

【讨论】:

  • 我没有使用 SQLiteOpenHelper,创建命令在打开的第一个表单的 OnCreate 中
  • 您可以创建一个名为verion 的私有属性,并在版本更改时手动升级您的数据库。但这是使用 SQLiteOpenHelper 的更好做法(也更容易)。 (见编辑)
  • 嗨@Maloubobola,我正在尝试使用您的答案来完成这项工作我已将您的代码复制到一个新的Java类中但是MovieDatabaseHelper抛出一个错误,指出需要返回类型跨度>
  • 错误在哪里抛出?你能提供更多细节吗?
【解决方案2】:
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    if (oldVersion < newVersion)
        db.execSQL("DROP TABLE IF EXISTS '" + TABLE_NAME + "'");
        onCreate(db);
    }
}

【讨论】:

  • 不幸的是,这并没有回答我的问题,我见过很多这样的方法,这就是我在这里发布问题的原因
  • 可以在oncreate()的上面加上@Override
【解决方案3】:

您可以像下面的代码一样扩展 SQLiteOpenHelper,并使用您要打开的数据库版本的版本参数新建您的帮助程序类。

如果你打开版本 1 的 db,下次打开版本 2 的 db 时,onUpgrade 方法将调用参数 ordVersion = 1 和 newVersion = 2,那么你可以在这里做一些事情来升级你的 db 架构。

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);
    }

}

【讨论】:

  • 您好,感谢您的回答,那么我最好创建一个新的 Java 类并在其中使用上面的代码吗?如果在我之前的课程中是这样,我一直在使用db = openOrCreateDatabase("EJuiceData", Context.MODE_PRIVATE, null); 连接到数据库,我还能使用它吗?谢谢
  • 可以把代码改成 db = new MyDBHelper(ActivityContext, "EJuiceData", null, DBVersionCode).getWritableDatabase();
  • 或 MyDBHelper.getDatabase(ActivityContext) 并在 MyDBHelper 类中更改“DATABASE_NAME”“VERSION”
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-14
  • 2013-06-20
相关资源
最近更新 更多