iOS SQLiteデータベースの移行
4476 ワード
最近、データベースの移行について考えざるを得なくなり、バージョンがアップグレードされるたびにローカル・データベースが削除されるという悪い処理が行われていたので、データベースの移行方法を考え始めました.
プロジェクトで使用しているFMDBは、Core Dataを使用する以外はこれが一番です(最近realmがあるようです).
FMDB紹介ページで、FMDBMigrationManagerを見つけ、大喜び.
長い間文書を見て、長い間いじってやっと出てきて、一歩一歩整理しました.
0.FMDBMigrationManagerのインストール
Podfileファイル:
1.FMDBMigrationManagerデータベースの作成
ここで、
2.移行テーブルの作成
作成された移行テーブル名は、
3.作成.sqlファイル
このファイルは、アップグレードのたびに使用されるSQL文を格納するために使用されます.
私が生成したファイル名は:
4.移行関数
プロジェクトを実行し、次のように印刷します.
5.2番目を作成します.sqlファイル
まず上のコマンドを使用します.
CREATE TABLE Grouping( id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, name TEXT );
ALTER TABLE User ADD email TEXT;
ALTER TABLE Grouping ADD remark TEXT;
プロジェクトで使用している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: (
)
User
、id
フィールドを含む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`` , 。