亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

IOS關于LKDBHelper實體對象映射插件運用

2019-11-14 19:00:21
字體:
來源:轉載
供稿:網友

一 插件簡介:

其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內容:

#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;}/** *  @author wujunyang, 15-05-21 16:05:44 * *  @brief  路徑 *  @return <#return value description#> */+ (NSString *)downloadPath{        NSString *documentPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject];        NSString *downloadPath = [documentPath stringByAppendingPathComponent:@"wjy"];        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內容:#import <Foundation/Foundation.h>#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*注意繼承BaseBeanCarBean.m內容:#import "CarBean.h"@implementation CarBean+(void)initialize{    //單個要不顯示時    [self removePropertyWithColumnName:@"address"];    //多列要不顯示時    //[self removePropertyWithColumnNameArray:];        //修改列對應到表時 重命名新列名    [self setTableColumnName:@"MyCarWidth" bindingPropertyName:@"carWidth"];}/** *  @author wjy, 15-01-27 18:01:53 * *  @brief  是否將父實體類的屬性也映射到sqlite庫表 *  @return BOOL */+(BOOL) isContainParent{    return YES;}/** *  @author wjy, 15-01-26 14:01:01 * *  @brief  設定表名 *  @return 返回表名 */+(NSString *)getTableName{    return @"carbean";}/** *  @author wjy, 15-01-26 14:01:22 * *  @brief  設定表的單個主鍵 *  @return 返回主鍵表 */+(NSString *)getPrimaryKey{    return @"carID";}/////復合主鍵  這個優先級最高//+(NSArray *)getPrimaryKeyUnionArray//{//    return @[@"carID",@"carNum"];//}@end

*主要注意關于可以把一些屬性過濾掉,就不會創建到表中,也可以對列名進行重定義,其它幾個代碼有詳細說明

 

3:子實體UserBean,同樣繼承BaseBean

UserBean.h內容:#import <Foundation/Foundation.h>#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;@endUserBean.m內容:#import "UserBean.h"@implementation UserBean+(void)initialize{    [self removePropertyWithColumnName:@"error"];}/** *  @author wjy, 15-01-27 18:01:53 * *  @brief  是否將父實體類的屬性也映射到sqlite庫表 *  @return BOOL */+(BOOL) isContainParent{    return YES;}/** *  @author wjy, 15-01-26 14:01:01 * *  @brief  設定表名 *  @return 返回表名 */+(NSString *)getTableName{    return @"userBean";}/** *  @author wjy, 15-01-26 14:01:22 * *  @brief  設定表的單個主鍵 *  @return 返回主鍵表 */+(NSString *)getPrimaryKey{    return @"ID";}@end

 

4:開始進行針對數據庫進行操作

4.1 功能包括刪除所有表,清理指定表的數據,創建表插入數據,其中插入數據會自動判斷表是否存在,若不存在則先創建表再插入,特別說明就是當一個列被定義為int且是主鍵時,它要是沒有被賦值就會自動增長

    LKDBHelper* globalHelper = [BaseBean getUsingLKDBHelper];        //刪除所有的表    [globalHelper dropAllTable];        //清理所有數據    [LKDBHelper clearTableData:[UserBean class]];        UserBean *user=[[UserBean alloc] init];    //user.ID=1000;  //特別說明 如果是主鍵 沒給它賦值它就會自動增長    user.userName=@"WUJY";    user.password=@"123456";    user.age=10;        CarBean *car=[[CarBean alloc]init];    car.carNum=@"D88888";    car.address=@"廈門軟件園";    car.carWidth=12.5;        user.myCar=car;        //插入數據 如果表不存在 它會自動創建再插入 實體實例化LKDBHelper 若是繼承記得引用 否則會沒有效果    [user saveToDB];        //另外一種插入    user.age=29;    [globalHelper insertToDB:user];

4.2 關于事務的操作

    //事物  transaction 這邊故意讓它插入失敗    [globalHelper executeForTransaction:^BOOL(LKDBHelper *helper) {                user.ID = 10;        user.userName=@"wujy10";        BOOL success = [helper insertToDB:user];                user.ID = 9;        user.userName=@"wujy09";        success = [helper insertToDB:user];                //重復主鍵        user.ID = 10;        BOOL insertSucceed = [helper insertWhenNotExists:user];                //insert fail        if(insertSucceed == NO)        {            ///rollback            return NO;        }        else        {            ///commit            return YES;        }    }];

