2012-03-21 78 views
3

我有數據庫examguide,我已經創建了一個表table_subject,現在
我想在此數據庫中創建第二個表(table_chapter)。我的問題是如何在現有數據庫中添加此表?我有以下代碼。任何幫助讚賞。如何在sqlite中添加數據庫中的第二個表?

private static final String DATABASE_CREATE = "create table IF NOT EXISTS " 
     + TABLE_SUBJECT + "(" + COLUMN_ID 
     + " integer primary key autoincrement, " 
     + COLUMN_SUBJECT + " text not null, " 
     + COLUMN_CHAPTER + " text, " 
     + COLUMN_QUESTION + " text not null," 
     + COLUMN_OPTIONA + " text not null," 
     + COLUMN_OPTIONB + " text not null," 
     + COLUMN_OPTIONC + " text not null," 
     + COLUMN_OPTIOND + " text not null," 
     + COLUMN_CORRECT + " text not null," 
     + COLUMN_CONFIRM + " text not null);"; 

    private static final String DATABASE_CREATE1 = "create table IF NOT EXISTS " 
    + TABLE_CHAPTER + "(" + COLUMN_ID 
    + " integer primary key autoincrement, " 
    + COLUMN_SUBJECT + " text not null, " 
    + COLUMN_CHAPTER + " text, " 
    + COLUMN_QUESTION + " text not null," 
    + COLUMN_OPTIONA + " text not null," 
    + COLUMN_OPTIONB + " text not null," 
    + COLUMN_OPTIONC + " text not null," 
    + COLUMN_OPTIOND + " text not null," 
    + COLUMN_CORRECT + " text not null," 
    + COLUMN_CONFIRM + " text not null);"; 

public MySQLiteHelper open() throws SQLException 
{ 
    db = this.getWritableDatabase(); 
    return this; 
} 

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

} 


@Override 
public void onCreate(SQLiteDatabase database) { 

    database.execSQL(DATABASE_CREATE); 
    database.execSQL(DATABASE_CREATE1); 

} 

此代碼不創建第二個表。我想要我的數據庫中的兩個表。
它在logcat中顯示以下錯誤。

03-21 18:31:06.551: ERROR/Database(8255): Error inserting chapter=paging correctoption=shadow copy craete a duplicate copy of page subject=operating system question=what is shadow copy? optiona=shadow copy craete a duplicate copy of page confirm=YES optionb=sahdow copy create paging optionc=shadow copy delete duplicate page optiond=shadow copy delete original and create shadow copy 
03-21 18:31:06.551: ERROR/Database(8255): android.database.sqlite.SQLiteException: no such table: chapter: , while compiling: INSERT INTO chapter(chapter, correctoption, subject, question, optiona, confirm, optionb, optionc, optiond) VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?); 
03-21 18:31:06.551: ERROR/Database(8255):  at android.database.sqlite.SQLiteCompiledSql.native_compile(Native Method) 
03-21 18:31:06.551: ERROR/Database(8255):  at android.database.sqlite.SQLiteCompiledSql.compile(SQLiteCompiledSql.java:92) 
03-21 18:31:06.551: ERROR/Database(8255):  at android.database.sqlite.SQLiteCompiledSql.<init>(SQLiteCompiledSql.java:65) 
03-21 18:31:06.551: ERROR/Database(8255):  at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:83) 
03-21 18:31:06.551: ERROR/Database(8255):  at android.database.sqlite.SQLiteStatement.<init>(SQLiteStatement.java:41) 
03-21 18:31:06.551: ERROR/Database(8255):  at android.database.sqlite.SQLiteDatabase.compileStatement(SQLiteDatabase.java:1149) 
03-21 18:31:06.551: ERROR/Database(8255):  at android.database.sqlite.SQLiteDatabase.insertWithOnConflict(SQLiteDatabase.java:1569) 
03-21 18:31:06.551: ERROR/Database(8255):  at android.database.sqlite.SQLiteDatabase.insert(SQLiteDatabase.java:1426) 
03-21 18:31:06.551: ERROR/Database(8255):  at com.example.examguide.MySQLiteHelper.insertChapterData(MySQLiteHelper.java:212) 
03-21 18:31:06.551: ERROR/Database(8255):  at com.example.examguide.ObjectiveAddActivity$2.onClick(ObjectiveAddActivity.java:155) 
+2

你需要做的是首先的理解它是什麼,你已經爲這個第一個表寫,然後應用你的學習創建另一個表。你是怎麼設法寫出你爲第一張桌子所做的,但你不知道如何爲另一張桌子做同樣的事情呢? – 2012-03-21 11:54:37

