2012-08-28 128 views
1

我試圖調用onUpgrade()來更新我的表,只有很少的列。但是,當我運行應用程序時,在插入語句中出現錯誤,表示列中不存在列(我嘗試在onUpgrade()中添加列),我將非常感謝您的幫助 以下是我的SQLite幫助器類: //更新WORKINGonUpgrade()方法無法正常工作

public class TasksSQLiteOpenHelper extends SQLiteOpenHelper { 
public static final int VERSION = 3; 
public static final String DB_NAME = "tasks_db.sqlite"; 
public static final String TASKS_TABLE = "tasks"; 
public static final String TASK_ID = "id"; 
public static final String TASK_NAME = "name"; 
public static final String TASK_RESPONSIBLE = "responsible"; 
public static final String TASK_PRIORITY = "priority"; 
public static final String TASK_DATETIME = "taskdatetime"; 


public TasksSQLiteOpenHelper(Context context) { 
    super(context, DB_NAME, null, VERSION); 
} 

@Override 
public void onCreate(SQLiteDatabase db) { 
    createTables(db); 
} 

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

    Log.v("test",Integer.toString(oldVersion)); 
    Log.v("test", Integer.toString(newVersion)); 
switch(oldVersion){ 

case 1: db.execSQL("ALTER TABLE "+ TASKS_TABLE +" ADD COLUMN "+ TASK_RESPONSIBLE +" TEXT"); 
     db.execSQL("ALTER TABLE "+ TASKS_TABLE +" ADD COLUMN "+ TASK_PRIORITY +" TEXT"); 
     Log.v("test","res + pri created"); 
     break; 

case 2: db.execSQL("ALTER TABLE "+ TASKS_TABLE +" ADD COLUMN "+ TASK_DATETIME +" TEXT"); 
     Log.v("test","date created"); 
     break; 
    } 
} 

    protected void createTables(SQLiteDatabase db) { 
     db.execSQL(
     "create table " + TASKS_TABLE+" (" + 
     TASK_ID + " integer primary key,"+ 
     TASK_NAME + " text"+ 
     ");" 
     ); 
} 

} 這是我的應用程序類//更新,工作液

public class TaskManagerApplication extends Application { 

private ArrayList<Task> currentTasks; 
public SQLiteDatabase database; 

@Override 
public void onCreate() { 
    super.onCreate(); 
    TasksSQLiteOpenHelper helper = new TasksSQLiteOpenHelper(this); 
    database = helper.getWritableDatabase(); 
    if (null == currentTasks) { 
     loadTasks(); 
    } 
} 
private void loadTasks() { 
    currentTasks = new ArrayList<Task>(); 
    Cursor tasksCursor = database.query(TASKS_TABLE, new String[] {TASK_ID, TASK_NAME,TASK_RESPONSIBLE,TASK_PRIORITY,TASK_DATETIME}, null, null, null, null, null); 
    tasksCursor.moveToFirst(); 
    Task t; 
    if (! tasksCursor.isAfterLast()) { 
     do { 
      long id = tasksCursor.getLong(0); 
      String name = tasksCursor.getString(1); 
      String responsible = tasksCursor.getString(2); 
      String priority = tasksCursor.getString(3); 
      String datetime = tasksCursor.getString(4); 
      t = new Task(name, priority, responsible, datetime); 
      t.setId(id); 
      currentTasks.add(t); 
     } while (tasksCursor.moveToNext()); 
    } 
    tasksCursor.close(); 
} 

public void setCurrentTask(ArrayList<Task> currentTask) { 
    this.currentTasks = currentTask; // set tasks in array 
} 

public ArrayList<Task> getCurrentTasks() { 
    return currentTasks; //call back tasks 
} 

public void addTask(Task t) { // add new t of type Task 
    assert(null != t); //check for null entries - avoid crashing 
    ContentValues values = new ContentValues(); 
    values.put(TASK_NAME, t.getName()); 
    values.put(TASK_PRIORITY, t.getPriority()); 
    values.put(TASK_RESPONSIBLE, t.getResponsible()); 
    values.put(TASK_DATETIME, t.getDatetime()); 
    //Log.v("test", TASK_DATETIME); 
    t.setId(database.insert(TASKS_TABLE, null, values)); 
    currentTasks.add(t); 
} 

public void remove(long id){ 
    //remove statement from table using where statement id 
    database.delete(TASKS_TABLE, TASK_ID +" ="+ id, null); 
} 

}

