FMDBx 0.7.0

FMDBx 0.7.0

测试已测试
语言语言 Obj-CObjective C
许可证 MIT
发布上次发布2015年9月

Kohki Makimoto维护。



FMDBx 0.7.0

  • Kohki Makimoto

FMDB 的扩展,为您的 iOS 应用提供 ORM 和迁移功能。

需求

  • iOS 7.0 或更高版本
  • Xcode5 或更高版本
  • ARC

注意:我在以上条件下测试了此产品。

安装

您可以通过 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 实例

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]];

ORM

它设计得像 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"}];

从CSV文件导入数据

您可以在迁移任务或其他位置添加一些数据。

@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