• iOS:LKDBHelper实体对象映射数据库-第三方框架(在FMDB的基础上进行二次封装)


    一 插件简介:

    其github地址:https://github.com/li6185377/LKDBHelper-SQLite-ORM

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

     

    二 实例内容:

    采用pods进行加载LKDBHelper插件,若有下载源代码调试时记得更新一下(平常项目中记得对libsqlite3.dylib进行引用);

    本实例创建一个父实体BaseBean,后面其它实体都进行继承

     

    1:父实体的代码内容

    BaseBean.h内容:

    #import <Foundation/Foundation.h>
    #import <LKDBHelper/LKDBHelper.h>
    
    @interface BaseBean : NSObject
    
    @end
    
    
    //这个NSObject的扩展类 可以查看详细的建表sql语句
    @interface NSObject(PrintSQL)
    
    +(NSString*)getCreateTableSQL;
    
    @end

    *这边可以放一些其它实体都公有的属性,及lkdbhelper数据库的地址;其中PrintSQL是对NSObject的扩展,可以查看创建表的sql语句;

    BaseBean.m内容:

    //  BaseBean.m
    //  LKDBHelperTest
    //
    //  Created by mac on 16/2/17.
    //  Copyright © 2016年 mac. All rights reserved.
    //
    
    #import "BaseBean.h"
    
    @implementation BaseBean
    
    /**
     *  创建数据库
     */
    +(LKDBHelper *)getUsingLKDBHelper
    {
        static LKDBHelper* db;
        static dispatch_once_t onceToken;
        dispatch_once(&onceToken, ^{
            NSString *sqlitePath = [BaseBean downloadPath];
            NSString* dbpath = [sqlitePath stringByAppendingPathComponent:[NSString stringWithFormat:@"lkdbhelperTest.db"]];
            db = [[LKDBHelper alloc]initWithDBPath:dbpath];
        });
        return db;
    }
    
    /**
     *  数据库存放路径
     */
    + (NSString *)downloadPath{
        NSString *documentPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject];
        NSString *downloadPath = [documentPath stringByAppendingPathComponent:@"LKHTest"];
        NSLog(@"%@",downloadPath);
        return downloadPath;
    }
    @end
    
    
    
    @implementation NSObject(PrintSQL)
    
    /**
     *  创建数据表
     */
    +(NSString *)getCreateTableSQL
    {
        LKModelInfos* infos = [self getModelInfos];
        NSString* primaryKey = [self getPrimaryKey];
        NSMutableString* table_pars = [NSMutableString string];
        for (int i=0; i<infos.count; i++) {
            
            if(i > 0)
                [table_pars appendString:@","];
            
            LKDBProperty* property =  [infos objectWithIndex:i];
            [self columnAttributeWithProperty:property];
            
            [table_pars appendFormat:@"%@ %@",property.sqlColumnName,property.sqlColumnType];
            
            if([property.sqlColumnType isEqualToString:LKSQL_Type_Text])
            {
                if(property.length>0)
                {
                    [table_pars appendFormat:@"(%ld)",(long)property.length];
                }
            }
            if(property.isNotNull)
            {
                [table_pars appendFormat:@" %@",LKSQL_Attribute_NotNull];
            }
            if(property.isUnique)
            {
                [table_pars appendFormat:@" %@",LKSQL_Attribute_Unique];
            }
            if(property.checkValue)
            {
                [table_pars appendFormat:@" %@(%@)",LKSQL_Attribute_Check,property.checkValue];
            }
            if(property.defaultValue)
            {
                [table_pars appendFormat:@" %@ %@",LKSQL_Attribute_Default,property.defaultValue];
            }
            if(primaryKey && [property.sqlColumnName isEqualToString:primaryKey])
            {
                [table_pars appendFormat:@" %@",LKSQL_Attribute_PrimaryKey];
            }
        }
        NSString* createTableSQL = [NSString stringWithFormat:@"CREATE TABLE IF NOT EXISTS %@(%@)",[self getTableName],table_pars];
        return createTableSQL;
    }
    
    @end

    2:子实体CarBean的内容,其是另外一个实体UserBean的一个外键

    CarBean.h内容:
    //
    //  CarBean.h
    //  LKDBHelperTest
    //
    //  Created by mac on 16/2/17.
    //  Copyright © 2016年 mac. All rights reserved.
    //
    
    #import "BaseBean.h"
    
    @interface CarBean : BaseBean
    
    @property(assign,nonatomic)int carID;
    @property(strong,nonatomic)NSString *carNum;
    @property(strong,nonatomic)NSString *address;
    @property(assign,nonatomic)float carWidth;
    
    @end
    CarBean.m内容:
    //
    //  CarBean.m
    //  LKDBHelperTest
    //
    //  Created by mac on 16/2/17.
    //  Copyright © 2016年 mac. All rights reserved.
    //
    
    #import "CarBean.h"
    
    @implementation CarBean
    
    +(void)initialize
    {
        //单个要不显示时
        [self removePropertyWithColumnName:@"address"];
        
        //多列要不显示时
        //[self removePropertyWithColumnNameArray:];
        
        //修改列对应到表时 重命名新列名
        [self setTableColumnName:@"MyCarWidth" bindingPropertyName:@"carWidth"];
    }
    
    
    /**
     *  @brief  是否将父实体类的属性也映射到sqlite库表
     *  @return BOOL
     */
    +(BOOL) isContainParent{
        return YES;
    }
    /**
     *  @brief  设定表名
     *  @return 返回表名
     */
    +(NSString *)getTableName
    {
        return @"carbean";
    }
    /**
     *  @brief  设定表的单个主键
     *  @return 返回主键表
     */
    +(NSString *)getPrimaryKey
    {
        return @"carID";
    }
    
    /////复合主键  这个优先级最高
    //+(NSArray *)getPrimaryKeyUnionArray
    //{
    //    return @[@"carID",@"carNum"];
    //}
    
    @end

    *主要注意关于可以把一些属性过滤掉,就不会创建到表中,也可以对列名进行重定义,其它几个代码有详细说明


    3:子实体UserBean,同样继承BaseBean
    UserBean.h内容:
    //
    //  UserBean.h
    //  LKDBHelperTest
    //
    //  Created by mac on 16/2/17.
    //  Copyright © 2016年 mac. All rights reserved.
    //
    
    #import "BaseBean.h"
    #import "CarBean.h"
    
    @interface UserBean : BaseBean
    
    @property(assign,nonatomic)int ID;
    @property(strong,nonatomic)NSString *userName;
    @property(strong,nonatomic)NSString *password;
    @property(assign,nonatomic)int age;
    
    @property(strong,nonatomic)CarBean *myCar;
    
    @end
    UserBean.m内容:
    //
    //  UserBean.m
    //  LKDBHelperTest
    //
    //  Created by mac on 16/2/17.
    //  Copyright © 2016年 mac. All rights reserved.
    //
    
    #import "UserBean.h"
    
    @implementation UserBean
    
    +(void)initialize
    {
        [self removePropertyWithColumnName:@"error"];
    }
    
    /**
     *  @brief  是否将父实体类的属性也映射到sqlite库表
     *  @return BOOL
     */
    +(BOOL) isContainParent{
        return YES;
    }
    /**
     *  @brief  设定表名
     *  @return 返回表名
     */
    +(NSString *)getTableName
    {
        return @"userBean";
    }
    /**
     *  @brief  设定表的单个主键
     *  @return 返回主键表
     */
    +(NSString *)getPrimaryKey
    {
        return @"ID";
    }
    
    @end

    在ViewController类中测试:

    //
    //  ViewController.m
    //  LKDBHelperTest
    //
    //  Created by mac on 16/2/17.
    //  Copyright © 2016年 mac. All rights reserved.
    //
    
    #import "ViewController.h"
    #import <LKDBHelper.h>
    #import "BaseBean.h"
    #import "UserBean.h"
    
    @interface ViewController ()
    @property (strong,nonatomic)LKDBHelper* globalHelper;
    @property (strong,nonatomic)UserBean *user;
    @property (strong,nonatomic)CarBean *car;
    @end
    
    @implementation ViewController
    
    - (void)viewDidLoad {
        [super viewDidLoad];
        
        [self test];
    }
    
    
    /**
     *  开始进行针对数据库进行操作
        功能包括删除所有表,清理指定表的数据,创建表插入数据,其中插入数据会自动判断表是否存在,若不存在则先创建表再插入,特别说明就是当一个列被定义为int且是主键时,它要是没有被赋值就会自动增长
     */
    -(void)test{
        
        self.globalHelper = [BaseBean getUsingLKDBHelper];
        
        //删除所有的表
        [self.globalHelper dropAllTable];
        
        //清理所有数据
        [LKDBHelper clearTableData:[UserBean class]];
        
        self.user=[[UserBean alloc] init];
        //self.user.ID=1000;  //特别说明 如果是主键 没给它赋值它就会自动增长
        self.user.userName=@"WUJY";
        self.user.password=@"123456";
        self.user.age=10;
        
        self.car=[[CarBean alloc]init];
        self.car.carNum=@"D88888";
        self.car.address=@"厦门软件园";
        self.car.carWidth=12.5;
        
        self.user.myCar=self.car;
        
        //插入数据 如果表不存在 它会自动创建再插入 实体实例化LKDBHelper 若是继承记得引用 否则会没有效果
        [self.user saveToDB];
        
        //另外一种插入
        self.user.age=29;
        [self.globalHelper insertToDB:self.user];
    }
    
    /**
     *  关于事务的操作
     */
    -(void)test2{
        
        //事物  transaction 这边故意让它插入失败
        [self.globalHelper executeForTransaction:^BOOL(LKDBHelper *helper) {
            
            self.user.ID = 10;
            self.user.userName=@"wujy10";
            BOOL success = [helper insertToDB:self.user];
            
            self.user.ID = 9;
            self.user.userName=@"wujy09";
            success = [helper insertToDB:self.user];
            
            //重复主键
            self.user.ID = 10;
            BOOL insertSucceed = [helper insertWhenNotExists:self.user];
            
            //insert fail
            if(insertSucceed == NO)
            {
                ///rollback
                return NO;
            }
            else
            {
                ///commit
                return YES;
            }
        }];
    }
    
    /**
     *  关于异步操作,对于其它操作也同样支持异步操作,采用callback方式进行回调
     */
    -(void)test3{
        
        self.user.userName=@"异步";
        [self.globalHelper insertToDB:self.user callback:^(BOOL result) {
            NSLog(@"异步插入是否成功:%@",result>0?@"":@"");
        }];
        
        //异步查询
        [self.globalHelper search:[UserBean class] where:nil orderBy:nil offset:0 count:100 callback:^(NSMutableArray *array) {
            for (id obj in array) {
                NSLog(@"异步:%@",[obj printAllPropertys]);
            }
        }];
    }
    
    /**
     *  关于查询功能的几种操作,特别注意条件的写法,其它在代码中有相应的注解
     */
    -(void)test4{
        
        NSMutableArray* searchResultArray=nil;
        
        //同步搜索 执行sql语句 把结果再变成对象
        searchResultArray=[self.globalHelper searchWithSQL:@"select * from @t" toClass:[UserBean class]];
        for (id obj in searchResultArray) {
            NSLog(@"sql语句:%@",[obj printAllPropertys]);
        }
        
        //使用对象对进查询操作  offset是跳过多少行 count是查询多少条
        searchResultArray=[UserBean searchWithWhere:nil orderBy:nil offset:0 count:100];
        for (id obj in searchResultArray) {
            NSLog(@"实体:%@",[obj printAllPropertys]);
        }
        
        //查询一列时的操作 count为0时则查所有列
        NSArray* nameArray = [UserBean searchColumn:@"userName" where:nil orderBy:nil offset:0 count:0];
        NSLog(@"%@",[nameArray componentsJoinedByString:@","]);
        
        //查询多列时的操作
        NSArray* twoColumn=[UserBean searchColumn:@"ID,userName" where:nil orderBy:nil offset:0 count:0];
        for (UserBean *obj in twoColumn) {
            NSLog(@"%d-%@",obj.ID,obj.userName);
        }
        
        //组合查询四种 and or like in
        searchResultArray=[UserBean searchWithWhere:[NSString stringWithFormat:@"userName like '%%JY%%'"] orderBy:nil offset:0 count:0];
        NSLog(@"LIKE :%lu",searchResultArray.count);
        
        searchResultArray=[UserBean searchWithWhere:[NSString stringWithFormat:@"age=29 and userName='WUJY'"] orderBy:nil offset:0 count:0];
        NSLog(@"AND :%lu",searchResultArray.count);
        
        searchResultArray=[self.globalHelper search:[UserBean class] where:@{@"age":@29,@"userName":@"WUJY"} orderBy:nil offset:0 count:0];
        NSLog(@"AND %lu",searchResultArray.count);
        
        searchResultArray=[UserBean searchWithWhere:[NSString stringWithFormat:@"age=29 or userName='WUJY'"] orderBy:nil offset:0 count:0];
        NSLog(@"OR %lu",searchResultArray.count);
        
        searchResultArray=[UserBean searchWithWhere:[NSString stringWithFormat:@"age in (10,29)"] orderBy:nil offset:0 count:0];
        NSLog(@"in %lu",searchResultArray.count);
        
        searchResultArray=[self.globalHelper search:[UserBean class] where:@{@"age":@[@10,@29]} orderBy:nil offset:0 count:0];
        NSLog(@"in %lu",searchResultArray.count);
        
        //查询符合条件的条数
        NSInteger rowCount=[UserBean rowCountWithWhere:@"age=29"];
        NSLog(@"rowCount %ld",rowCount);
        
        /*
         
         *注意:
         
         单条件:
         @"rowid = 1"  或者  @{@"rowid":@1}
         
         多条件:
         @“rowid = 1 and sex = 0"  或者    @{@"rowid":@1,@"sex":@0}
         如果是or类型的条件,则只能用字符串的形式:@"rowid = 1 or sex = 0"
         
         in条件:
         @"rowid in (1,2,3)"   或者     @{@"rowid":@[@1,@2,@3]}
         多条件带in:@"rowid in (1,2,3) and sex=0 "   或者    @{@"rowid":@[@1,@2,@3],@"sex":@0}
         
         时间也只能用字符串:
         @"date >= '2013-04-01 00:00:00'"
         
         like也只能用字符串:
         @"userName like '%%JY%%'"
         
        */
    }
    
    /**
     *   更新操作
     */
    -(void)test5{
        
        NSMutableArray* searchResultArray=nil;
        
        //带条件更新
        self.user.userName=@"踏浪帅";
        BOOL isUpDate=[self.globalHelper updateToDB:self.user where:@{@"ID":@10}];
        NSLog(@"是否更新成功:%@",isUpDate>0?@"":@"");
        
        //根据条件获得后进行更新
        searchResultArray=[UserBean searchWithWhere:[NSString stringWithFormat:@"userName='%@'",@"WUJY"] orderBy:nil offset:0 count:100];
        self.user=[searchResultArray firstObject];
        self.user.password=@"aa123456";
        BOOL moreUpdate=[self.globalHelper updateToDB:self.user where:nil];
        NSLog(@"根据条件获得后进行更新:%@",moreUpdate>0?@"":@"");
        
        //更新 访问表名 更新内容跟条件进行更新
        BOOL updateTab=[self.globalHelper updateToDBWithTableName:@"userBean" set:@"password='aa123456'" where:@"age=10"];
        NSLog(@"访问表名更新内容跟条件进行更新:%@",updateTab>0?@"":@"");
        
        //根据 实类进行更新
        BOOL updateClass=[self.globalHelper updateToDB:[UserBean class] set:@"password='cnblogs'" where:@"userName='WUJY'"];
        NSLog(@"根据实类进行更新:%@",updateClass>0?@"":@"");
    }
    
    /**
     *  删除操作
     */
    -(void)test6{
        
        //删除功能
        self.user=[self.globalHelper searchSingle:[UserBean class] where:@{@"age":@10} orderBy:nil];
        BOOL ishas=[self.globalHelper isExistsModel:self.user];
        if (ishas) {
            [self.globalHelper deleteToDB:self.user];
        }
        
        //删除多条
        BOOL isDeleteMore=[self.globalHelper deleteWithClass:[UserBean class] where:@"age=29"];
        if (isDeleteMore) {
            NSLog(@"符合条件的都被删除");
        }
    }
    @end
     
     
     
     
  • 相关阅读:
    2019春总结作业
    2019春第十二周作业
    2019春第十一周作业
    第九周作业
    2019春第八周作业
    第七周作业
    第六周作业
    第五周作业 英文单词排序
    2019年春季学期第四周作业
    2019春第三周作业
  • 原文地址:https://www.cnblogs.com/XYQ-208910/p/5195144.html
Copyright © 2020-2023  润新知