11

Androidアプリでsqliteに取り組んでいます。

db.getVersion()データベースの現在のバージョンを取得しようとしています。

3logcatに表示 されています。

コンストラクターでも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 関数は、最初からデータベースを作成するときにのみ呼び出す必要があります。この場合、使用しているバージョンに適合させる必要があるため、DB を構築する必要があります。

DB が作成された後に DB のバージョンを確認してみてください。読み取り可能または書き込み可能なインスタンスを取得するように依頼できますか?

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

ソース: public final クラス SQLiteDatabase

于 2015-05-20T04:28:49.443 に答える