VVSequelize 0.4.7

VVSequelize 0.4.7

Valo Lee维护。



  • 作者
  • Valo Lee

VVSequelize

Version License Platform

改动(0.4.7)

  1. 移除accessible。不建议访问appgroup中的数据库,因此去除了此功能。
  2. 移除cache。因为sqlite3_update_hook()无法完全hook所有delete, drop操作,因此cache无法有效更新,可能导致查询到错误数据,所以去除了此功能,由用户自行管理缓存。

功能

  • 根据Class生成数据表
  • 增删改查,insert, update, upsert, delete, drop...
  • 生成Where语句,可满足大部分常规场景
  • 数据库加密(SQLCipher)
  • 原生SQL语句支持
  • 支持常规查询函数,如max(), min(), sum(), count()...
  • 支持主键,多主键,单主键可自增
  • 支持唯一性约束
  • 支持事务
  • 支持直接处理对象
  • 数据存储,支持OC数据类型:NSData, NSURL, NSSelector, NSValue, NSDate, NSArray, NSDictionary, NSSet,...
  • 数据存储,支持C类型:char *, struct, union
  • 子对象存储为Json字符串
  • OrmModel查询缓存
  • 支持FTS全文搜索
  • 支持自定义FTS分词器
  • 支持拼音分词,简繁互搜

结构

安装

pod 'SQLiteORM', '~> 0.4.0'

使用测试版本来安装

    pod 'VVSequelize', :git => 'https://github.com/pozi119/VVSequelize.git'

注意

  1. 子对象将被保存为JSON字符串,子对象中的NSData也将保存为16进制字符串。
  2. 在包含子对象的情况下,请确保不存在循环引用,否则`Dictionary/Object`之间的转换将导致死循环,请将相应的循环引用加入互转黑名单。
  3. VVKeyValue仅适用于本工具,不适用于常规的JSON转对象。

用法

此处主要列出一些基本用法,详细用法请参阅代码注释。

打开/创建数据库文件

    self.vvdb = [[VVDatabase alloc] initWithPath:dbPath];

定义ORM配置

  1. 手动创建VVOrmConfig
  2. 普通的表适配协议VVOrmable,fts表适配协议VVFtsable

注意: 支持fts3/4/5,但建议仅使用fts5。

定义ORM模型

可以自定义表名和存储的数据库文件。生成的模型将不会保存在ModelPool中,以防止过多表占用大量内存,需要请自行实现。

示例如下

item.orm = [VVOrm ormWithClass:VVMessage.class name:item.tableName database:item.db];
        
item.ftsOrm = [VVOrm ormWithFtsClass:VVMessage.class name:item.tableName database:item.ftsDb];

增删改查

使用ORM模型进行增删改查等操作。

示例如下

    NSInteger count = [self.mobileModel count:nil];
    
    BOOL ret = [self.mobileModel increase:nil field:@"times" value:-1];
    
    NSArray *array = [self.mobileModel findAll:nil orderBy:nil limit:10 offset:0];
    
...

生成SQL子句

目前仅支持非嵌套的字典或字典数组,转换方法如下

//where/having :
{field1:val1,field2:val2} --> field1 = "val1" AND field2 = "val2"
[{field1:val1,field2:val2},{field3:val3}] --> (field1 = "val1" AND field2 = "val2") OR (field3 = "val3")
//group by:
[filed1,field2] --> "field1","field2"
//order by
[filed1,field2] --> "field1","field2" ASC
[filed1,field2].desc --> "field1","field2" DESC

示例

- (void)testClause
  {
    VVSelect *select =  [VVSelect new];
    select.table(@"mobiles");
    select.where(@"relative".lt(@(0.3))
                 .and(@"mobile".gte(@(1600000000)))
                 .and(@"times".gte(@(0))));
    NSLog(@"%@", select.sql);
    select.where(@{ @"city": @"西安", @"relative": @(0.3) });
    NSLog(@"%@", select.sql);
    select.where(@[@{ @"city": @"西安", @"relative": @(0.3) }, @{ @"relative": @(0.7) }]);
    NSLog(@"%@", select.sql);
    select.where(@"relative".lt(@(0.3)));
    NSLog(@"%@", select.sql);
    select.where(@"     where relative < 0.3");
    NSLog(@"%@", select.sql);
    select.groupBy(@"city");
    NSLog(@"%@", select.sql);
    select.groupBy(@[@"city", @"carrier"]);
    NSLog(@"%@", select.sql);
    select.groupBy(@" group by city carrier");
    NSLog(@"%@", select.sql);
    select.having(@"relative".lt(@(0.2)));
    NSLog(@"%@", select.sql);
    select.groupBy(nil);
    NSLog(@"%@", select.sql);
    select.orderBy(@[@"city", @"carrier"]);
    NSLog(@"%@", select.sql);
    select.orderBy(@" order by relative");
    NSLog(@"%@", select.sql);
    select.limit(10);
    NSLog(@"%@", select.sql);
    select.distinct(YES);
    NSLog(@"%@", select.sql);
}

原生语句查询

- (NSArray<NSDictionary *> *)query:(NSString *)sql;

- (NSArray *)query:(NSString *)sql clazz:(Class)clazz;

加密数据数据转换(sqlcipher 3.x→4.x)

    VVDatabase *database = [VVDatabase databaseWithPath:path flags:0 encrypt:@"XXXXX"];
    database.cipherOptions = @[
        @"pragma cipher_page_size = 4096;", ///<3.x的cipher_page_size,默认为1024
        @"pragma kdf_iter = 64000;",
        @"pragma cipher_hmac_algorithm = HMAC_SHA1;",
        @"pragma cipher_kdf_algorithm = PBKDF2_HMAC_SHA1;"
    ];

作者

Valo Lee,[email protected]

授权协议

ropicloud sequelize在MIT授权协议下可用。更多信息请参见LICENSE文件。