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

Posted

技术标签:

【中文标题】如何在sqlite的数据库中添加第二个表?【英文标题】:How to add second table in database in sqlite? 【发布时间】:2021-11-18 12:55:30 【问题描述】:

我有数据库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)

【问题讨论】:

您需要做的是首先了解您为第一个表编写的内容,然后应用您的学习来创建另一个表。你是如何设法写下你为第一个表所做的,但你不知道如何为另一个表做同样的事情? 请说明您是否想知道如何 (1) 创建一个包含 2 个表的数据库,或者 (2) 将第二个表添加到您的数据库而不删除第一个表的内容。跨度> 我需要在现有数据库中添加第二个表。我也想保留我的第一张桌子 【参考方案1】:

创建另一个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);

【讨论】:

另外,我不确定这是否是您最初要求的,但如果您想添加一个不删除现有数据的表格,那么您必须添加表格在onUpgrade 中,如 slukian 所述。当数据库第一次初始化时,上面的代码将在你的数据库中创建两个表。【参考方案2】:

如果要将表添加到已经存在的数据库中,请使用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);

【讨论】:

【参考方案4】:

如果要将表添加到现有数据库,您必须执行以下操作: 您正在使用帮助程序类。这意味着在超导体中您正在解析版本号。在第一次创建这个帮助对象时,它会调用onCreate 方法来创建你的初始表。然后,只要您不更改版本号,当您使用创建类的新实例时,就不会调用任何函数。但是这个助手还包含一个onUpgrade 方法。只有当你在超级构造函数中解析的版本号高于你之前使用的版本号时,才会调用此函数。所以你必须做的:

    增加常量DATABASE-VERSION。 覆盖onUpgrade 函数并在DB.execsql(yourtablecreationstring) 内部添加

【讨论】:

【参考方案5】:

您将无法使用onCreate()method 创建第二个表,因为它仅在创建数据库时调用。您可以使用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        
    

【讨论】:

以上是关于如何在sqlite的数据库中添加第二个表?的主要内容,如果未能解决你的问题,请参考以下文章

将第二个表中的第二个(条件)结果添加到 SQL 查询

左外连接 - 如何在第二个表中返回一个布尔值?

如何加入/子查询第二个表

如何使用 laravel 集合获取最后插入的 ID 并将其插入到第二个表中?

如何在 EF / EF Core 中的第二个表上实现具有某些条件的左连接?

在 Scala Play 框架中映射 OneToMany 不向第二个表插入数据