iOS SQLiteデータベースの移行

4476 ワード

最近、データベースの移行について考えざるを得なくなり、バージョンがアップグレードされるたびにローカル・データベースが削除されるという悪い処理が行われていたので、データベースの移行方法を考え始めました.
プロジェクトで使用しているFMDBは、Core Dataを使用する以外はこれが一番です(最近realmがあるようです).
FMDB紹介ページで、FMDBMigrationManagerを見つけ、大喜び.
長い間文書を見て、長い間いじってやっと出てきて、一歩一歩整理しました.
0.FMDBMigrationManagerのインストール
Podfileファイル:
platform :ios, "7.0"

pod 'FMDB'
pod 'FMDBMigrationManager'
pod installコマンドでインストール
1.FMDBMigrationManagerデータベースの作成
FMDBMigrationManager *manager = [FMDBMigrationManager managerWithDatabaseAtPath:[YMDatabaseHelper databasePath]  migrationsBundle:[NSBundle mainBundle]];

ここで、[YMDatabaseHelper databasePath]はデータベースパスです.
2.移行テーブルの作成
BOOL resultState = [manager createMigrationsTable:&error];

作成された移行テーブル名は、schema_migrationsです.
3.作成.sqlファイル
このファイルは、アップグレードのたびに使用されるSQL文を格納するために使用されます.FMDBMigrationManagerでは、バージョン番号としてタイムスタンプを使用することをお勧めします.次のコマンドを使用してファイルを生成します.
touch "`ruby -e "puts Time.now.strftime('%Y%m%d%H%M%S%3N').to_i"`"_CreateMyAwesomeTable.sql

私が生成したファイル名は:20150420170044940_CreateMyAwesomeTable.sqlで、そのうち20150420170044940は移行のバージョン番号IDです.20150420170044940_CreateMyAwesomeTable.sqlファイルにユーザー・テーブルを作成し、次のように書き込みます.
CREATE TABLE User(
id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
name TEXT
);

4.移行関数
FMDBMigrationManager *manager = [FMDBMigrationManager managerWithDatabaseAtPath:[YMDatabaseHelper databasePath]  migrationsBundle:[NSBundle mainBundle]];
    
BOOL resultState = NO;
NSError *error = nil;
if (!manager.hasMigrationsTable) {
    resultState = [manager createMigrationsTable:&error];
}
    
resultState = [manager migrateDatabaseToVersion:UINT64_MAX progress:nil error:&error];//    

NSLog(@"Has `schema_migrations` table?: %@", manager.hasMigrationsTable ? @"YES" : @"NO");
NSLog(@"Origin Version: %llu", manager.originVersion);
NSLog(@"Current version: %llu", manager.currentVersion);
NSLog(@"All migrations: %@", manager.migrations);
NSLog(@"Applied versions: %@", manager.appliedVersions);
NSLog(@"Pending versions: %@", manager.pendingVersions);
UINT64_MAXは、データベースを最大のバージョンに移行することを示します.
プロジェクトを実行し、次のように印刷します.
2015-04-20 20:50:19.033 YMFMDatabase[12654:1326201] Has `schema_migrations` table?: YES
2015-04-20 20:50:19.036 YMFMDatabase[12654:1326201] Origin Version: 20150420170044940
2015-04-20 20:50:19.036 YMFMDatabase[12654:1326201] Current version: 20150420170044940
2015-04-20 20:50:19.037 YMFMDatabase[12654:1326201] All migrations: (
    ""
)
2015-04-20 20:50:19.037 YMFMDatabase[12654:1326201] Applied versions: (
    20150420170044940
)
2015-04-20 20:50:19.038 YMFMDatabase[12654:1326201] Pending versions: (
)
Useridフィールドを含むnameテーブルが作成されたかどうかiFunBoxで確認します.およびFMDBMigrationManagerによって生成されたschema_migrations表.
5.2番目を作成します.sqlファイル
まず上のコマンドを使用します.
touch "`ruby -e "puts Time.now.strftime('%Y%m%d%H%M%S%3N').to_i"`"_CreateMyAwesomeTable.sql```

  ,     :``20150420170557221_CreateMyAwesomeTable.sql``。

    sql   ,            ``Grouping``,     ``User``        :``email``。.sql       :


CREATE TABLE Grouping( id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, name TEXT );
ALTER TABLE User ADD email TEXT;

##6.      .sql   

    ,       ``Grouping``         ``remark``:

    :  


ALTER TABLE Grouping ADD remark TEXT;

OK,      ,         ``Grouping``  ,    ``id``,``name``,``remark``  ,   ``User``           ``email``   。


##7.     

       Demo  ,         ,     ``User``     ``name``  ,      ,Google     [  ](http://stackoverflow.com/questions/8442147/how-to-delete-or-add-column-in-sqlite)。

>SQLite supports a limited subset of ALTER TABLE. The ALTER TABLE command in SQLite allows the user to rename a table or to add a new column to an existing table. It is not possible to rename a column, remove a column, or add or remove constraints from a table.

   :    ``SQLite``   ``ALERT TABLE``      ,``SQLite``    ``ALERT TABLE``                   ,                 。