2012-05-19 9 views
14

私は、アセットフォルダ内の既存のsqliteデータベースを使用するアンドロイドアプリケーションで作業しています。だから私は実際にそのフォルダからデータベースをコピーします。ユーザーは自分のデータを保存することもできます(任意のコンテンツをお気に入りとしてマークする)。SqliteデータベースonUpgrade()が呼び出されない

私は市場にバージョンをアップロードしました。今私はいくつかの新しいデータをデータベースに追加し、新しいバージョンをアップロードしたいと思っています。ユーザーが市場からアプリを更新する場合、私は以前のバージョンからユーザーデータを保持し、新しいデータを追加したいと思う。私はいくつかのGoogleを行って、アップグレード方法でそのトリックを行う必要があることがわかった。しかし、私はDATABASE_VERSIONをコードから変更していますが、on upgradeメソッドは呼び出しを取得しません。私は何かを逃したのだろうかと思っています。

public class DataBaseHelper extends SQLiteOpenHelper { 

private static String DB_PATH = "/data/data/riskycoder.login/databases/"; 
public static String DB_NAME = "datenbank_EN.sqlite"; 
private SQLiteDatabase myDataBase; 
private final Context myContext; 
private static final int DATABASE_VERSION = 1; 





public DataBaseHelper(Context context) { 
    super(context, DB_NAME, null, DATABASE_VERSION); 
    this.myContext = context; 
} 

public void createDataBase() throws IOException { 
    boolean dbExist = checkDataBase(); 
    if (dbExist) { 
    } else { 
     this.getWritableDatabase(); 
     try { 
      this.close(); 
      copyDataBase(); 
     } catch (IOException e) { 
      throw new Error("Error copying database"); 
     } 
    } 

} 

private boolean checkDataBase() { 
    SQLiteDatabase checkDB = null; 
    try { 
     String myPath = DB_PATH + DB_NAME; 
     checkDB = SQLiteDatabase.openDatabase(myPath, null,SQLiteDatabase.OPEN_READWRITE); 
    } catch (SQLiteException e) { 
    } 
    if (checkDB != null) 
     checkDB.close(); 
    return checkDB != null ? true : false; 
} 

private void copyDataBase() throws IOException { 

    InputStream myInput = myContext.getAssets().open(DB_NAME); 
    String outFileName = DB_PATH + DB_NAME; 
    OutputStream myOutput = new FileOutputStream(outFileName); 
    byte[] buffer = new byte[2048]; 
    int length; 
    while ((length = myInput.read(buffer)) > 0) { 
     myOutput.write(buffer, 0, length); 
    } 
    myOutput.flush(); 
    myOutput.close(); 
    myInput.close(); 

    //myDataBase.setVersion(DATABASE_VERSION); 
} 

public void openDataBase() throws SQLException { 
    String myPath = DB_PATH + DB_NAME; 
    myDataBase = SQLiteDatabase.openDatabase(myPath, null,SQLiteDatabase.OPEN_READWRITE); 
    Log.d("Test", "Database version: " +myDataBase.getVersion()); 
} 

@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("Test", "in onUpgrade. Old is: " + oldVersion + " New is: " + newVersion); 


} 

}

+0

* DATABASE_VERSIONをコード.. *から変更していますが、これはどういう意味ですか?私は定数フィールド 'DATABASE_VERSION'(これは明らかに変更できません)を使用して' SQLiteOpenHelper'のスーパーコンストラクタを呼び出しています。どのように正確にデータベースのバージョンを変更しますか? – Luksprog

+0

アプリケーションの新しいバージョンでは、DATABASE_VERSIONを2に変更しました。新しいバージョンをインストールする際に、onUpgradeメソッドを呼び出す必要があります。または私は何かが不足していますか? – rawcoder064

+0

まず、showa DATABASE_VERSIONを投稿したコードが1なので、onUpgradeは呼び出されません。第2に、たとえそれが2であったとしても、onUpgradeにはデータベースを更新するためのanythignを実行するコードがありません。それは自動的には起こらない、あなたはそれをしなくてはならない。 – Barak

答えて

18

onUpgrade()と呼ばれるデータベースの変更バージョン番号が検出されました。次のようにデータベースのバージョンをインクリメント:

private static final int DATABASE_VERSION = 2; 
+0

すべてのonUpgradeがログメッセージを出す(少なくとも投稿されたコードで)ので、彼はうまくやってくれません – Barak

+1

OPは "なぜ'onUpgrade'メソッドが呼び出されません。もちろん、まだonUpgradeを実装していないので、ログメッセージを吐き出すだけです。 –

