2011-08-24 15 views
7

私はこのDataBaseHelper.classを使用していますが、私はonUpgrade()メソッドに固執しています。私はデータベースのバージョン番号が何であるか把握する方法を知らない。私はバージョンを1に設定することができました。私が初めてそれを公開したときに、私がアップデートを公開するときには、単にバージョンを2 (myDataBase.setVersion(2);)に設定することができました。しかし、アプリケーションが実行されている間だけ2になるでしょう。次回に起動すると再び1になります。 private static int DATABASE_VERSIONも同様です。私は余分なテーブルにバージョン番号を格納することについて考えていたが、これは私の見解ではベストプラクティスではないようだ。onUpgradeデータベース - oldVersion - newVersion

バージョン番号がアップグレード後に増加し、それが保持されていることを確認します(private static int DATABASE_VERSIONまたはmyDataBase.getVersion();に割り当てられた値)。

DataBaseHelperクラス:

public class DataBaseHelper extends SQLiteOpenHelper { 

    //The Android's default system path of your application database. 
    private static String DB_PATH = "/data/data/com.mydatabase.db/databases/"; 

    private static String DB_NAME = "database.sl3"; 

    private SQLiteDatabase myDataBase; 

    private final Context myContext; 


    // Do you need this? 
    private static int DATABASE_VERSION = 2; 
    // or is this correct: 
    // private static int DATABASE_VERSION = myDataBase.getVersion(); 


    /** 
    * Constructor 
    * Takes and keeps a reference of the passed context in order to access to 
    * the application assets and resources. 
    * 
    * @param context 
    */ 
    public DataBaseHelper(Context context) { 

     super(context, DB_NAME, null, DATABASE_VERSION); 
     this.myContext = context; 
    } 

    /** 
    * Creates an empty database on the system and rewrites it with your own 
    * database. 
    * */ 
    public void 
     createDataBase() throws IOException { 
     boolean dbExist = checkDataBase(); 

     if (dbExist) { 


     } 
     else { 

      //By calling this method and empty database will be created into the default system path 
      //of your application so we are gonna be able to overwrite that database with our database. 


      this.getWritableDatabase(); 


      try { 

       copyDataBase(); 

      } catch (IOException e) { 

       throw new Error("Error copying database"); 

      } 
     } 

    } 

    /** 
    * Check if the database already exist to avoid re-copying the file each 
    * time you open the application. 
    * 
    * @return true if it exists, false if it doesn't 
    */ 
    private boolean 
     checkDataBase() { 

     SQLiteDatabase checkDB = null; 

     try { 
      String myPath = DB_PATH + DB_NAME; 
      checkDB = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READWRITE); 

     } catch (SQLiteException e) { 

      //database does't exist yet. 

     } 

     if (checkDB != null) { 

      checkDB.close(); 

     } 
     return checkDB != null ? true : false; 
    } 

    /** 
    * Copies your database from your local assets-folder to the just created 
    * empty database in the 
    * system folder, from where it can be accessed and handled. 
    * This is done by transfering bytestream. 
    * */ 
    private void 
     copyDataBase() throws IOException { 

     //Open your local db as the input stream 
     InputStream myInput = myContext.getAssets().open(DB_NAME); 


     // Path to the just created empty db 
     String outFileName = DB_PATH + DB_NAME; 


     //Open the empty db as the output stream 
     OutputStream myOutput = new FileOutputStream(outFileName); 


     //transfer bytes from the inputfile to the outputfile 
     byte[] buffer = new byte[1024]; 
     int length; 
     while ((length = myInput.read(buffer)) > 0) { 
      myOutput.write(buffer, 0, length); 
     } 


     //Close the streams 
     myOutput.flush(); 
     myOutput.close(); 
     myInput.close(); 

    } 

    public void 
     openDataBase() throws SQLException { 

     //Open the database 
     String myPath = DB_PATH + DB_NAME; 
     myDataBase = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READWRITE); 



     // Which parameters do I have to pass? 
     onUpgrade(myDataBase, DATABASE_VERSION, 2); 
    } 

    @Override 
    public synchronized void 
     close() { 

     if (myDataBase != null) 
      myDataBase.close(); 

     super.close(); 

    } 

    @Override 
    public void 
     onCreate(SQLiteDatabase db) { 

    } 

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

    Log.d ("onUpgrade first log", Integer.toString(myDataBase.getVersion())); 




    if (oldVersion == 1) { 

     // do something 


     // And then do this!? 
     DATABASE_VERSION = 2; 
     // or do this 
     myDataBase.setVersion(2); 
     Log.d ("onUpgrade sedond log", Integer.toString(myDataBase.getVersion())); 

    } 

    else { 
     Log.d("onUpgrade", "else-clause: Already upgraded!"); 
    } 



} 

