[英]Upgrading my SQLite db
我對SQLite還是很陌生。
如何升級數據庫?
我以前的數據庫版本中有7個問題。
今天,我添加了大約13個新的,總共20個。
我使用addQuestion方法添加了它們。
但是,它不起作用。
我一直在修補我的onUpgrade。
我做錯了。
public class QuizHelper extends SQLiteOpenHelper {
private static final int DATABASE_VERSION = 1;
private static final String DATABASE_NAME = "creativequestion";
private static final String TABLE_QUEST = "quest";
private static final String KEY_ID = "qid";
private static final String KEY_QUEST = "question";
private SQLiteDatabase dbase;
public QuizHelper(Context context) {
super( context, DATABASE_NAME, null, DATABASE_VERSION );
}
@Override
public void onCreate(SQLiteDatabase db) {
dbase = db;
String sql = "CREATE TABLE IF NOT EXISTS " + TABLE_QUEST + " ( " + KEY_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " + KEY_QUEST + " TEXT)";
db.execSQL( sql );
addQuestion();
}
private void addQuestion() {
QuestionFaci q1 = new QuestionFaci( "OTHER USES: Name other uses of a Hammer. \n\n Example: Stir a soup." );
this.addQuestion(q1);
QuestionFaci q2 = new QuestionFaci( "RHYMES: Words that rhymes with Rice. \n\n Example: Ice" );
this.addQuestion(q2);
QuestionFaci q3 = new QuestionFaci( "WITH: I can cook eggs with... \n\n Example: A Piece of Plywood" );
this.addQuestion(q3);
QuestionFaci q4 = new QuestionFaci( "WITHOUT: I can wash my clothes without... \n\n Example: My Aunt" );
this.addQuestion(q4);
QuestionFaci q5 = new QuestionFaci( "I WILL: If I was Bill Gates, I will... \n\n Example: Buy a spaceship" );
this.addQuestion(q5);
QuestionFaci q6 = new QuestionFaci( "CREATE A MOVIE TITLE: A NIGHT \n\n Example: To Remember" );
this.addQuestion(q6);
QuestionFaci q7 = new QuestionFaci( "OTHER NAMES: Other names of a cow \n\n Example: Milk giver" );
this.addQuestion(q7);
QuestionFaci q8 = new QuestionFaci( "OTHER USES: Name other uses of a Cowboy Boots. \n\n Example: Pound a nail." );
this.addQuestion(q8);
QuestionFaci q9 = new QuestionFaci( "RHYMES: Bake a. \n\n Example: Flake." );
this.addQuestion(q9);
QuestionFaci q10 = new QuestionFaci( "I WILL: I will drive a helicopter \n\n Example: with eyes closed" );
this.addQuestion(q10);
QuestionFaci q11 = new QuestionFaci( "CREATE A TITLE: The Greatest \n\n Example: Heist" );
this.addQuestion(q11);
QuestionFaci q12 = new QuestionFaci( "CHANGE AN INGREDIENT: --- Cookie \n\n Example: Orange Chip" );
this.addQuestion(q12);
QuestionFaci q13 = new QuestionFaci( "FINISH ME: Can you remember the times when.. \n\n Example: push me over a cliff" );
this.addQuestion(q13);
QuestionFaci q14 = new QuestionFaci( "OTHER NAMES: Ball bearings \n\n Example: Mommy's new bangles" );
this.addQuestion(q14);
QuestionFaci q15 = new QuestionFaci( "FINISH ME: The donut rolls \n\n Example: down the hill" );
this.addQuestion(q15);
QuestionFaci q16 = new QuestionFaci( "RHYMES: Flip the \n\n Example: clip" );
this.addQuestion(q16);
QuestionFaci q17 = new QuestionFaci( "OTHER NAMES: Police \n\n Example: civilian peacekeeper" );
this.addQuestion(q17);
QuestionFaci q18 = new QuestionFaci( "CREATE A TITLE: Go Go \n\n Example: Changin" );
this.addQuestion(q18);
QuestionFaci q19 = new QuestionFaci( "I WILL: I will distribute screwdrivers \n\n Example: to all drivers" );
this.addQuestion(q19);
QuestionFaci q20 = new QuestionFaci( "CREATE A DISH: Chicken --- Soup \n\n Example: Dumpling" );
this.addQuestion(q20);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldV, int newV) {
String upgradeQuery = "ALTER TABLE quest ADD COLUMN question TEXT";
if(newV>oldV)
db.execSQL( upgradeQuery );
onCreate( db );
}
private void addQuestion(QuestionFaci quest) {
ContentValues values = new ContentValues( );
values.put(KEY_QUEST, quest.getQUESTION());
dbase.insert( TABLE_QUEST, null, values );
}
public List<QuestionFaci> getAllQuestions(){
List<QuestionFaci> quesList = new ArrayList<QuestionFaci>( );
String selectQuery = "SELECT * FROM " + TABLE_QUEST;
dbase = this.getReadableDatabase();
Cursor cursor = dbase.rawQuery( selectQuery, null );
if (cursor.moveToFirst()){
do{
QuestionFaci quest = new QuestionFaci( );
quest.setID( cursor.getInt( 0 ) );
quest.setQUESTION( cursor.getString( 1 ) );
quesList.add(quest);
} while (cursor.moveToNext());
}
return quesList;
}
}
您應該將DATABASE_VERSION
變量增加到例如2。這將調用onUpgrade
方法。
這不是最佳方法,但是如果當前數據庫的版本更高,則可以刪除表,然后調用onCreate()
。
@Override
public void onUpgrade(SQLiteDatabase db, int oldV, int newV) {
String upgradeQuery = "DROP TABLE IF EXISTS quest";
db.execSQL( upgradeQuery );
onCreate( db );
}
如前所述,如果保存的數據很簡單,則可以擦除Db,然后重新創建它。 如果其中還有其他數據,可能是用戶結果,用戶進度或其他任何數據,則需要在onUpgrade中正確處理更新。
我通常要做的是擁有一個onUpgrade,它將從android資源中讀取遷移文件。 這些文件將具有數據庫模式更改(如有必要)以及在版本之間遷移數據庫所需的任何更新語句。 我寧願沒有下面的case語句,而是動態地尋找遷移,但是這是一個必不可少的弊端,允許我在必要時定制和調整每個遷移。
@Override
public void onUpgrade(SQLiteDatabase db, ConnectionSource connectionSource, int oldVersion, int newVersion)
{
AppLog.i(TAG, "onUpgrade, oldVersion=["+oldVersion+"], newVersion=["+newVersion+"]");
try
{
// Simply loop round until newest version has been reached and add the appropriate migration
while (++oldVersion <= newVersion)
{
switch (oldVersion)
{
// The version in the case statement is the new (target) version. So case 2: will be an upgrade from 2 to 3.
case 2: {
UpgradeUtils.addUpgrade(oldVersion);
break;
}
case 3: {
UpgradeUtils.addUpgrade(oldVersion);
break;
}
case 7: {
UpgradeUtils.addUpgrade(oldVersion);
}
case 8: {
UpgradeUtils.addUpgrade(oldVersion);
}
}
}
// Get all the available updates
final List<String> availableUpdates = UpgradeUtils.availableUpdates(DatabaseHelper.context.getResources());
AppLog.d(TAG, "Found a total of " + availableUpdates.size() +" update statements" );
for (final String statement : availableUpdates)
{
db.beginTransaction();
try {
AppLog.d(TAG, "Executing statement: " + statement);
db.execSQL(statement);
db.setTransactionSuccessful();
}
finally {
db.endTransaction();
}
}
}
catch (Exception e)
{
Log.e(TAG,"Error executing sql while upgrading database", e);
}
}
UpgradeUtils.java
public class UpgradeUtils
{
private static final String TAG = "UpgradeHelper";
protected static final Set<Integer> mVersionSet;
static
{
mVersionSet = new LinkedHashSet<Integer>();
}
public static final void addUpgrade(final int version)
{
AppLog.d(TAG, "Adding " + version + " to upgrade path");
mVersionSet.add(version);
}
public static List<String> availableUpdates(final Resources resources)
{
final List<String> updates = new ArrayList<String>();
for (Integer version : mVersionSet)
{
// Migration files are kept in assets/updates/migration-X.sql
String fileName = String.format("updates/migration-%s.sql", version);
AppLog.d(TAG, "Adding db version [" + version + "] to update list, loading file ["+ fileName +"]" );
final String sqlStatements = DBUtils.loadAssetFile(resources, fileName);
final String[] splitSql = sqlStatements.split("\\r?\\n");
for (final String sql : splitSql)
{
if (DBUtils.isNotComment(sql))
{
updates.add(sql);
}
}
}
return updates;
}
您還應該考慮從資源文件加載問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.