SQPersist 1.0.5

SQPersist 1.0.5

测试测试
Lang语言 Obj-CObjective C
许可证 MIT
Released最新发布2015 年 10 月

Christopher Ney 维护。



SQPersist 1.0.5

Objective-C 的 SQLite 坚持框架包装器。

版本 1.0.5

这是什么?

SQPersist 是一个基于 FMDB (https://github.com/ccgus/fmdb) 的 SQLite 坚持框架包装器。

使用 SQPersist,您可以将自定义对象存储在 SQLite 数据库中,无需手动创建数据库和使用 Core Data 框架。

视频

ScreenShot

语言

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

与 Objective-C 类型的兼容性

SQPersist 与以下 Objective-C 类型兼容

  • NSString -> 在 SQLite 数据库中变为 TEXT
  • NSNumber -> 在 SQLite 数据库中变为 REAL
  • NSDecimalNumber -> 在 SQLite 数据库中变为 REAL
  • NSDate -> 在 SQLite 数据库中变为 INTEGER (自 1970 年的时戳)
  • NSData -> 在 SQLite 数据库中变为 BLOB
  • UIImage -> 在 SQLite 数据库中变为 BLOB
  • NSURL -> 将 TEXT 存入 SQLite 数据库
  • int -> 将 INTEGER 存入 SQLite 数据库
  • double -> 将 REAL 存入 SQLite 数据库
  • long -> 将 INTEGER 存入 SQLite 数据库
  • long long -> 将 INTEGER 存入 SQLite 数据库
  • short -> 将 INTEGER 存入 SQLite 数据库
  • float -> 将 REAL 存入 SQLite 数据库
  • bool -> 将 INTEGER 存入 SQLite 数据库

警告:类型 BOOL 被解析为 char,请使用小写 bool

对象实体的每个属性都将通过 Objective-C 方法 property_getAttributes() 进行分析。

Apple 文档

https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/ObjCRuntimeGuide/Articles/ocrtPropertyIntrospection.html

子实体

如果您的对象包含一些类型为 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];

更新一个对象

要更新数据库中的现有对象,只需调用名为 SQPSaveEntitySQPSaveEntityWithCascade: 的方法。

// 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 的方法。或者直接调用名为 SQPDeleteEntitySQPDeleteEntityWithCascade: 的方法。

// 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 个方法 SQPFetchOneByIDSQPFetchOneWhere: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 个方法 SQPFetchAllSQPFetchAllWhere: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 个方法 SQPCountAllSQPCountAllWhere:

NSLog(@"Total cars : %lld", [Car SQPCountAll]);
NSLog(@"Total cars 'Ferrari' : %lld", [Car SQPCountAllWhere:@"name = 'Ferrari'"]);

截断实体

要删除所有实体(清除),请使用 SQPTruncateAll 方法。

[Car SQPTruncateAll];

事务

使用 3 个方法管理您的交易:beginTransactioncommitTransactionrollbackTransaction

[[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 请求和响应操作实体对象,所有实体都有两种方法: toDictionarypopulateWithDictionary:

NSDictionary *response = [JSONDictionary objectForKey:@"items"];
Flickr *flickrItem = [Flickr SQPCreateEntity];
[flickrItem populateWithDictionary:response];
User *userCreated = [User SQPCreateEntity];
NSMutableDictionary *requestJson = [userCreated toDictionary];

技巧

当您更改对象的架构时

  • 在重新构建解决方案之前清理您的 Xcode 项目。
  • 使用 removeDatabase 方法删除旧数据库(在更改之前)。

许可证

MIT

免费库