如何在sqlite数据库中添加第二个表?

4

我有一个名为examguide的数据库,已经创建了一张表格table_subject,现在我想在这个数据库中创建第二张表格(table_chapter)。我的问题是如何将这个表格添加到现有的数据库中?我有以下代码。非常感谢您的帮助。

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
你需要做的第一件事是先理解你为这个第一个表格所写的内容,然后将你的学习应用到创建另一个表格上。你是如何在第一个表格中完成所需的内容,却不知道如何为另一个表格做同样的事情呢? - Nick Bull
请澄清一下您是想知道如何(1)创建一个有两个表的数据库,还是(2)在不删除第一个表的内容的情况下向您的数据库添加第二个表。 - Alex Lockwood
我需要在现有的数据库中添加第二个表。同时,我也想保留我的第一个表。 - Sandip Armal Patil
5个回答

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

1
此外,我不确定这是否是您最初要求的内容,但如果您想添加一个表格而不删除已经存在的数据,则必须像slukian所描述的那样在onUpgrade中添加表格。上面的代码将在数据库首次初始化时创建两个表格。 - Alex Lockwood

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

并增加您传递给 MySqliteHelper 构造函数的数据库版本值(如果您传递了1,则传递2)。


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

3
如果您想向现有数据库添加表格,需要执行以下步骤:您正在使用助手类。这意味着在超导体中解析版本号。在第一次创建此助手对象时,它将调用 onCreate 方法创建初始表。然后只要不更改版本号,在使用创建新实例的类时不会调用任何函数。但是助手还包含一个 onUpgrade 方法。仅当您在超级构造函数中解析的版本号高于之前使用的版本号时,才会调用此函数。因此您需要执行以下操作:
  1. 增加您的常量 DATABASE-VERSION
  2. 重写 onUpgrade 函数并在内部添加 DB.execsql(yourtablecreationstring)

1

您将无法使用onCreate()方法创建第二个表,因为它仅在创建数据库时调用。您可以使用onUpgrade()或创建一个新的方法来完成此操作。使用升级存在一些限制,因为它在version更改时被调用。

因此,最好的方法是在您的Helper类中添加一个新方法。

该方法可能看起来像这样:

    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        
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接