2016-05-07 3 views
0

私はあらかじめデータベースを用意しています。 MozillaでSQLite Managerを使用していますが、今はダミーのデータベースがあり、onUpgradeメソッドをテストしたかったので、カラムの1つに文字列を変更し、新しいデータベースとしてエクスポートしました。新しく更新されたバージョンを開こうとしました。また、重要な注意事項、私は手動で私がもしわからない4.にこれら二つの数字を更新するコードSQLite onUpgrade()フラストレーション

private static final int DB_VERSION = 3; 

にし、ONUPGRADE

if (newVersion == 3) { 
     Log.e("WORKED!!", "onUpgrade executed"); 

ので、次の時間に一つのバージョン番号を更新しています私はこのことをやっているのか、何が間違っているのですか?ログメッセージを受け取っています。アプリで更新されたデータは表示されません。

import android.content.Context; 
import android.database.Cursor; 
import android.database.sqlite.SQLiteDatabase; 
import android.database.sqlite.SQLiteException; 
import android.database.sqlite.SQLiteOpenHelper; 
import android.database.sqlite.SQLiteQueryBuilder; 
import android.util.Log; 

import java.io.FileOutputStream; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.OutputStream; 
import java.sql.SQLException; 
import java.util.ArrayList; 
import java.util.List; 


public class DataBaseHelper extends SQLiteOpenHelper { 
    private static String DB_PATH; 
    private static final String DB_NAME = "DummyTestOne.sqlite"; 
    private static final int DB_VERSION = 3; 
    private static final String DB_NAME2 = "DummyTestFive.sqlite"; 
    private SQLiteDatabase mDataBase; 
    private final Context mContext; 

public static final String DBTABLENAME = "questiontable"; 
public static final String DBATABLENAME = "answertable"; 
public static final String COLUMN_ID = "_id"; 
public static final String COLUMN_NAME = "question"; 
public static final String COLUMN_CATEGORY = "category"; 
public static final String COLUMN_FID = "fid"; 

public static final String COLUMN_ANSWER = "answer"; 

public DataBaseHelper(Context context) { 
    super(context, DB_NAME, null, DB_VERSION); 
    this.mContext = context; 

    DB_PATH = context.getDatabasePath(DB_NAME).getPath(); 


} 

public void createDataBase() { 
    boolean dbExist = checkDataBase(); 

    if (dbExist) { 

    } else { 
     this.getReadableDatabase(); 
     try { 
      copyDataBase(); 
     } catch (IOException e) { 
      throw new Error("Error copying database"); 
     } 
    } 
} 

private boolean checkDataBase() { 
    SQLiteDatabase checkDB = null; 

    try { 
     checkDB = SQLiteDatabase.openDatabase(DB_PATH, null, SQLiteDatabase.OPEN_READWRITE); 
    } catch (SQLiteException e) { 
     Log.e(this.getClass().toString(), "Error while checking db"); 
    } 

    if (checkDB != null) { 
     checkDB.close(); 
    } 

    return checkDB != null ? true : false; 
} 

private void copyDataBase() throws IOException { 
    InputStream externalDbStream = mContext.getAssets().open(DB_NAME); 
    OutputStream localDbStream = new FileOutputStream(DB_PATH); 

    byte[] buffer = new byte[1024]; 
    int bytesRead; 
    while ((bytesRead = externalDbStream.read(buffer)) > 0) { 
     localDbStream.write(buffer, 0, bytesRead); 
    } 


    localDbStream.flush(); 
    localDbStream.close(); 
    externalDbStream.close(); 
} 

public void openDataBase() throws SQLException { 


    mDataBase = this.getWritableDatabase(); 

} 

@Override 
public synchronized void close() { 
    if (mDataBase != null) { 
     mDataBase.close(); 
    } 
    super.close(); 
} 

public Cursor getCursorForAllQs() { 
    SQLiteQueryBuilder queryBuilder = new SQLiteQueryBuilder(); 
    queryBuilder.setTables(DBTABLENAME); 

    String[] asColumnsToReturn = new String[]{COLUMN_ID, COLUMN_NAME, COLUMN_CATEGORY, COLUMN_FID}; 

    Cursor mCursor = queryBuilder.query(mDataBase, asColumnsToReturn, null, 
      null, null, null, "_id"); 

    return mCursor; 
} 

public List<String> getAnswersForQ(int questionFid) { 
    List<String> answers = new ArrayList<>(); 
    SQLiteQueryBuilder queryBuilder = new SQLiteQueryBuilder(); 
    queryBuilder.setTables(DBATABLENAME); 
    String[] tableColumns = new String[]{DataBaseHelper.COLUMN_ANSWER}; 
    String where = "fid = ?"; 
    String[] selectionArgs = new String[]{String.valueOf(questionFid)}; 
    String orderBy = DataBaseHelper.COLUMN_ID; 


    Cursor c = queryBuilder.query(mDataBase, tableColumns, where, selectionArgs, null, null, orderBy); 
    if (c.moveToFirst()) { 
     do { 
      try{ 
       answers.add(c.getString(c.getColumnIndex(DataBaseHelper.COLUMN_ANSWER))); 
      } catch (Exception e) { 
       Log.e("FAILED", c.getString((c.getColumnIndex(DataBaseHelper.COLUMN_ANSWER)))); 
      } 

     } while (c.moveToNext()); 
    } 
    Log.d("getAnswersForQ", answers.toString()); 
    return answers; 

} 

public String getName(Cursor c) { 
    return (c.getString(1)); 
} 



@Override 
public void onCreate(SQLiteDatabase db) { 

} 

@Override 
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
    if (newVersion == 3) { 
     Log.e("WORKED!!", "onUpgrade executed"); 
    } 
    if (newVersion > oldVersion) { 
     InputStream inputStream = null; 
     OutputStream outputStream = null; 
     String dbFilePath = DB_PATH + DB_NAME; 


     try { 
      inputStream = mContext.getAssets().open(DB_NAME2); 

      outputStream = new FileOutputStream(dbFilePath); 

      byte[] buffer = new byte[1024]; 
      int length; 
      while ((length = inputStream.read(buffer)) > 0) { 
       outputStream.write(buffer, 0, length); 
      } 

      outputStream.flush(); 
      outputStream.close(); 
      inputStream.close(); 
     } catch (IOException e) { 
      throw new Error("Problem copying database from resource file."); 
     } 
    } 
} 
} 
+0

なぜonUpgrade内でcopyDataBaseを呼び出さないのですか? –

+0

私はそれをonUpgrade()のtryブロックで行うことをお勧めしますか?また、最初のDBバージョンであるcopyDataBase()にmContext.getAssets()。open(DB_NAME)があります。このインスタンス(DB_NAME2)のようにDBにアップグレードするたびに変更する必要がありますか? –

+0

質問は何ですか? –

答えて

2

データベースのアップグレードは可能な限り無傷で古いデータを保持したままの場所でそれを変更することを意味します。 列を追加または名前を変更する場合は、onUpgradeコールバックでこれを行うには、適切なSQLコマンドを実行する必要があります。

(注:SQLiteAssetHelperが簡単に事前に設定データベースを使用して行い、そしてあなたがそれを使用する必要がありますが、アップグレードはまだ別のSQLスクリプトを必要とします。)その後、

古いデータベースの内容を気にしない場合は、それをアップグレードしないでください。単純に新しいファイル名をコピーして古いファイルを削除するように、新しいデータベースバージョンに新しいファイル名を付けてください。

関連する問題