Objective-C 的 SQLite 坚持框架包装器。
版本 1.0.5
SQPersist 是一个基于 FMDB (https://github.com/ccgus/fmdb) 的 SQLite 坚持框架包装器。
使用 SQPersist,您可以将自定义对象存储在 SQLite 数据库中,无需手动创建数据库和使用 Core Data 框架。
SQ Persist 是用 Objective-C 编写的,带有自动引用计数 (ARC) 系统。
要设置(创建 SQLite 文件),使用以下方法:表将自动创建。
[[SQPDatabase sharedInstance] setupDatabaseWithName:@"myDbName.db"];
如果您的实体开始使用但未设置数据库名称,则默认数据库名称为 SQPersist.db。
只需继承您的对象并由名为 SQPObject 的类实现。
SQPersist 将会在初始化您的对象时检查关联的表是否存在于数据库中(在首次初始化期间)。如果不存在,则会自动创建该表。
#import <Foundation/Foundation.h>
#import "SQPObject.h"
@interface Car : SQPObject
@property (nonatomic, strong) NSString *name;
@property (nonatomic, strong) NSString *color;
@property (nonatomic) int power;
@end
SQLite 数据库中的结果表将是
+---------------------------------+
|SQPCar |
+----------+------+-------+-------+
| objectID | name | color | power |
+----------+------+-------+-------+
| -------- | ---- | ----- | ----- |
+----------+------+-------+-------+
| -------- | ---- | ----- | ----- |
+----------+------+-------+-------+
在首次初始化您的对象时将创建表(如果表尚未存在)
Car *car1 = [Car SQPCreateEntity];
所有对象都由一个唯一标识符 objectID 来标识。 该 objectID 是一个 UUID(NSString)。
NSLog(@"Object identifier : %@", car1.objectID);
SQPersist 与以下 Objective-C 类型兼容
警告:类型 BOOL 被解析为 char,请使用小写 bool。
对象实体的每个属性都将通过 Objective-C 方法 property_getAttributes() 进行分析。
Apple 文档
如果您的对象包含一些类型为 SQPObject 的属性,或 NSArray 包含 SQPObject。当您调用主对象的 SQPSaveEntity 方法时,子对象也将被保存。
要将新对象插入到您的数据库中,只需调用名为 SQPSaveEntity 的方法。
// Create Table at the first init (if the table not exists) :
User *userCreated = [User SQPCreateEntity];
userCreated.firstName = @"John";
userCreated.lastName = @"McClane";
// INSERT Object :
[userCreated SQPSaveEntity];
要更新数据库中的现有对象,只需调用名为 SQPSaveEntity 或 SQPSaveEntityWithCascade: 的方法。
// SELECT BY objectID :
User *existingUser = [User SQPFetchOneByID:objectID];
existingUser.amount = 10.50f;
// UPDATE Object :
[existingUser SQPSaveEntity];
// UPDATE Object (with cascade) :
[existingUser SQPSaveEntityWithCascade:YES];
选择 cascade 选项将更新(或插入)主实体对象包含的所有子对象(子项)。
要删除数据库中的现有对象,将属性 deleteObject 设置为 YES 并调用名为 SQPSaveEntity 的方法。或者直接调用名为 SQPDeleteEntity 或 SQPDeleteEntityWithCascade: 的方法。
// DELETE Object :
existingUser.deleteObject = YES;
[existingUser SQPSaveEntity]; // Commit the delete command.
// DELETE Object (without cascade option) :
[existingUser SQPDeleteEntity]; // Commit the delete command.
// DELETE Object (with cascade option) :
[existingUser SQPDeleteEntityWithCascade:YES]; // Commit the delete cascade command.
选择 cascade 选项将删除主实体对象包含的所有子对象(子项)。
// DELETE Objects with WHERE conditions :
[Car SQPDeleteWhere:@"color != 'black' AND name = 'Porsche'"];
要选择一个对象,您可以使用 3 个方法 SQPFetchOneByID 或 SQPFetchOneWhere: 或 SQPFetchOneByAttribut:withValue:。
// SELECT BY objectID :
User *userSelected = [User SQPFetchOneByID:userCreated.objectID];
// SELECT by condition :
User *userSelected = [User SQPFetchOneWhere:@"lastName = 'McClane'"];
// SELECT by attribute with value :
User *userSelected = [User SQPFetchOneByAttribut:@"lastName" withValue:@"McClane"];
提示:使用 SQPFetchOne 可以获取一个对象而不必知道对象的 ID。例如用于单例对象
// SELECT a single row :
AppParameters *params = [AppParameters SQPFetchOne];
要选择对象集合,您可以使用 4 个方法 SQPFetchAll、SQPFetchAllWhere:、SQPFetchAllWhere:orderBy: 和 SQPFetchAllWhere:orderBy:pageIndex:itemsPerPage:。
// SELECT ALL 'Cars' :
NSMutableArray *allCars = [Car SQPFetchAll];
// SELECT ALL 'Ferrari cars' :
NSMutableArray *ferrariCars = [Car SQPFetchAllWhere:@"name = 'Ferrari'"];
// SELECT ALL 'Ferrari cars' ordering by 'power' :
NSMutableArray *ferrariCars = [Car SQPFetchAllWhere:@"name = 'Ferrari' orderBy:@"power DESC"];
// SELECT ALL 'Ferrari cars' ordering by 'power' (first page - with 20 items per page) :
NSMutableArray *ferrariCars = [Car SQPFetchAllWhere:@"name = 'Ferrari' orderBy:@"power DESC" pageIndex:0 itemsPerPage:20];
要计算实体数量,您可以使用 2 个方法 SQPCountAll 或 SQPCountAllWhere:。
NSLog(@"Total cars : %lld", [Car SQPCountAll]);
NSLog(@"Total cars 'Ferrari' : %lld", [Car SQPCountAllWhere:@"name = 'Ferrari'"]);
要删除所有实体(清除),请使用 SQPTruncateAll 方法。
[Car SQPTruncateAll];
使用 3 个方法管理您的交易:beginTransaction、commitTransaction 或 rollbackTransaction。
[[SQPDatabase sharedInstance] beginTransaction];
// Your objects manipulation...
if (result == YES) {
[[SQPDatabase sharedInstance] commitTransaction];
} else {
[[SQPDatabase sharedInstance] rollbackTransaction];
}
您可以使用 removeDatabase 方法删除数据库。
// REMOVE Local Database :
[[SQPDatabase sharedInstance] removeDatabase];
测试本地上是否存在数据库文件
if ([[SQPDatabase sharedInstance] databaseExists]) {
// SQLite Db file exists.
}
向现有表中添加新的属性(仅用于更新模型 - 生成多个 SQL 请求)
[SQPDatabase sharedInstance].addMissingColumns == YES;
要简单地使用 JSON 请求和响应操作实体对象,所有实体都有两种方法: toDictionary 和 populateWithDictionary:。
NSDictionary *response = [JSONDictionary objectForKey:@"items"];
Flickr *flickrItem = [Flickr SQPCreateEntity];
[flickrItem populateWithDictionary:response];
User *userCreated = [User SQPCreateEntity];
NSMutableDictionary *requestJson = [userCreated toDictionary];
当您更改对象的架构时
MIT
免费库