+0

@ AlexLockwood->あなたが言ったようにDATABASE_VERSIONを2に変更しましたが、logcatの出力には何も表示されません。私はsqliteブラウザでデータベースを作成しました。データベースの作成中にバージョン管理を行う必要がありますか? – rawcoder064

2

が、これは(DATABASE_VERSIONを増やす)してみ&にonUpdate()が呼び出されます:ここに私のコードである場合にのみ

private static final int DATABASE_VERSION = 2; 
+0

それは呼び出され、何もしません... – Barak

+0

@ Barak->私はテストするonUpgrade()にlog.dステートメントを配置しました。しかし、私はlogcat出力には何も見ません。つまり、onUpgradeは呼び出されません。 openDataBase()メソッドでは、私はlog.dステートメントを入れました。私はDATABASE_VERSIONを2に変更しても、データベースのバージョンは常に1であることがわかります。 – rawcoder064

2

あなたがDATABASE_VERSIONを変えなかったと仮定すると、あなたはまだそれを実現するためにONUPGRADE内のコードを配置する必要があります。それは魔法ではない、あなたは何をすべきかを伝えなければならない。あなたのケースでは

以下を行う必要があります。

1)古いデータベースをコピーするには(
2)新しいデータベース
3でコピー)、それに新しい名前を与える)古いデータベースからデータを読み取る
4))新しいデータベース
5に任意の違いをコピー

EDIT

古いデータベースを削除あなたが資産にDBを出荷すると仮定

は、あなたがそうのような使用のためにそれをコピーするフォルダ:

@Override 
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
    // First copy old db 
    InputStream bakInput = getActivity().getAssets().open(dbname); 
    String bakFileName = getActivity().getAssets() + "YourDB.old"; 
    OutputStream bakOutput = new FileOutputStream(bakFileName); 
    byte[] buffer = new byte[1024]; 
    int length; 
    while ((length = bakInput.read(buffer)) > 0) { 
     bakOutput.write(buffer, 0, length); 
    } 
    myOutput.flush(); 
    myOutput.close(); 
    myInput.close(); 

    // delete the old db 
    File delDB = new File(getActivity().getAssets() + "YourDB"); 
    boolean deleted = file.delete(); 

    // Copy in the new db 
    InputStream myInput = getActivity().getAssets().open("YourDB"); 
    String outFileName = MAIN_DB_PATH + dbname; 
    OutputStream myOutput = new FileOutputStream(outFileName); 
    byte[] buffer = new byte[1024]; 
    int length; 
    while ((length = myInput.read(buffer)) > 0) { 
     myOutput.write(buffer, 0, length); 
    } 
    myOutput.flush(); 
    myOutput.close(); 
    myInput.close(); 

    // add code here to get changes user has made to db and move them to updated db 

    // delete the old db copy 
    File delDB = new File(getActivity().getAssets() + "YourDB.old"); 
    boolean deleted = file.delete(); 
} 
+0

申し訳ありません申し訳ありませんがあなたを取得します。私の場合、どのように新しいデータベースをコピーするのですか?あなたはいくつかのコードを投稿してくださいどうすればいいですか.......私の愚かな質問を申し訳ありません... – rawcoder064

+0

@Barakは私のonUpgradeメソッドが呼び出されていないことを助けることができます – Erum

6
は、以下の

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

      if(newVersion > oldVersion){      
        myContext.deleteDatabase(DB_NAME); 
      } 
     } 

にごONUPGRADEを変更しても(自分のcreateDataBaseを変更

)以下のように、

public void createDataBase() throws IOException{ 

      boolean dbExist = checkDataBase(); 

      if(dbExist){ 
       // By calling this method here onUpgrade will be called on a 
       // writable database, but only if the version number has been increased 

       this.getWritableDatabase(); 
      } 

      dbExist = checkDataBase(); 

      if(!dbExist){ 

       //By calling this method an empty database will be created into the      default system path 
        //of the application so we will be able to overwrite that database with our database. 
       this.getReadableDatabase(); 

       try { 

        copyDataBase(); 

       } catch (IOException e) { 

        throw new Error("Error copying database"); 

       } 
      } 

     } 

最後にデータベースのバージョンを増やしてもう一度実行してください。 getReadableDatabase()または同様の機能を呼び出すまで、onUpgradeは呼び出されません。

希望する

+0

私はあなたの答えに従っているが、まだ私のonUpgradeメソッドが呼び出されていない私はあなたを助けることができるpls – Erum

関連する問題