如何将现有的 sqlite 表迁移到具有 VARCHAR、TIMESTAMP 等数据类型的 ROOM Db?

Posted

技术标签:

【中文标题】如何将现有的 sqlite 表迁移到具有 VARCHAR、TIMESTAMP 等数据类型的 ROOM Db?【英文标题】:How to migrate exsiting sqlite table to ROOM Db which have data types like VCHAR, TIMESTAMP? 【发布时间】:2018-10-23 17:31:50 【问题描述】:

在我的旧 sqlite 表中,我有这些列 (id INTEGER PRIMARY KEY AUTOINCREMENT,api_response_json TEXT, api_req TEXT,post_params TEXT,req_type VARCHAR,timestamp TIMESTAMP)

现在我正在尝试将它迁移到 Room DB,如下所示:-

静态最终迁移 MIGRATION_1_2 = new Migration(1, 2)

    @Override
    public void migrate(SupportSQLiteDatabase database) 
    // Create the new table
        database.execSQL(
                "CREATE TABLE users_new (id INTEGER PRIMARY KEY AUTOINCREMENT,api_response_json TEXT, api_req TEXT,post_params TEXT,req_type VARCHAR,timestamp TIMESTAMP)");
    // Copy the data
        database.execSQL("INSERT INTO users_new (id,api_response_json, api_req,post_params,req_type,timestamp) "
                + "SELECT id,api_response_json, api_req,post_params, req_type,timestamp "
                + "FROM old_Table_name");
    // Remove the old table
        database.execSQL("DROP TABLE old_Table_name");
    // Change the table name to the correct one
        database.execSQL("ALTER TABLE users_new RENAME TO old_Table_name");
;

我收到一个错误迁移没有正确处理

预期: TableInfoname='api_data', columns=timestamp=Columnname='timestamp', type='TEXT', notNull=false, primaryKeyPosition=0, req_type=Columnname='req_type', type='TEXT ', notNull=false, primaryKeyPosition=0, post_params=Columnname='post_params', type='TEXT', notNull=false, primaryKeyPosition=0, id=Columnname='id', type='INTEGER ', notNull=false, primaryKeyPosition=1, api_response_json=Columnname='api_response_json', type='TEXT', notNull=false, primaryKeyPosition=0, api_req=Columnname='api_req', type='TEXT ', notNull=false, primaryKeyPosition=0, foreignKeys=[], indices=[]

发现: TableInfoname='api_data', columns=timestamp=Columnname='timestamp', type='TIMESTAMP', notNull=false, primaryKeyPosition=0, req_type=Columnname='req_type', type='VARCHAR ', notNull=false, primaryKeyPosition=0, post_params=Columnname='post_params', type='TEXT', notNull=false, primaryKeyPosition=0, id=Columnname='id', type='INTEGER ', notNull=false, primaryKeyPosition=1, api_response_json=Columnname='api_response_json', type='TEXT', notNull=false, primaryKeyPosition=0, api_req=Columnname='api_req', type='TEXT ', notNull=false, primaryKeyPosition=0, foreignKeys=[], indices=[]

TIMESTAMP 和 VARCHAR 有问题。

【问题讨论】:

【参考方案1】:

是的,TIMESTAMP 和 VARCHAR 有问题 您应该将其更改为:

    static final Migration MIGRATION_1_2 = new Migration(1, 2) 
    @Override
    public void migrate(SupportSQLiteDatabase database) 
        // Create the new table
        database.execSQL(
                "CREATE TABLE users_new (id INTEGER PRIMARY KEY AUTOINCREMENT,api_response_json TEXT, api_req TEXT,post_params TEXT,req_type TEXT,timestamp TEXT)");
        // Copy the data
        database.execSQL("INSERT INTO users_new (id,api_response_json, api_req,post_params,req_type,timestamp) "
                + "SELECT id,api_response_json, api_req,post_params, req_type,timestamp "
                + "FROM old_Table_name");
        // Remove the old table
        database.execSQL("DROP TABLE old_Table_name");
        // Change the table name to the correct one
        database.execSQL("ALTER TABLE users_new RENAME TO old_Table_name");
    ;

答案在您的迁移错误中

【讨论】:

以上是关于如何将现有的 sqlite 表迁移到具有 VARCHAR、TIMESTAMP 等数据类型的 ROOM Db?的主要内容,如果未能解决你的问题,请参考以下文章

如何将现有的 MS Access 移植到 SQLite 以用于 Android 应用程序开发? [复制]

如何将现有的地理服务器独立应用程序迁移到 Web 存档?

如何将现有的 Web 应用程序从 Heroku 迁移到 AWS

从 Sqlite 迁移到 CoreData

如何将现有的一对多关系迁移到 Rails 和 ActiveRecord 中的多对多

如何将现有的 20.04 ext4 安装迁移到不同磁盘上的 zfs root?