Showing posts with label Database. Show all posts
Showing posts with label Database. Show all posts

Friday, May 23, 2014

LKDB Helper Sqlite ORM

this is sqlite ORM (an automatic database operation)
thread-safe and not afraid of recursive deadlock
新版 添加字段的时候 可以直接 定义属性就好了 不用再调用 [self tableUpdateAddColumnWithPN:@"color"]; 这种的方法了

v1.1

  • 支持 列名属性 之间的绑定。
  • 你也可以 设置 列 的属性。
  • 当你列 映射 使用 LKSQLUserCalculate 值 。 就重载下面两个方法,由你决定插入到数据库中的数据
    -(id)userGetValueForModel:(LKDBProperty *)property
    -(void)userSetValueForModel:(LKDBProperty *)property value:(id)value
  • 还增加了两个添加列的方法,方便在表版本升级的时候调用。
  • 为了 支持多数据库 取消了 shareDBHelper 这个方法,
    改成 [modelClass getUsingDBHelper] 这样每个model 可以重载 , 选择要使用的数据库
    可以看 NSObject+LKDBHelper 里面 的方法
    #v1.1
  • Support column name binding attributes.
  • You can also set the properties of the column.
  • When you use LKSQLUserCalculate column mapping value. To override the following two methods you decide to insert data in the database
    - (id) userGetValueForModel: (LKDBProperty *) property
    - (void) userSetValueForModel: (LKDBProperty *) property value: (id) value
  • Also added two ways to add columns for easy upgrades in the table when called.
  • In order to support multiple databases canceled shareDBHelper this method,
    Changed to [modelClass getUsingDBHelper] so that each model can be overloaded, select the database you want to use
    You can see NSObject LKDBHelper method inside

Requirements

  • iOS 4.3+
  • ARC only
  • FMDB(https://github.com/ccgus/fmdb)

Adding to your project

If you are using CocoaPods, then, just add this line to your PodFile
pod 'LKDBHelper', :head

Basic usage

1 . Create a new Objective-C class for your data model
@interface LKTest : NSObject
@property(copy,nonatomic)NSString* name;
@property int  age;
@property BOOL isGirl;

@property(strong,nonatomic)LKTestForeign* address;

@property char like;
@property(strong,nonatomic) UIImage* img;
@property(strong,nonatomic) NSDate* date;

@property(copy,nonatomic)NSString* error;
@property(copy,nonatomic)UIColor* color;
@end
2 . in the *.m file, overwirte getTableName function
+(NSString *)getTableName
{
    return @"LKTestTable";
}
3 . In your app start function
    LKDBHelper* globalHelper = [LKDBHelper getUsingLKDBHelper];

    //create table need to manually call! will check the version number of the table
    [globalHelper createTableWithModelClass:[LKTest class]];
4 . Initialize your model with data and insert to database
    LKTest* test = [[LKTest alloc]init];
    test.name = @"zhan san";
    test.age = 16;

    test.address = foreign;

    test.isGirl = YES;
    test.like = 'I';
    test.img = [UIImage imageNamed:@"41.png"];
    test.date = [NSDate date];
    test.color = [UIColor orangeColor];

    [globalHelper insertToDB:test];

5 . select 、 delete 、 update 、 isExists 、 rowCount ...
    select:

        NSMutableArray* array = [globalHelper search:[LKTest class] where:nil orderBy:nil offset:0 count:100];
        for (NSObject* obj in array) {
            addText(@"%@",[obj printAllPropertys]);
        }

    delete:

        [globalHelper deleteToDB:test];

    update:

        test.name = "rename";
        [globalHelper updateToDB:test where:nil];

    isExists:

        [globalHelper isExistsModel:test];

    rowCount:

        [globalHelper rowCount:[LKTest class] where:nil];


6 . Description of parameters "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'"

table mapping

overwirte getTableMapping Function
+(NSDictionary *)getTableMapping
{
    //return nil 
    return @{@"name":LKSQLInherit,
             @"MyAge":@"age",
             @"img":LKSQLInherit,
             @"MyDate":@"date",
             @"color":LKSQLInherit,
             @"address":LKSQLUserCalculate};
}

table update

+(LKTableUpdateType)tableUpdateForOldVersion:(int)oldVersion newVersion:(int)newVersion
{
    switch (oldVersion) {
        case 1:
        {
            [self tableUpdateAddColumnWithPN:@"color"];
        }
        case 2:
        {
            [self tableUpdateAddColumnWithName:@"address" sqliteType:LKSQLText];
        }
            break;
    }
    return LKTableUpdateTypeCustom;
}

set column attribute

+(void)columnAttributeWithProperty:(LKDBProperty *)property
{
    if([property.sqlColumnName isEqualToString:@"MyAge"])
    {
        property.defaultValue = @"15";
    }
    if([property.propertyName isEqualToString:@"date"])
    {
        property.isUnique = YES;
        property.checkValue = @"MyDate > '2000-01-01 00:00:00'";
        property.length = 30;
    }
}

demo screenshot

demo screenshot
table test data

foreign key data


Change-log

Version 1.1 @ 2012-6-20
  • automatic table mapping
  • support optional columns
  • support column attribute settings
  • you can return column content
Version 1.0 @ 2013-5-19
  • overwrite and rename LKDBHelper
  • property type support: UIColor,NSDate,UIImage,NSData,CGRect,CGSize,CGPoint,int,float,double,NSString,short,char,bool,NSInterger..
  • fix a recursive deadlock.
  • rewrite the asynchronous operation -
  • thread-safe
  • various bug modified optimize cache to improve performance
  • test and demos
  • bug fixes, speed improvements
Version 0.0.1 @ 2012-10-1
  • Initial release with LKDAOBase
Download: https://github.com/li6185377/LKDBHelper-SQLite-ORM/archive/master.zip