4.3 關于異步操作,對于其它操作也同樣支持異步操作,采用callback方式進行回調

    user.userName=@"異步";    [globalHelper insertToDB:user callback:^(BOOL result) {        NSLog(@"異步插入是否成功:%@",result>0?@"":@"");    }];    //異步查詢    [globalHelper search:[UserBean class] where:nil orderBy:nil offset:0 count:100 callback:^(NSMutableArray *array) {        for (id obj in array) {            NSLog(@"異步:%@",[obj printAllPropertys]);        }    }];

4.4 關于查詢功能的幾種操作,特別注意條件的寫法,其它在代碼中有相應的注解;

    NSMutableArray* searchResultArray=nil;        //同步搜索 執行sql語句 把結果再變成對象    searchResultArray=[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=[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=[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%%'"

4.5 更新操作

    //帶條件更新    user.userName=@"踏浪帥";    BOOL isUpDate=[globalHelper updateToDB:user where:@{@"ID":@10}];    NSLog(@"是否更新成功:%@",isUpDate>0?@"":@"");        //根據條件獲得后進行更新    searchResultArray=[UserBean searchWithWhere:[NSString stringWithFormat:@"userName='%@'",@"WUJY"] orderBy:nil offset:0 count:100];    user=[searchResultArray firstObject];    user.password=@"aa123456";    BOOL moreUpdate=[globalHelper updateToDB:user where:nil];    NSLog(@"根據條件獲得后進行更新:%@",moreUpdate>0?@"":@"");        //更新 訪問表名 更新內容跟條件進行更新    BOOL updateTab=[globalHelper updateToDBWithTableName:@"userBean" set:@"password='aa123456'" where:@"age=10"];    NSLog(@"訪問表名更新內容跟條件進行更新:%@",updateTab>0?@"":@"");        //根據 實類進行更新    BOOL updateClass=[globalHelper updateToDB:[UserBean class] set:@"password='VEVb'" where:@"userName='WUJY'"];    NSLog(@"根據實類進行更新:%@",updateClass>0?@"":@"");

4.6 刪除操作

    //刪除功能    user=[globalHelper searchSingle:[UserBean class] where:@{@"age":@10} orderBy:nil];    BOOL ishas=[globalHelper isExistsModel:user];    if (ishas) {        [globalHelper deleteToDB:user];    }        //刪除多條    BOOL isDeleteMore=[globalHelper deleteWithClass:[UserBean class] where:@"age=29"];    if (isDeleteMore) {        NSLog(@"符合條件的都被刪除");    }

