2016-09-07 100 views
1

我对SQLite来说很新。
如何升级数据库?升级我的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; 

    } 
} 

回答

1

您应该增加你的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);  
    } 
+0

更改我的数据库版本会引发我的应用程序崩溃。 –

+0

你能发布那个错误吗? – matejko219

+0

你的解决方案工作的伴侣。我没有任何东西附加到我的数据库中,例如分数,进度,所以我可以轻松地删除表格并用新的替换它。现在,如果我有相关数据,情况可能会改变。 –

1

如果您保存的数据是简单的,如前所述,即可抹数据库,然后重新创建它。如果您有其他数据,可能是用户结果,用户进度或其他任何信息,则需要在onUpgrade中正确处理更新。

我通常会做的是有一个onUpgrade,它将从android资源读取迁移文件。这些文件将进行数据库模式更改(如有必要)以及在版本之间迁移数据库所需的任何更新语句。我宁愿没有下面的案例陈述,并动态地寻找迁移,但这是一个必要的罪恶,允许我在必要时调整和调整每个迁移。

@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; 
    } 

你也应该考虑从资源文件加载您的问题也是如此。

+0

让我对你的解决方案加里做一点实验。 –