【问题标题】:Create additional table in existing SQLITE (without data loss)在现有 SQLITE 中创建附加表(不丢失数据)
【发布时间】:2012-07-05 20:12:46
【问题描述】:

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

【问题讨论】:

    标签: android sql sqlite


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

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

      如果您想在现有数据库中添加新表,那么您应该在 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);
      }
      

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          【解决方案5】:

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

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

          onUpgrade()- 当您更改数据库版本时,onUpgrade() 方法调用

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

          在以下示例中,假设我们正在添加新表 Table_5 并更改 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);
          
                   }     
          }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2012-12-29
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-10-14
            • 2018-05-20
            • 1970-01-01
            • 2013-06-30
            相关资源
            最近更新 更多