6

我想在我现有的数据库中添加一个额外的表而不丢失数据。因此,删除表并创建新表是没有选择的。最好的方法是什么?

4

5 回答 5

5

这似乎要容易得多。我使用 SQLiteOpenHelper。因此,如果数据库已经存在,则永远不会调用 onCreate()。当版本号增加时,会调用 onUpdate()。在 onUpdate() 中,我添加了“如果不存在则创建表”的新表。从 SQLITE.ORG 的文档中:但是,如果“IF NOT EXISTS”子句被指定为 CREATE TABLE 语句的一部分并且同名的表或视图已经存在,则 CREATE TABLE 命令根本没有效果(并且没有返回错误信息)。现在该表已创建并且很好。

于 2012-07-05T22:09:03.993 回答
3

我这样做的方法是创建一个单独的数据库,将所有内容从当前数据库复制到临时新数据库,然后删除旧数据库在那里做任何事情,然后从临时数据库中复制信息。

不确定是否有其他方法可以做到,但如果有的话,我很想听听

于 2012-07-05T20:15:39.053 回答
1

如果要在现有数据库中添加新表,则应在 onUpgrade() 方法中执行此操作,例如:-

 @Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    if (oldVersion == xyz) {
        db.execSQL(QUERY_CREATE_TABLE_..........NEW);
    }
}

这里xyz是您要在其中添加新表的旧版本数据库。

并记得更新 DATABASE_VERSION

当我们增加数据库版本然后onUpgrade()方法调用,并使用条件添加表。

并且还在 onCreate() 中使用现有表创建一个新表,用于全新安装,例如:-

 @Override
public void onCreate(SQLiteDatabase db) {
        db.execSQL(QUERY_CREATE_TABLE_..........OLD);
        db.execSQL(QUERY_CREATE_TABLE_..........OLD);
        db.execSQL(QUERY_CREATE_TABLE_..........NEW);
}
于 2016-05-19T11:03:52.720 回答
0

创建一个扩展 SQLiteOpenHelper 的类,覆盖 onOpen(SQLiteDatabase db),使用表创建查询创建一个 String,然后使用 db.execSQL(String str);

于 2012-07-05T20:18:50.693 回答
-1

首先你应该了解 onCreate() 和 onUpgrade() 方法

onCreate -当您的数据库第一次创建时 onCreate() 方法被调用。当您第一次安装应用程序时,总是调用 onCreate() 方法

onUpgrade() -当你改变你的数据库版本然后 onUpgrade() 方法调用

所以新用户应该得到所有表,老用户得到所有升级表和新表。

在以下示例中,假设我们正在添加新表Table_5Altering Table_4

public void onCreate(SQLiteDatabase db) {
 //For new User oncreate method will executed an new user get all the table
    db.execSQL( Create_Table );
    db.execSQL( Create_Table2 );
    db.execSQL( Create_Table3 );
    db.execSQL( Create_Table4 );
    db.execSQL( Create_Table5);  
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

      if(oldVersion<newVersion)
        {
           //For old user onUpgrade method is execute 
             db.execSQL( Alter_Table4);
             db.execSQL( Create_Table5);

         }     
}
于 2019-03-15T08:09:48.493 回答