答えて

11
// Do you need this? 
private static int DATABASE_VERSION = 2; 

はい、あなたはこれを必要とします。 (さらに良くするとfinalにもなります)

これは、データベースヘルパーに最新のバージョンのデータベーススキーマを伝えます。これは、あなたのアプリケーションコードで修正されるべきであり、スキーマを変更するたびに増分されます。

あなたのアプリケーションが起動すると、ヘルパーは、コードの最新バージョンの考え方が、データベースが最後に作成またはアップグレードされたときにアクティブだったバージョンと同じであることをランタイムにチェックします。数値が一致しない場合、ヘルパーは、ストアド・データベースがアプリケーション・コードに対して古くなっていることを認識しており、アップグレード・ルーチンを実行します(これはdb.getVersion()です)。

データベースを最初から作成するのではなく、既存のデータベースをアセットからインポートするように見えます。この初期インポートを実行するときは、保存されたバージョンがコードのバージョンと一致することを確認する時間です。アセット内のデータベースファイルに直接適用するか、アセット内のデータベースファイルがコードと一致することが確かな場合は、setVersion(DATABASE_VERSION)と呼び出します。

いずれにしても、onUpgrade()ルーチンのバージョン番号を変更しようとしないでください。これは、バージョンが一致しない場合にのみ呼び出されます。ここで行うべきことは、データベースを最新にするために必要な変更を加えることです。アップグレードが完了すると、ヘルパーは新しいバージョン番号の格納を管理します。

+0

こんにちはグラハムボーランドに投稿してください任意の説明が必要な場合は!あなたは正しく資産フォルダから既存のデータベースをインポートして、これがあなたの資産のデータベースファイルに直接適用する必要があると思います!しかし、私はこれをどのようにして行うのですか? – BenjaminButton

+0

私はバージョン番号を意味しました。 – BenjaminButton

+1

私はそれが働いている! createDataBaseクラスでは、行がありませんでした。 'public void createDataBase()throws IOException {boolean dbExist = checkDataBase(); さらに、DataBaseHelperクラスの新しいオブジェクトが作成されたときに、onUpgrade()が呼び出されますが、**データベースが更新された場合にのみ**バージョン番号が一致しません。これは、onUpgradeを "自分で"呼び出す必要はないということです。データベースのアップデートを公開する場合は、バージョンnrを1だけインクリメントし、onUpgrade()メソッドで変更を適用します。誰でも助けることを願っています! – BenjaminButton

1

グラハムボーランドの回答にいくつかの情報を追加します。 あなたのデータベースがアセットフォルダ にあるアプリケーションのシナリオについて説明し、パッケージフォルダにそれがまだ存在しない場合は、それをあなたのパッケージフォルダにコピーします。 更新されたデータベースを使用してアプリケーションをアップグレードする場合。

private final static int DB_VERSION=2;   // Database Version 

をデータベースヘルパークラスに設定する必要があります。このscenarionで

(あなたはこのクラスでで初期状態設定された初期DBのバージョンよりもする必要があります任意の整数)

その後あなたがオーバーライドのコードを追加する必要がありONUPGRADE() 私は、最新と古いデータベースをoverrite。あなたの好みに合わせてコードを変更することがあり

@Override 
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
     // TODO Auto-generated method stub 
      CopyNewDatabaseFromAsset(); 
    } 

あなたはコメント:)

関連する問題