FMDB 的扩展,为您的 iOS 应用提供 ORM 和迁移功能。
注意:我在以上条件下测试了此产品。
您可以通过 CocoaPods 安装 FMDBx。请将以下行添加到您的 Podfile 中。
pod 'FMDBx'
数据库管理器:FMXDatabaseManager
类是一个单例实例,用于管理 sqlite 数据库文件和 FMDatabase 实例,将它们连接起来。您可以通过以下代码获取它。
FMXDatabaseManager *manager = [FMXDatabaseManager sharedManager];
首先,您需要将应用中使用的数据库注册到数据库管理器中。
[[FMXDatabaseManager sharedManager] registerDefaultDatabaseWithPath:@"database.sqlite" migration:nil];
在上面的示例中,您不需要手动放置 database.sqlite
文件。FMXDatabaseManager
类会自动在 NSDocumentDirectory
中创建初始空 database.sqlite
文件,如果它不存在的话。
FMDatabase *db = [[FMXDatabaseManager sharedManager] defaultDatabase];
[db open];
// your code for databse operations
[db close];
FMXDatabaseManager
可以有一个迁移对象来初始化和迁移数据库模式。
创建您的迁移类。
@interface MyMigration : FMXDatabaseMigration
@end
@implementation MyMigration
- (void)migrate
{
[self upToVersion:1 action:^(FMDatabase *db){
[db executeUpdate:@""
"create table users ("
" id integer primary key autoincrement,"
" name text not null,"
" age integer not null,"
" is_male BOOL not null,"
" created_at integer not null,"
" updated_at integer not null"
")"
];
}];
[self upToVersion:2 action:^(FMDatabase *db){
// ... schema changes for version 2
}];
[self upToVersion:3 action:^(FMDatabase *db){
// ... schema changes for version 3
}];
// ...etc
}
@end
使用迁移类的实例注册数据库。它运行迁移任务。
[[FMXDatabaseManager sharedManager] registerDefaultDatabaseWithPath:@"database.sqlite"
migration:[[MyMigration alloc] init]];
它设计得像 ActiveRecord。
您需要为每个表定义模型类。默认情况下,模型类会自动映射一个名称为复数名称(没有前缀)的表。这不是非常严格。只需在词尾添加 s
就可以了。
例如,ABCUser
模型类默认映射 users
表。
@interface ABCUser : FMXModel
@property (strong, nonatomic) NSNumber *id;
@property (strong, nonatomic) NSString *name;
@property (strong, nonatomic) NSNumber *age;
@property (assign, nonatomic) BOOL isMale;
@property (strong, nonatomic) NSDate *createdAt;
@property (strong, nonatomic) NSDate *updatedAt;
@end
您需要定义像以下这样的 defaultTableMap
方法来将每个属性映射到表列。
@implementation ABCUser
+ (void)defaultTableMap:(FMXTableMap *)table {
[table hasIntIncrementsColumn:@"id"]; // defines as a primary key.
[table hasStringColumn:@"name"];
[table hasIntColumn:@"age"];
[table hasBoolColumn:@"is_male"];
[table hasDateColumn:@"created_at"];
[table hasDateColumn:@"updated_at"];
}
@end
模型类需要主键。因此,您需要定义主键配置。请看下面的示例。
[table hasIntIncrementsColumn:@"id"];
// or
[table hasIntColumn:@"id" withPrimaryKey:YES];
如果您想将映射的表名从默认值更改为其他值,您可以指定类似以下的表名。
@implementation ABCUser
- (void)defaultTableMap:(FMXTableMap *)table
{
[table setTableName:@"custom_users"];
}
@end
您可以使用模型类来插入、更新和数据删除。
ABCUser *user = [[ABCUser alloc] init];
user.name = @"Kohki Makimoto";
user.age = @(34);
// insert
[user save];
// update
user.age = @(44);
[user save];
// delete
[user delete];
ABCUser *user = (ABCUser *)[ABCUser modelByPrimaryKey:@(1)];
NSLog(@"Hello %@", user.name);
您可以得到一个模型对象。
ABCUser *user = (ABCUser *)[ABCUser modelWhere:@"name = :name" parameters:@{@"name": @"Kohki Makimoto"}];
您可以得到多个模型对象。
NSArray *users = [ABCUser modelsWhere:@"age = :age" parameters:@{@"age": @34}];
for (ABCUser *user in users) {
NSLog(@"Hello %@!", user.name);
}
# Count all users.
NSInteger count = [ABCUser count];
# Count users whose name is 'Kohki Makimoto'.
NSInteger count = [ABCUser countWhere:@"name = :name" parameters:@{@"name": @"Kohki Makimoto"}];
您可以在迁移任务或其他位置添加一些数据。
@interface MyMigration : FMXDatabaseMigration
@end
@implementation MyMigration
- (void)migrate
{
[self upToVersion:1 action:^(FMDatabase *db){
[db executeUpdate:@""
"create table users ("
" id integer primary key autoincrement,"
" name text not null,"
" age integer not null,"
" is_male BOOL not null,"
" created_at integer not null,"
" updated_at integer not null"
")"
];
[FMXCsvTable foreachFileName:@"users.csv" process:^(NSDictionary *row) {
[ABCUser createWithValues:row database:db];
}];
}];
}
@end
CSV文件如下所示。头部行是必要的。
id,name,age,is_male,created_at,updated_at
1,Kohki Makimoto1,34,1,2010-12-01T21:35:43+0900,2010-12-01T21:35:43+0900
2,Kohki Makimoto2,35,1,2010-12-01T21:35:43+0900,2010-12-01T21:35:43+0900
3,Kohki Makimoto3,36,0,2010-12-01T21:35:43+0900,2010-12-01T21:35:43+0900
4,Kohki Makimoto4,37,0,2010-12-01T21:35:43+0900,2010-12-01T21:35:43+0900
5,Kohki Makimoto5,38,1,2010-12-01T21:35:43+0900,2010-12-01T21:35:43+0900
6,Kohki Makimoto6,39,1,2010-12-01T21:35:43+0900,2010-12-01T21:35:43+0900
7,Kohki Makimoto7,40,0,2010-12-01T21:35:43+0900,2010-12-01T21:35:43+0900