也在這裏是我的logcat的輸出

08-28 16:30:41.170: I/Database(8931): sqlite returned: error code = 1, msg = table  tasks has no column named datetime 
    08-28 16:30:41.190: E/Database(8931): Error inserting datetime=Aug 28, 2012 4:30:41 PM responsible=Me priority=Medium name=go chi 
    08-28 16:30:41.190: E/Database(8931): android.database.sqlite.SQLiteException: table tasks has no column named datetime: , while compiling: INSERT INTO tasks(datetime,  responsible, priority, name) VALUES(?, ?, ?, ?); 
    08-28 16:30:41.190: E/Database(8931): at  android.database.sqlite.SQLiteCompiledSql.native_compile(Native Method) 
    08-28 16:30:41.190: E/Database(8931): at android.database.sqlite.SQLiteCompiledSql.compile(SQLiteCompiledSql.java:92) 
    08-28 16:30:41.190: E/Database(8931): at android.database.sqlite.SQLiteCompiledSql.<init>(SQLiteCompiledSql.java:65) 
    08-28 16:30:41.190: E/Database(8931): at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:83) 
    08-28 16:30:41.190: E/Database(8931): at android.database.sqlite.SQLiteStatement.<init>(SQLiteStatement.java:41) 
    08-28 16:30:41.190: E/Database(8931): at android.database.sqlite.SQLiteDatabase.compileStatement(SQLiteDatabase.java:1290) 
    08-28 16:30:41.190: E/Database(8931): at android.database.sqlite.SQLiteDatabase.insertWithOnConflict(SQLiteDatabase.java:1710) 
    08-28 16:30:41.190: E/Database(8931):  at android.database.sqlite.SQLiteDatabase.insert(SQLiteDatabase.java:1567) 
    08-28 16:30:41.190: E/Database(8931):  at com.id11078995.ghnaim.exercise1.TaskManagerApplication.addTask(TaskManagerApplication.java:64) 
    08-28 16:30:41.190: E/Database(8931):  at com.id11078995.ghnaim.exercise1.AddTaskActivity.addTask(AddTaskActivity.java:59) 
    08-28 16:30:41.190: E/Database(8931):  at com.id11078995.ghnaim.exercise1.AddTaskActivity.onOptionsItemSelected(AddTaskActivity.java:134) 
    08-28 16:30:41.190: E/Database(8931):  at and roid.app.Activity.onMenuItemSelected(Activity.java:2211) 
    08-28 16:30:41.190: E/Database(8931):  at com.android.internal.policy.impl.PhoneWindow.onMenuItemSelected(PhoneWindow.java:775) 
    08-28 16:30:41.190: E/Database(8931):  at com.android.internal.view.menu.MenuItemImpl.invoke(MenuItemImpl.java:143) 
    08-28 16:30:41.190: E/Database(8931):  at com.android.internal.view.menu.MenuBuilder.performItemAction(MenuBuilder.java:860) 
    08-28 16:30:41.190: E/Database(8931):  at com.android.internal.view.menu.IconMenuView.invokeItem(IconMenuView.java:532) 
    08-28 16:30:41.190: E/Database(8931):  at com.android.internal.view.menu.IconMenuItemView.performClick(IconMenuItemView.java:122) 
    08-28 16:30:41.190: E/Database(8931):  at android.view.View$PerformClick.run(View.java:9152) 
    08-28 16:30:41.190: E/Database(8931):  at android.os.Handler.handleCallback(Handler.java:587) 
    08-28 16:30:41.190: E/Database(8931):  at android.os.Handler.dispatchMessage(Handler.java:92) 
    08-28 16:30:41.190: E/Database(8931):  at android.os.Looper.loop(Looper.java:130) 
    08-28 16:30:41.190: E/Database(8931):  at android.app.ActivityThread.main(ActivityThread.java:3691) 
    08-28 16:30:41.190: E/Database(8931):  at java.lang.reflect.Method.invokeNative(Native Method) 
    08-28 16:30:41.190: E/Database(8931):  at java.lang.reflect.Method.invoke(Method.java:507) 
    08-28 16:30:41.190: E/Database(8931):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:907) 
    08-28 16:30:41.190: E/Database(8931):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:665) 
    08-28 16:30:41.190: E/Database(8931):  at dalvik.system.NativeStart.main(Native Method) 