提供本代碼下載地址(本實例只是本人練習,若有問題望指正):源代碼下載


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
91亚洲国产成人久久精品网站| 91久久国产婷婷一区二区| 欧美日韩另类视频| 久久久精品亚洲| 亚洲综合精品伊人久久| 精品国产欧美一区二区五十路| 亚洲国产天堂网精品网站| 在线视频一区二区| 欧美视频一区二区三区…| 亚洲va欧美va在线观看| 亚洲一区中文字幕在线观看| 国产精品极品美女粉嫩高清在线| 欧美一区二三区| 精品欧美一区二区三区| 国产精品久久久久国产a级| 日本午夜人人精品| 国产一区二区三区直播精品电影| 久久在精品线影院精品国产| 欧美日韩国产一区二区| 精品色蜜蜜精品视频在线观看| 亚洲视频国产视频| 亚洲一区久久久| 亚洲白拍色综合图区| 狠狠色香婷婷久久亚洲精品| 亚洲男女自偷自拍图片另类| 日韩免费中文字幕| 亚洲女人天堂网| 色偷偷av亚洲男人的天堂| 欧美天堂在线观看| 成人在线一区二区| 国产精品免费网站| 国产精品福利无圣光在线一区| 成人免费看片视频| 日韩在线激情视频| 日韩视频免费中文字幕| 国产精品久久电影观看| 国产精品久久久久久网站| 高清一区二区三区四区五区| 国产精品久久久久7777婷婷| 97香蕉久久超级碰碰高清版| 在线亚洲欧美视频| 日韩激情视频在线播放| 欧美综合在线第二页| 亚洲精品小视频在线观看| 91精品国产综合久久男男| 欧美美最猛性xxxxxx| 8090理伦午夜在线电影| 欧美日韩第一页| 少妇久久久久久| 国产精品成人品| 九九精品在线观看| 亚洲精品电影在线| 欧美激情一二三| 久国内精品在线| 亚洲最大福利视频网| 国产精品91免费在线| 国产精品嫩草影院久久久| 亚洲国产天堂久久综合| 久久大大胆人体| 欧美老女人bb| 丁香五六月婷婷久久激情| 亚洲国产精品久久91精品| 久久国产精品久久精品| 欧美日韩视频免费播放| 91精品久久久久久久久久久| 热99在线视频| 在线视频免费一区二区| 日韩乱码在线视频| 久久久人成影片一区二区三区观看| 欧美第一淫aaasss性| 欧美成人性生活| 亚洲精品女av网站| 91久久国产精品| 国产精品极品美女粉嫩高清在线| 日韩美女主播视频| 国产精品成人免费电影| 久久国产精品首页| 国产精品免费一区二区三区都可以| 国内精品久久久久久久| 成人免费网站在线| 国产精品老女人视频| 欧美成人剧情片在线观看| 日本不卡高字幕在线2019| 亚洲精品v欧美精品v日韩精品| 成人a免费视频| 91精品视频专区| 国产视频久久久| 91精品国产一区| 亚洲欧美中文日韩v在线观看| 国产精品亚洲自拍| 丰满岳妇乱一区二区三区| 日日噜噜噜夜夜爽亚洲精品| 国产精品亚洲一区二区三区| 热久久美女精品天天吊色| 国产丝袜一区二区三区| 欧美一级大片在线观看| 一区二区三区视频在线| 欧美一区二区大胆人体摄影专业网站| 亚洲精品欧美一区二区三区| 在线观看免费高清视频97| 久久精品福利视频| 91在线高清免费观看| 91av国产在线| 精品国产乱码久久久久久虫虫漫画| 日韩小视频在线| 日韩精品中文字幕在线观看| 午夜精品久久久久久久久久久久久| 97热精品视频官网| 欧美激情中文网| 在线成人中文字幕| 久久综合色88| 亚洲欧美在线x视频| 日韩欧美中文字幕在线播放| 一本一道久久a久久精品逆3p| 欧美日韩亚洲天堂| 亚洲成人av片在线观看| 欧美成人在线影院| 久久亚洲精品中文字幕冲田杏梨| 日韩三级成人av网| 97国产在线视频| 国内免费久久久久久久久久久| 大荫蒂欧美视频另类xxxx| 国产成人亚洲精品| 欧美成人免费观看| 久久精品国产精品亚洲| 久久久久久国产精品美女| 国模极品一区二区三区| 亚洲欧美一区二区精品久久久| 国产小视频国产精品| 欧美日韩精品在线| 亚洲人成在线观| 国产伦精品免费视频| 久久的精品视频| 国产精品亚洲欧美导航| 精品自在线视频| 亚洲美女av电影| 日本不卡视频在线播放| 亚洲午夜未满十八勿入免费观看全集| 国产91免费看片| 国产精品电影网站| 日日狠狠久久偷偷四色综合免费| 欧美夫妻性生活视频| 亚洲综合社区网| 欧美中文在线视频| 国产精品丝袜久久久久久高清| 欧美成人免费在线观看| 亚洲白拍色综合图区| 国产精品福利在线观看| 久久久久久91香蕉国产| 成人黄色午夜影院| 国外日韩电影在线观看| 国产精品入口免费视频一| 日韩电影第一页| 亚洲白虎美女被爆操| 精品久久久久久亚洲国产300| 在线观看欧美成人| 日韩在线视频播放| 亚洲美女福利视频网站| 久久久久久久久久久网站| 欧美日韩中国免费专区在线看| 亚洲精品福利免费在线观看| 欧美最近摘花xxxx摘花| 日韩风俗一区 二区| 国内精品国产三级国产在线专|