2014-08-27 45 views
0

我有一個應用程序與數據庫中的Table1(「DATABASE」)。它工作正常。如何在Android中已經有多個表格的情況下向數據庫添加另一個表格?

當我嘗試將另一個名爲「Table2」的表放入數據庫並在應用程序中使用此新表中的項目時,警報消息將如下所示。

08-28 00:05:58.101:E/AndroidRuntime(6317): android.database.sqlite.SQLiteException:沒有這樣的表:表2(代碼 1):由引起的,在編譯時:選擇_id,MissionNumber,NAME1 NUM1,NAME2 NUM2從表2 08-28 00:05:58.101:E/AndroidRuntime(6317):在 android.database.sqlite.SQLiteConnection.nativePrepareStatement(母語 方法)

但是,如果我刪除以前的程序,並把表2,然後它的作品。我的做法是將代碼放入DatabaseHelper的「onCreate」部分。

但是我想,下載我的程序的人不會自動致力於清除以前的程序。所以我想要的是,當人們下載新的table2的應用程序時,它會正常工作。

我插入新表的方式是,

private class DatabaseHelper extends SQLiteOpenHelper { 
     public DatabaseHelper(Context context) { 
      super(context, DATABASE_NAME, null, DATABASE_VERSION); 
     } 

     public void onCreate(SQLiteDatabase db) { 


    try { 
       String DROP_SQL = "DROP TABLE IF EXISTS " + "Table1"; 
       db.execSQL(DROP_SQL); 
      } catch(Exception ex) { 

      } 

      String CREATE_SQL1 = "create table " + "Table1" + "(" 
          + " _id integer PRIMARY KEY autoincrement, " 
          + " MissionNumber text, " 
          + " NAME1 text, " 
          + " NUM1 int, " 
          + " NAME2 text," 
          + " NUM2 int)"; 


      try { 
       db.execSQL(CREATE_SQL1); 
      } catch(Exception ex) { 

      } 
       TABLE_NAME = "Table1"; 

      try { 

       db.execSQL("insert into " + TABLE_NAME + "(MissionNumber, NAME1, NUM1, NAME2, NUM2) values ('GROUP1', 'lucky_teleport', 0, 'pass', '0');"); 
       db.execSQL("insert into " + TABLE_NAME + "(MissionNumber, NAME1, NUM1, NAME2, NUM2) values ('GROUP2', 'no', 0, 'notyet', '0');"); 

      } catch(Exception ex) { 

      } 

 try { 
       String DROP_SQL = "DROP TABLE IF EXISTS " + "Table2"; 
       db.execSQL(DROP_SQL); 
      } catch(Exception ex) { 

      } 

      String CREATE_SQL2 = "create table " + "Table2" + "(" 
          + " _id integer PRIMARY KEY autoincrement, " 
          + " MissionNumber text, " 
          + " NAME1 text, " 
          + " NUM1 int, " 
          + " NAME2 text," 
          + " NUM2 int)"; 


      try { 
       db.execSQL(CREATE_SQL2); 
      } catch(Exception ex) { 

      } 
       TABLE_NAME = "Table2"; 

      try { 

       db.execSQL("insert into " + TABLE_NAME + "(MissionNumber, NAME1, NUM1, NAME2, NUM2) values ('GROUP1', 'lucky_teleport', 0, 'pass', '0');"); 
       db.execSQL("insert into " + TABLE_NAME + "(MissionNumber, NAME1, NUM1, NAME2, NUM2) values ('GROUP2', 'no', 0, 'notyet', '0');"); 

      } catch(Exception ex) { 

      } 

這不是容易的,我完全理解數據庫是什麼。請分享好的想法,不要抹去以前的程序,將新表添加到數據庫中!

+0

看看這會幫助你:http://androidforbeginners.blogspot.com/2010/01/creating-multiple-sqlite-database。html – user3487063 2014-08-27 15:26:55

回答

0

的onCreate如果數據庫不存在,一個新的數據庫需要的CreateDC 如果你有安裝了應用程序的早期版本只叫,不執行已經存在的數據庫,裏面的onCreate(代碼)

,以更新數據庫,您需要從SQLiteOpenHelper重寫此方法:

onUpgrade(SQLiteDatabase分貝,INT oldVersion,INT NEWVERSION)

例如:

@Override 
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion){ 
    String CREATE_SQL2 = "create table " + "Table2" + "(" 
         + " _id integer PRIMARY KEY autoincrement, " 
         + " MissionNumber text, " 
         + " NAME1 text, " 
         + " NUM1 int, " 
         + " NAME2 text," 
         + " NUM2 int)"; 

    try { 
     db.execSQL(CREATE_SQL2); 
    } catch(Exception ex) { 

    } 

    TABLE_NAME = "Table2"; 

    try { 
     db.execSQL("insert into " + TABLE_NAME + "(MissionNumber, NAME1, NUM1, NAME2, NUM2) values ('GROUP1', 'lucky_teleport', 0, 'pass', '0');"); 
     db.execSQL("insert into " + TABLE_NAME + "(MissionNumber, NAME1, NUM1, NAME2, NUM2) values ('GROUP2', 'no', 0, 'notyet', '0');") 
    } catch(Exception ex) { 

    } 
} 

爲了使您的應用程序調用onUpgrade()方法,你應該通過一個DATABASE_VERSION值比當你第一次創建數據庫

public DatabaseHelper(Context context) { 
    super(context, DATABASE_NAME, null, DATABASE_VERSION); 
} 

,所以你通過了一個更大的,如果你的DATABASE_VERSION常量等於1,只需將它增加到2,你的onUpgrade()方法就會被調用。

如果新安裝了應用程序,將調用onCreate()方法而不是onUpgrade(),因此您應該在兩種方法中實現表創建代碼(或者在兩種方法中調用表創建代碼)添加您的Table2到數據庫)

+0

哇,它絕對工作!感謝您與我分享您的偉大意見! :) – 2014-08-28 01:00:44

相關問題