SQLite DB的版本号

时间:2013-02-01 10:38:40

标签: android sqlite

我在我的Android应用程序中处理sqlite。

我正在db.getVersion()获取我的数据库的当前版本。

它在logcat中显示3

即使在构造函数中,我也将4设置为版本号。

public Helper(Context context)
    {
        super(context, DATABASE_NAME, null,4);
    }

我正在给4它应该4作为版本号。

但它不像这样。它显示3作为版本号。

请提出任何建议。

更新: -

    public class Helper extends SQLiteOpenHelper {
        public static final String  DATABASE_NAME = "helper.db";

        public static final String TITLE = "title";
        public static final String AUTHOR = "author";
        public static final String ISBN = "isbn";

        public Helper(Context context)
        {
            super(context, DATABASE_NAME, null,4);
        }

        @Override
        public void onCreate(SQLiteDatabase db) {

                db.execSQL( "CREATE TABLE book1(_id INTEGER PRIMARY KEY AUTOINCREMENT,title TEXT, author TEXT,isbn INTEGER);");
                Log.v("Create Table", "CREATE TABLE book1(_id INTEGER PRIMARY KEY AUTOINCREMENT,title TEXT, author TEXT,isbn INTEGER);");

Log.v("version ", "Version number is "+db.getVersion());

}

5 个答案:

答案 0 :(得分:18)

您正在检查onCreate函数中的版本号,为什么?只应在第一次从头创建数据库时调用OnCreate函数,在这种情况下,它应该根据您所需的版本构建数据库。

您是否可以在创建数据库后尝试检查数据库版本,并要求获取可读或可写的实例?

SQLiteDatabase db = new Helper(context).getWritableDatabase();
db.getVersion(); // what value do you get here?

查看android 4.1.1 SQLiteOpenHelper的源代码,这里似乎db版本应该是onCreate函数中的0,我想它可能会在你正在测试的版本上以另一种方式实现。 http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/4.1.1_r1/android/database/sqlite/SQLiteOpenHelper.java#242

答案 1 :(得分:6)

似乎数据库已经由以前版本的代码创建,尝试从您正在测试的设备上卸载应用程序,然后重新安装。这应该给你版本= 4

答案 2 :(得分:3)

您必须将表格放在oldversion数据库中,覆盖此函数

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

应该是它。

避免数据丢失请参阅本教程

http://denverdroid.blogspot.com/2010/04/how-to-non-destructibly-upgrade-your.html

或者

How to update an SQLite Database and NOT lose all existing data?

答案 3 :(得分:1)

我认为你为Helper类提供了错误的构造函数。试试这个:

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

您当前的构造函数告诉Android它已经是版本4,并且无需升级它。

此外,您还需要提供onUpgrade方法。

  @Override
  public void onUpgrade(SQLiteDatabase database, int oldVersion, int newVersion) {
    // upgrade code
  }

答案 4 :(得分:1)

为了解决这个问题并且为了所有人:

 private SQLiteDatabase getDatabaseLocked(boolean writable) {
  ...
            db.beginTransaction();
            try {
                if (version == 0) {
   -------->      onCreate(db);      <---- YOUR QUERY ON VERSION IS HERE !!!
                } else {
                    if (version > mNewVersion) {
                        onDowngrade(db, version, mNewVersion);
                    } else {
                        onUpgrade(db, version, mNewVersion);
                    }
                }
   -------->    db.setVersion(mNewVersion);      <----   NEW VERSION IS SET HERE !!!
                db.setTransactionSuccessful();
            } finally {
                db.endTransaction();
            }
        }
...
}

来源: public final class SQLiteDatabase