+0

我認爲datetime是SQLite中的一個關鍵字。爲了測試,嘗試重命名該代碼並再次執行您的代碼。 此外,你增加了那個領域的數量?:public static final int VERSION = 3; –

+0

是的,我確實增加了它..起初它是1,然後我必須添加責任和優先級列。然後我被要求添加日期時間列,所以我結束了版本3.這有點愚蠢,但那是什麼被要求做的練習(單方面)。 我嘗試重命名列和病後我的結果 –

+0

更新//將datetime更改爲td,現在我在責任領域得到一個錯誤。我認爲升級()不更新表,因此這些列不存在。 –

回答

0

如果沒有必要保存舊的數據,我認爲這是更新數據庫的一種更簡單的方法:

@Override 
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
    Log.w(MySQLiteHelper.class.getName(), 
    "Upgrading database from version " + oldVersion + " to " 
     + newVersion + ", which will destroy all old data"); 
    db.execSQL("DROP TABLE IF EXISTS " + TABLE_TASKS); 
    onCreate(db); 
} 

@Override 
public void onCreate(SQLiteDatabase database) { 
    database.execSQL(DATABASE_CREATE); 
} 

你最後絃樂DATABASE_CREATE包括所有字段。刪除主鍵定義中的「NOT NULL」和「autoincrement」。

  • 清理項目
  • 卸載應用程序
  • 重新安裝一遍。

欲瞭解更多信息:Vogella

嘗試這種解決方案,而不會丟失數據:

public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
    Log.w(MySQLiteHelper.class.getName(), 
    "Upgrading database from version " + oldVersion + " to " 
     + newVersion); 
    boolean lDateTimeExists = isColumnExisting(TASK_DATETIME); 
    boolean lResponsible = isColumnExisting(TASK_RESPONSIBLE); 
    boolean lPrio = isColumnExisting(TASK_PRIORITY); 
    if (!lDateTime){ 
    db.execSQL("ALTER TABLE "+ TASKS_TABLE +" ADD COLUMN "+ TASK_DATETIME +" TEXT"); 
    } 
    if (!lResponsible){ 
    db.execSQL("ALTER TABLE "+ TASKS_TABLE +" ADD COLUMN "+ TASK_RESPONSIBLE);  
    } 
    if (!lPrio){ 
    db.execSQL("ALTER TABLE "+ TASKS_TABLE +" ADD COLUMN "+ TASK_PRIORITY +" TEXT");  
    } 
} 

private boolean isColumnExisting(String pColumnName){ 
    try{ 
    db.execSQL("SELECT "+pColumnName+" from "+TABLE_TASKS); 
    }catch(Exception e){ 
    return false; 
    } 
    return true; 
} 
+0

謝謝..每個人似乎都指向我放下桌子,並創建一個新的。但不幸的是我不允許放棄它。否則我會失去分數。再次感謝您的幫助。真的很感謝你的努力 –

+0

請看我更新的答案... –

+0

測試現在..病很快發佈我的結果 –

0

剛剛卸載並重新安裝應用程序希望它會奏效。

+0

試圖......沒有工作。儘管感謝您的回覆。任何其他建議? –

+0

然後必須檢查你創建查詢。 –

+0

[鏈接](http://stackoverflow.com/questions/12131835/android-sqlitedatabase-column-doesnt-exist-error)檢查此 –

0

我想這太明顯了,但是您是否更改了數據庫版本?如果不是onUpgrade()方法不會工作