2012-03-21 77 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   
    } 
相关问题