+0

請澄清您是否想要知道如何(1)創建一個帶有2個表的數據庫,或者(2)向您的數據庫添加第二個表,然後刪除第一個表的內容。 – 2012-03-21 12:27:15

+0

我需要在現有的數據庫中添加第二個表。我也想保留我的第一張表 – 2012-03-21 12:54:05

回答

9

再拍CREATE TABLE字符串,然後在你的onCreate,叫execSQL一次:

database.execSQL(DATABASE_CREATE1); 
database.execSQL(DATABASE_CREATE2); 

編輯

到另一個表添加到現有的數據庫,修改onUpgrade方法如下。每當數據庫需要升級時調用onUpgrade;請注意,您必須增加VERSION_NUMBER(您希望將其作爲私有實例變量包含在您的類中)以使其生效。

@Override 
public void onUpgrade (SQLiteDatabase db, int oldVersion, int newVersion) { 
    db.executeSQL(DATABASE_CREATE2); 
} 
+0

另外,我不確定這是否是你最初要求的,但如果你想添加一個表而不刪除已經存在的數據,那麼你必須在onUpgrade中添加表,如slukian。上面的代碼將在數據庫首次初始化時在數據庫中創建兩個表。 – 2012-03-21 12:07:28

+0

非常感謝! – 2012-03-21 13:12:19

3

使用此代碼,您可以創建多個表

private static final String ALERT_DATABASE="alerts.db"; 

//Database Version of Alert System 
private static final int ALERT_DATABASE_VERSION=1; 

//Create alert_type table 
private static final String CREATE_ALERT_TYPE="CREATE TABLE " 
     +ALERT_TYPE+"("+ALERT_TYPE_ID+" INTEGER PRIMARY KEY AUTOINCREMENT," 
     +ALERT_TYPE_NAME+" TEXT,"+ALERT_TYPE_TONE+" VARCHAR)"; 


private static final String CREATE_ALERT_INFORMATION="CREATE TABLE " 
     +ALERT_INFO+"("+ALERT_INFO_ID+" INTEGER PRIMARY KEY AUTOINCREMENT," 
     +ALERT_INFO_TITLE+" TEXT," 
     +ALERT_INFO_DATE+" VARCHAR," 
     +ALERT_INFO_TIME+" VARCHAR," 
     +ALERT_INFO_DESCRIPTION+" VARCHAR," 
     +ALERT_INFO_TYPE_ID+" VARCHAR)"; 


public AlertDatabase(Context context) { 
    super(context, ALERT_DATABASE, null, ALERT_DATABASE_VERSION); 
    // TODO Auto-generated constructor stub 
} 
@Override 
public void onCreate(SQLiteDatabase alertdatabase){ 
    alertdatabase.execSQL(CREATE_ALERT_TYPE); 
    alertdatabase.execSQL(CREATE_ALERT_INFORMATION); 
} 
6

如果您想將表添加到現有的數據庫,然後使用MySqliteHelperonUpgrade()方法:

@Override 
public void onUpgrade (SQLiteDatabase db, int oldVersion, int newVersion) { 
    // Create the string for the second table creation 
    db.executeSQL(DATABASE_CREATE_SECOND_TABLE); 
} 

並且還會增加傳遞給構造函數的數據庫版本的值(如果傳遞1則傳遞2)。

+0

非常感謝! – 2012-03-21 13:12:49

3

如果要將表添加到現有數據庫,您必須執行以下操作: 您正在使用助手類。這意味着你要在超導體中解析一個版本號。在第一次創建這個幫助對象時,它會調用onCreate方法來創建你的初始表。然後,只要您不更改版本號,當您使用創建類的新實例時,將不會調用任何函數。但該幫手還包含一個onUpgrade方法。只有當您在超級構造函數中解析的版本號高於您之前使用的版本號時纔會調用此函數。所以你要做的:

  1. 增加你不斷DATABASE-VERSION
  2. 重寫onUpgrade功能,並添加內DB.execsql(yourtablecreationstring)
1

您將無法使用onCreate()方法來創建第二個表,因爲它僅在創建數據庫調用。您可以使用onUpgrade()或創建一個新方法來執行此操作。在升級時使用有一些限制,因爲它在version更改時被調用。

所以最好的方法是在你的助手類中添加一個新的方法。

該方法可以是這個樣子,

public void AddnewTable(){ 
    //At first you will need a Database object.Lets create it. 
    SQLiteDatabase ourDatabase=this.getWritableDatabase(); 

    ourDatabase.execSQL(CreateTableString)//CreateTableString is the SQL Command String   
    } 
相關問題