这是一个用于在 iOS 上进行数据持久化的库,它使用 SQLite(与 FMDB 一起)。我(Diogo Tridapalli)开始开发这个库是为了 99Taxis 的 iOS 应用。仍在开发中,但已具备功能。
为了编写这段代码,我受到了 Brent Simmons 在 AltWWDC'13 上的 演讲 和他博客中一篇美好的 文章 的启发。之后,我对 FMDB 进行了一些研究,并开始编写一些覆盖 FMDB 的代码以避免重复 SQL 代码。
经过一些代码(和一些混乱的代码)交互后,我决定做一些研究,看看人们对这个问题的做法,并发现另一篇 精彩的论文 从 Simmons。还有 Marco Arment 的类似库 Marco Arment,FCModel 有一些很好的想法我可以用在这个代码中,比如打开数据库的方式,但这段代码支持简单的关联,而 FCModel 不支持。
由于大部分数据持久化库都基于 Core Data,我在 99Taxis 的支持下决定公开这个源代码。我希望它可能有所帮助 :-)
欢迎提出建议,请随时通过 twitter 联系我。
#import "DTSObject.h"
@interface ObjectExample : DTSObject
@property (nonatomic, strong) NSString *string;
@property (nonatomic, strong) NSNumber *number;
@end
@implementation ObjectExample
+ (NSDictionary *)propertiesTypes
{
return @{@"string": NSStringFromClass([NSString class]),
@"number": NSStringFromClass([NSNumber class])};
}
+ (NSString *)tableName
{
return @"example";
}
@end
DTSManager *manager = [DTSManager sharedManager];
[manager addManagedClass:[ObjectExample class]];
[manager openDataBaseAtPath:dbPath
withSchema:^(FMDatabase *db, int *schemaVersion) {
[db beginTransaction];
void (^failedAt)(int statement) = ^(int statement){
int lastErrorCode = db.lastErrorCode;
NSString *lastErrorMessage = db.lastErrorMessage;
[db rollback];
NSAssert3(0, @"Migration statement %d failed, code %d: %@", statement, lastErrorCode, lastErrorMessage);
};
if (*schemaVersion < 1) {
if (! [db executeUpdate:
@"CREATE TABLE example ("
@" objectId INTEGER UNIQUE NOT NULL PRIMARY KEY AUTOINCREMENT,"
@" string TEXT NOT NULL DEFAULT '',"
@" number REAL"
@");"
]) failedAt(1);
*schemaVersion = 1;
}
[db commit];
}];
ObjectExample *obj = [ObjectExample new];
obj.string = @"text";
obj.number = @(42);
[obj save];
NSArray *list = [ObjectExample arrayWithObjectIds];
ObjectExample *obj = [ObjectExample objectWithId:[list lastObject]];
[obj delete];