11

我正在我的 android 应用程序中使用 sqlite。

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

它显示 3在 logcat 中。

即使在构造函数中,我也将其设置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());

}
4

5 回答 5

23

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

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

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

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

于 2013-02-06T23:46:05.850 回答
6

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

于 2013-02-01T13:20:25.053 回答
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

或这个

如何更新 SQLite 数据库而不丢失所有现有数据?

于 2013-02-05T02:00:52.647 回答
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
  }
于 2013-02-04T21:00:12.377 回答
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();
            }
        }
...
}

来源: 公共最终类 SQLiteDatabase

于 2015-05-20T04:28:49.443 回答