Как добавить вторую таблицу в базу данных в sqlite? - PullRequest
3 голосов
/ 21 марта 2012

У меня есть база данных 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)

Ответы [ 5 ]

9 голосов
/ 21 марта 2012

Создайте еще одну 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);
}
6 голосов
/ 21 марта 2012

Если вы хотите добавить таблицу в уже существующую базу данных, используйте метод onUpgrade() MySqliteHelper:

@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 голосов
/ 21 марта 2012

Если вы хотите добавить таблицу в существующую базу данных, вы должны сделать следующее: Вы используете вспомогательный класс.Это означает, что в сверхпроводнике вы анализируете номер версии.При первом создании этого вспомогательного объекта он вызовет метод onCreate, который создаст вашу исходную таблицу.Тогда, пока вы не измените номер версии, никакая функция не будет вызываться при использовании создания нового экземпляра вашего класса.Но помощник также содержит метод onUpgrade.Эта функция вызывается только тогда, когда номер версии, которую вы анализируете в супер-конструкторе, больше, чем тот, который вы использовали ранее.Итак, что вы должны сделать:

  1. Увеличьте свою постоянную DATABASE-VERSION.
  2. Переопределить функцию onUpgrade и добавить внутрь DB.execsql(yourtablecreationstring)
3 голосов
/ 21 марта 2012

Используя этот код, вы можете создать несколько таблиц

    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);
}
1 голос
/ 19 апреля 2015

Вы не сможете использовать метод 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        
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...