LKDBHelper

这是 sqlite ORM (一种自动数据库操作)
线程安全,不怕递归死锁

简书:不定时更新 http://www.jianshu.com/users/376b950a20ec

重大升级 2.0

支持 NSArray,NSDictionary, ModelClass, NSNumber, NSString, NSDate, NSData, UIColor, UIImage, CGRect, CGPoint, CGSize, NSRange, int,char,float, double, long.. 等属性的自动化插入和查询。

全面支持 NSArray,NSDictionary, ModelClass, NSNumber, NSString, NSDate, NSData, UIColor, UIImage, CGRect, CGPoint, CGSize, NSRange, int,char,float, double, long.. 等属性的自动化操作(插入和查询)


要求

由于 FMDB 限制,需要支持 iOS12 之前系统,请自行限定到 FMDB(2.7.5) 和 LKDBHelper (2.6.3)

添加到你的项目

如果您正在使用 CocoaPods,只需将此行添加到您的 Podfile

pod 'LKDBHelper'

iOS12 之前

pod 'LKDBHelper', '2.6.3'
pod 'FMDB', '2.7.5'

如果您使用加密,顺序不能错误

pod 'FMDB/SQLCipher'
pod 'LKDBHelper'

@property(strong,nonatomic)NSString* encryptionKey;

基本用法

  1. 为您的数据模型创建一个新的 Objective-C 类
@interface LKTest : NSObject
@property (nonatomic, copy) NSURL *url;
@property (nonatomic, copy) NSString *name;
@property (nonatomic, assign) NSUInteger age;
@property (nonatomic, assign) BOOL isGirl;

@property (nonatomic, strong) LKTestForeign *address;
@property (nonatomic, strong) NSArray *blah;
@property (nonatomic, strong) NSDictionary *hoho;

@property (nonatomic, assign) char like;
...
  1. 在 *.m 文件中,重写 getTableName 函数 (可选)
+ (NSString *)getTableName {
    return @"LKTestTable";
}
  1. 在 *.m 文件中,重写回调函数 (可选)
@interface NSObject (LKDBHelper_Delegate)

+ (void)dbDidCreateTable:(LKDBHelper *)helper tableName:(NSString *)tableName;
+ (void)dbDidAlterTable:(LKDBHelper *)helper tableName:(NSString *)tableName addColumns:(NSArray *)columns;

+ (BOOL)dbWillInsert:(NSObject *)entity;
+ (void)dbDidInserted:(NSObject *)entity result:(BOOL)result;

+ (BOOL)dbWillUpdate:(NSObject *)entity;
+ (void)dbDidUpdated:(NSObject *)entity result:(BOOL)result;

+ (BOOL)dbWillDelete:(NSObject *)entity;
+ (void)dbDidDeleted:(NSObject *)entity result:(BOOL)result;

///data read finish
+ (void)dbDidSeleted:(NSObject *)entity;

@end
  1. 使用数据初始化您的模型并插入到数据库
    LKTestForeign *foreign = [[LKTestForeign alloc] init];
    foreign.address = @":asdasdasdsadasdsdas";
    foreign.postcode  = 123341;
    foreign.addid = 213214;
    
    //插入数据    insert table row
    LKTest *test = [[LKTest alloc] init];
    test.name = @"zhan san";
    test.age = 16;
    
    //外键 foreign key
    test.address = foreign;
    test.blah = @[@"1", @"2", @"3"];
    test.blah = @[@"0", @[@1] ,@{ @"2" : @2 }, foreign];
    test.hoho = @{@"array" : test.blah, @"foreign" : foreign, @"normal" : @123456, @"date" : [NSDate date]};
    
    //同步 插入第一条 数据   Insert the first
    [test saveToDB];
    //or
    //[globalHelper insertToDB:test];
    
  1. select 、 delete 、 update 、 isExists 、 rowCount ...
    select:
        
        NSMutableArray *array = [LKTest searchWithWhere:nil orderBy:nil offset:0 count:100];
        for (id obj in array) {
            addText(@"%@",[obj printAllPropertys]);
        }
        
    delete:
        
        [LKTest deleteToDB:test];
        
    update:
        
        test.name = "rename";
        [LKTest updateToDB:test where:nil];
        
    isExists:
        
        [LKTest isExistsWithModel:test];
    
    rowCount:
        
        [LKTest rowCountWithWhere:nil];
        
     
  1. “where” 参数的描述
 For example: 
        single:  @"rowid = 1"                         or      @{ @"rowid" : @1 }
 
        more:    @"rowid = 1 and sex = 0"             or      @{ @"rowid" : @1, @"sex" : @0 }
                   
                    when where is "or" type , such as @"rowid = 1 or sex = 0"
                    you only use NSString
 
        array:   @"rowid in (1,2,3)"                  or      @{ @"rowid" : @[@1, @2, @3] }
            
        composite:  @"rowid in (1,2,3) and sex=0 "      or      @{ @"rowid" : @[@1, @2, @3], @"sex" : @0}
 
        If you want to be judged , only use NSString
        For example: @"date >= '2013-04-01 00:00:00'"

表映射

重写 getTableMapping 函数 (可选)

//手动or自动 绑定sql列
+ (NSDictionary *)getTableMapping {
    return @{ @"name" : LKSQL_Mapping_Inherit,
              @"MyAge" : @"age",
              @"img" : LKSQL_Mapping_Inherit,
              @"MyDate" : @"date",
              
              // version 2 after add
              @"color" : LKSQL_Mapping_Inherit,
              
              //version 3 after add
              @"address" : LKSQL_Mapping_UserCalculate,
              @"error" : LKSQL_Mapping_Inherit
              };
}

表更新 (可选)

// 表结构更新回调
+ (void)dbDidAlterTable:(LKDBHelper *)helper tableName:(NSString *)tableName addColumns:(NSArray *)columns {
    for (int i = 0; i < columns.count; i++) {
        LKDBProperty *p = [columns objectAtIndex:i];
        if ([p.propertyName isEqualToString:@"error"]) {
            [helper executeDB:^(FMDatabase *db) {
                NSString *sql = [NSString stringWithFormat:@"update %@ set error = name", tableName];
                [db executeUpdate:sql];
            }];
        }
    }
    LKErrorLog(@"your know %@", columns);
}

设置列属性 (可选)

// 定制化列属性
+ (void)columnAttributeWithProperty:(LKDBProperty *)property {
    if ([property.sqlColumnName isEqualToString:@"MyAge"]) {
        property.defaultValue = @"15";
    } else if ([property.propertyName isEqualToString:@"date"]) {
        // if you use unique,this property will also become the primary key
        //        property.isUnique = YES;
        property.checkValue = @"MyDate > '2000-01-01 00:00:00'";
        property.length = 30;
    }
}

演示截图

demo screenshot
表测试数据

外键数据


在 Swift 中使用

请记住为模型重写类函数 getTableName

更新日志

版本 1.1 @ 2012-6-20

版本 1.0 @ 2013-5-19

版本 0.0.1 @ 2012-10-1


许可证

此代码根据 MIT 许可证的条款和条件分发。


贡献指南


贡献者

作者: Jianghuai Li

贡献者: 等待您的加入