<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

       

      WCDB

      WCDB是一個高效、完整、易用的移動數據庫框架,基于SQLCipher,支持iOS, macOS。

       

      WCDB for iOS/macOS

      基本特性

      • 易用,WCDB支持一句代碼即可將數據取出并組合為object。

        • WINQ(WCDB語言集成查詢):通過WINQ,開發者無須為了拼接SQL的字符串而寫一大坨膠水代碼。

        • ORM(Object Relational Mapping):WCDB支持靈活、易用的ORM。開發者可以很便捷地定義表、索引、約束,并進行增刪改查操作。

          [database getObjectsOfClass:WCTSampleConvenient.class
                            fromTable:tableName
                                where:WCTSampleConvenient.intValue>=10
                                limit:20];
      • 高效,WCDB通過框架層和sqlcipher源碼優化,使其更高效的表現。

        • 多線程高并發:WCDB支持多線程讀與讀、讀與寫并發執行,寫與寫串行執行。

        • 批量寫操作性能測試:

          更多關于WCDB的性能數據,請參考benchmark

      • 完整,WCDB覆蓋了數據庫相關各種場景的所需功能。

        • 加密:WCDB提供基于SQLCipher的數據庫加密。
        • 損壞修復:WCDB內建了Repair Kit用于修復損壞的數據庫。
        • 反注入:WCDB內建了對SQL注入的保護。

      基本要求

      • WCDB支持iOS 7、macOS 10.9以上。
      • WCDB需使用Xcode 8.0以上版本進行編譯。
      • 需使用Objective-C++。

       

      通過CocoaPods安裝,此處不介紹安裝過程,感興趣可以參考文章:http://www.rzrgm.cn/HJiang/p/7228166.html

       

      /*
       將一個已有的ObjC類進行ORM綁定的過程如下:
       
       定義該類遵循WCTTableCoding協議。可以在類聲明上定義,也可以通過文件模版在category內定義。
       使用WCDB_PROPERTY宏在頭文件聲明需要綁定到數據庫表的字段。
       使用WCDB_IMPLEMENTATIO宏在類文件定義綁定到數據庫表的類。
       使用WCDB_SYNTHESIZE宏在類文件定義需要綁定到數據庫表的字段。
       */

       

      .實體類.

      新建Message類

      Message.h

      #import <Foundation/Foundation.h>
      
      @interface Message : NSObject
      
      /**
       * 本地id
       */
      @property (nonatomic,assign) int localID;
      
      /**
       *  消息內容
       */
      @property (nonatomic, strong) NSString *content;
      
      /**
       *  創建時間
       */
      @property (nonatomic, strong) NSDate *createTime;
      
      /**
       *  最后更新時間
       */
      @property (nonatomic, strong) NSDate *modifiedTime;
      
      /**
       *  未讀消息
       */
      @property (nonatomic,assign) int unused;
      
      @end

      Message.mm

      #import "Message.h"
      #import "Message+WCTTableCoding.h"
      
      @implementation Message
      
      // 利用這個宏定義綁定到表的類
      WCDB_IMPLEMENTATION(Message)
      
      // 下面四個宏定義綁定到表中的字段
      WCDB_SYNTHESIZE(Message, localID)
      WCDB_SYNTHESIZE(Message, content)
      WCDB_SYNTHESIZE(Message, createTime)
      WCDB_SYNTHESIZE(Message, modifiedTime)
      
      // 約束宏定義數據庫的主鍵
      WCDB_PRIMARY(Message, localID)
      
      // 定義數據庫的索引屬性,它直接定義createTime字段為索引
      // 同時 WCDB 會將表名 + "_index" 作為該索引的名稱
      WCDB_INDEX(Message, "_index", createTime)
      
      
      - (NSString *)description{
          return [NSString stringWithFormat:@"localID:%d content:%@ createTime:%@ modifiedTime:%@",_localID,_content,_createTime,_modifiedTime];
      }
      
      @end

      Message+WCTTableCoding.h Message分類

      #import "Message.h"
      #import <WCDB/WCDB.h>
      
      @interface Message (WCTTableCoding) <WCTTableCoding>
      
      /*
       需要綁定到表中的字段在這里聲明,在.mm中去綁定
       使用WCDB_PROPERTY宏在頭文件聲明需要綁定到數據庫表的字段。
       */
      WCDB_PROPERTY(localID)
      WCDB_PROPERTY(content)
      WCDB_PROPERTY(createTime)
      WCDB_PROPERTY(modifiedTime)
      
      @end

      由于WCDB是基于Objective-C++,因此需要將引用WCDB的源文件后綴.m改為.mm

      所以Message.m需修改為.mm

       

      數據庫管理類

      WCTDatabaseManager.h WCTDatabaseManager.mm

      #import <Foundation/Foundation.h>
      @class WCTDatabase;
      
      @interface WCTDatabaseManager : NSObject
      
      + (instancetype)shareInstance;
      
      - (WCTDatabase *)getDatabase;
      
      /**
       創建數據庫
       
       @param tableName 表名稱
       @return 是否創建成功
       */
      - (BOOL)creatDataBaseWithName:(NSString *)tableName;
      
      @end
      #import "WCTDatabaseManager.h"
      #import "WCTDatabaseManager+DataBase.h"
      #import "Message.h"
      //#import "Message+WCTTableCoding.h"
      
      @interface WCTDatabaseManager()
      {
          WCTDatabase *database;
      }
      
      @end
      
      @implementation WCTDatabaseManager
      
      + (instancetype)shareInstance{
          
          static WCTDatabaseManager * instance = nil;
          static dispatch_once_t onceToken;
          dispatch_once(&onceToken, ^{
              
              instance = [[WCTDatabaseManager alloc]init];
              
          });
          
          return instance;
      }
      
      - (NSString *)getDatabasePath{
          //獲取沙盒根目錄
          NSString *documentsPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
          
          // 文件路徑
          NSString *filePath = [documentsPath stringByAppendingPathComponent:@"Wechat.sqlite"];
          return filePath;
      }
      
      - (WCTDatabase *)getDatabase{
          if(!database){
              NSString *filePath = [self getDatabasePath];
              NSLog(@"wChatDatapath = %@",filePath);
              
              database = [[WCTDatabase alloc] initWithPath:filePath];
          }
          return database;
      }
      
      -(BOOL)creatDataBaseWithName:(NSString *)tableName{
          
          [self getDatabase];
          
          // 數據庫加密
          //NSData *password = [@"MyPassword" dataUsingEncoding:NSASCIIStringEncoding];
          //[database setCipherKey:password];
          //測試數據庫是否能夠打開
          if ([database canOpen]) {
              
              // WCDB大量使用延遲初始化(Lazy initialization)的方式管理對象,因此SQLite連接會在第一次被訪問時被打開。開發者不需要手動打開數據庫。
              // 先判斷表是不是已經存在
              if ([database isOpened]) {
                  if ([database isTableExists:tableName]) {
                      NSLog(@"表已經存在");
                      return NO;
                  }else{
                      return [database createTableAndIndexesOfName:tableName withClass:Message.class];
                  }
              }
          }
          return NO;
      }
      
      @end

      WCTDatabaseManager+DataBase.h WCTDatabaseManager分類,引入WCDB頭文件

      #import <WCDB/WCDB.h>
      
      @interface WCTDatabaseManager (DataBase)
      
      @end

       

      數據庫操作類

      #import <Foundation/Foundation.h>
      @class Message;
      
      @interface MessageDao : NSObject
      
      - (BOOL)insertMessage:(Message *)message;
      
      - (BOOL)insertMessageWithTransaction:(Message *)message;
      
      - (BOOL)insertMessageWithBlock:(Message *)message;
      
      - (BOOL)deleteMessage:(Message *)message;
      
      - (BOOL)updataMessage:(Message *)message;
      
      - (NSArray *)seleteMessages;
      
      @end
      #import "MessageDao.h"
      #import "WCTDatabaseManager.h"
      #import <WCDB/WCDB.h>
      #import "Message.h"
      #import "Message+WCTTableCoding.h"
      
      #define kDataBase [[WCTDatabaseManager shareInstance] getDatabase]
      
      @implementation MessageDao
      
      - (BOOL)insertMessage:(Message *)message{
          return  [kDataBase insertObject:message into:@"message"];
      }
      
      // WCTDatabase 事務操作,利用WCTTransaction
      - (BOOL)insertMessageWithTransaction:(Message *)message{
      
          BOOL ret = [kDataBase beginTransaction];
          ret = [self insertMessage:message];
          if (ret) {
              [kDataBase commitTransaction];
          }else{
              [kDataBase rollbackTransaction];
          }
          return ret;
      }
      
      
      // 另一種事務處理方法Block
      - (BOOL)insertMessageWithBlock:(Message *)message{
      
          BOOL commit = [kDataBase runTransaction:^BOOL{
              BOOL ret = [self insertMessage:message];
              if (ret) {
                  return YES;
              }else{
                  return NO;
              }
          } event:^(WCTTransactionEvent event) {
              NSLog(@"Event %d", event);
          }];
          return commit;
      }
      
      - (BOOL)deleteMessage:(Message *)message{
      //    刪除
          //DELETE FROM message WHERE localID>0;
          return [kDataBase deleteObjectsFromTable:@"message" where:Message.localID > 0];
      }
      
      - (BOOL)updataMessage:(Message *)message{
          //修改
          //UPDATE message SET content="Hello, Wechat!";
          return [kDataBase updateAllRowsInTable:@"message" onProperty:Message.content withObject:message];
      }
      
      - (NSArray *)seleteMessage{
          
          //SELECT * FROM message ORDER BY localID
          NSArray<Message *> * message = [kDataBase getObjectsOfClass:Message.class fromTable:@"message" orderBy:Message.localID.order()];
          
          return message;
      }
      
      @end

       

      測試方法

       

      ---恢復內容結束---

      WCDB

      WCDB是一個高效、完整、易用的移動數據庫框架,基于SQLCipher,支持iOS, macOS。

       

      WCDB for iOS/macOS

      基本特性

      • 易用,WCDB支持一句代碼即可將數據取出并組合為object。

        • WINQ(WCDB語言集成查詢):通過WINQ,開發者無須為了拼接SQL的字符串而寫一大坨膠水代碼。

        • ORM(Object Relational Mapping):WCDB支持靈活、易用的ORM。開發者可以很便捷地定義表、索引、約束,并進行增刪改查操作。

          [database getObjectsOfClass:WCTSampleConvenient.class
                            fromTable:tableName
                                where:WCTSampleConvenient.intValue>=10
                                limit:20];
      • 高效,WCDB通過框架層和sqlcipher源碼優化,使其更高效的表現。

        • 多線程高并發:WCDB支持多線程讀與讀、讀與寫并發執行,寫與寫串行執行。

        • 批量寫操作性能測試:

          更多關于WCDB的性能數據,請參考benchmark

      • 完整,WCDB覆蓋了數據庫相關各種場景的所需功能。

        • 加密:WCDB提供基于SQLCipher的數據庫加密。
        • 損壞修復:WCDB內建了Repair Kit用于修復損壞的數據庫。
        • 反注入:WCDB內建了對SQL注入的保護。

      基本要求

      • WCDB支持iOS 7、macOS 10.9以上。
      • WCDB需使用Xcode 8.0以上版本進行編譯。
      • 需使用Objective-C++。

       

      通過CocoaPods安裝,此處不介紹安裝過程,感興趣可以參考文章:http://www.rzrgm.cn/HJiang/p/7228166.html

      /*

       將一個已有的ObjC類進行ORM綁定的過程如下:

       

       定義該類遵循WCTTableCoding協議。可以在類聲明上定義,也可以通過文件模版在category內定義。

       使用WCDB_PROPERTY宏在頭文件聲明需要綁定到數據庫表的字段。

       使用WCDB_IMPLEMENTATIO宏在類文件定義綁定到數據庫表的類。

       使用WCDB_SYNTHESIZE宏在類文件定義需要綁定到數據庫表的字段。

       */

      以例子參考:

      .實體類.

      新建Message類

      Message.h

      #import <Foundation/Foundation.h>
      
      @interface Message : NSObject
      
      /**
       * 本地id
       */
      @property (nonatomic,assign) int localID;
      
      /**
       *  消息內容
       */
      @property (nonatomic, strong) NSString *content;
      
      /**
       *  創建時間
       */
      @property (nonatomic, strong) NSDate *createTime;
      
      /**
       *  最后更新時間
       */
      @property (nonatomic, strong) NSDate *modifiedTime;
      
      /**
       *  未讀消息
       */
      @property (nonatomic,assign) int unused;
      
      @end

      Message.mm

      #import "Message.h"
      #import "Message+WCTTableCoding.h"
      
      @implementation Message
      
      // 利用這個宏定義綁定到表的類
      WCDB_IMPLEMENTATION(Message)
      
      // 下面四個宏定義綁定到表中的字段
      WCDB_SYNTHESIZE(Message, localID)
      WCDB_SYNTHESIZE(Message, content)
      WCDB_SYNTHESIZE(Message, createTime)
      WCDB_SYNTHESIZE(Message, modifiedTime)
      
      // 約束宏定義數據庫的主鍵
      WCDB_PRIMARY(Message, localID)
      
      // 定義數據庫的索引屬性,它直接定義createTime字段為索引
      // 同時 WCDB 會將表名 + "_index" 作為該索引的名稱
      WCDB_INDEX(Message, "_index", createTime)
      
      
      - (NSString *)description{
          return [NSString stringWithFormat:@"localID:%d content:%@ createTime:%@ modifiedTime:%@",_localID,_content,_createTime,_modifiedTime];
      }
      
      @end

      Message+WCTTableCoding.h Message分類

      #import "Message.h"
      #import <WCDB/WCDB.h>
      
      @interface Message (WCTTableCoding) <WCTTableCoding>
      
      /*
       需要綁定到表中的字段在這里聲明,在.mm中去綁定
       使用WCDB_PROPERTY宏在頭文件聲明需要綁定到數據庫表的字段。
       */
      WCDB_PROPERTY(localID)
      WCDB_PROPERTY(content)
      WCDB_PROPERTY(createTime)
      WCDB_PROPERTY(modifiedTime)
      
      @end

      由于WCDB是基于Objective-C++,因此需要將引用WCDB的源文件后綴.m改為.mm

      所以Message.m需修改為.mm

       

      數據庫管理類

      WCTDatabaseManager.h WCTDatabaseManager.mm

      #import <Foundation/Foundation.h>
      @class WCTDatabase;
      
      @interface WCTDatabaseManager : NSObject
      
      + (instancetype)shareInstance;
      
      - (WCTDatabase *)getDatabase;
      
      /**
       創建數據庫
       
       @param tableName 表名稱
       @return 是否創建成功
       */
      - (BOOL)creatDataBaseWithName:(NSString *)tableName;
      
      @end
      #import "WCTDatabaseManager.h"
      #import "WCTDatabaseManager+DataBase.h"
      #import "Message.h"
      //#import "Message+WCTTableCoding.h"
      
      @interface WCTDatabaseManager()
      {
          WCTDatabase *database;
      }
      
      @end
      
      @implementation WCTDatabaseManager
      
      + (instancetype)shareInstance{
          
          static WCTDatabaseManager * instance = nil;
          static dispatch_once_t onceToken;
          dispatch_once(&onceToken, ^{
              
              instance = [[WCTDatabaseManager alloc]init];
              
          });
          
          return instance;
      }
      
      - (NSString *)getDatabasePath{
          //獲取沙盒根目錄
          NSString *documentsPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
          
          // 文件路徑
          NSString *filePath = [documentsPath stringByAppendingPathComponent:@"Wechat.sqlite"];
          return filePath;
      }
      
      - (WCTDatabase *)getDatabase{
          if(!database){
              NSString *filePath = [self getDatabasePath];
              NSLog(@"wChatDatapath = %@",filePath);
              
              database = [[WCTDatabase alloc] initWithPath:filePath];
          }
          return database;
      }
      
      -(BOOL)creatDataBaseWithName:(NSString *)tableName{
          
          [self getDatabase];
          
          // 數據庫加密
          //NSData *password = [@"MyPassword" dataUsingEncoding:NSASCIIStringEncoding];
          //[database setCipherKey:password];
          //測試數據庫是否能夠打開
          if ([database canOpen]) {
              
              // WCDB大量使用延遲初始化(Lazy initialization)的方式管理對象,因此SQLite連接會在第一次被訪問時被打開。開發者不需要手動打開數據庫。
              // 先判斷表是不是已經存在
              if ([database isOpened]) {
                  if ([database isTableExists:tableName]) {
                      NSLog(@"表已經存在");
                      return NO;
                  }else{
                      return [database createTableAndIndexesOfName:tableName withClass:Message.class];
                  }
              }
          }
          return NO;
      }
      
      @end

      WCTDatabaseManager+DataBase.h WCTDatabaseManager分類,引入WCDB頭文件

      #import <WCDB/WCDB.h>
      
      @interface WCTDatabaseManager (DataBase)
      
      @end

       

      數據庫操作類

      #import <Foundation/Foundation.h>
      @class Message;
      
      @interface MessageDao : NSObject
      
      - (BOOL)insertMessage:(Message *)message;
      
      - (BOOL)insertMessageWithTransaction:(Message *)message;
      
      - (BOOL)insertMessageWithBlock:(Message *)message;
      
      - (BOOL)deleteMessage:(Message *)message;
      
      - (BOOL)updataMessage:(Message *)message;
      
      - (NSArray *)seleteMessages;
      
      @end
      #import "MessageDao.h"
      #import "WCTDatabaseManager.h"
      #import <WCDB/WCDB.h>
      #import "Message.h"
      #import "Message+WCTTableCoding.h"
      
      #define kDataBase [[WCTDatabaseManager shareInstance] getDatabase]
      
      @implementation MessageDao
      
      - (BOOL)insertMessage:(Message *)message{
          return  [kDataBase insertObject:message into:@"message"];
      }
      
      // WCTDatabase 事務操作,利用WCTTransaction
      - (BOOL)insertMessageWithTransaction:(Message *)message{
      
          BOOL ret = [kDataBase beginTransaction];
          ret = [self insertMessage:message];
          if (ret) {
              [kDataBase commitTransaction];
          }else{
              [kDataBase rollbackTransaction];
          }
          return ret;
      }
      
      
      // 另一種事務處理方法Block
      - (BOOL)insertMessageWithBlock:(Message *)message{
      
          BOOL commit = [kDataBase runTransaction:^BOOL{
              BOOL ret = [self insertMessage:message];
              if (ret) {
                  return YES;
              }else{
                  return NO;
              }
          } event:^(WCTTransactionEvent event) {
              NSLog(@"Event %d", event);
          }];
          return commit;
      }
      
      - (BOOL)deleteMessage:(Message *)message{
      //    刪除
          //DELETE FROM message WHERE localID>0;
          return [kDataBase deleteObjectsFromTable:@"message" where:Message.localID > 0];
      }
      
      - (BOOL)updataMessage:(Message *)message{
          //修改
          //UPDATE message SET content="Hello, Wechat!";
          return [kDataBase updateAllRowsInTable:@"message" onProperty:Message.content withObject:message];
      }
      
      - (NSArray *)seleteMessage{
          
          //SELECT * FROM message ORDER BY localID
          NSArray<Message *> * message = [kDataBase getObjectsOfClass:Message.class fromTable:@"message" orderBy:Message.localID.order()];
          
          return message;
      }
      
      @end

       

      測試方法

      #import "ViewController.h"
      #import "WCTDatabaseManager.h"
      #import "MessageDao.h"
      #import "Message.h"
      
      @interface ViewController ()
      
      @end
      
      @implementation ViewController
      
      - (void)viewDidLoad {
          [super viewDidLoad];
      }
      
      - (IBAction)createDataBaseDidClick:(UIButton *)sender {
          
          BOOL  result = [[WCTDatabaseManager shareInstance] creatDataBaseWithName:@"message"];
          NSLog(@"%@",((result == YES)?@"創建數據庫成功":@"創建數據庫失敗"));
      }
      
      - (IBAction)insertBtnDidClick:(UIButton *)sender {
          MessageDao *messageDao = [[MessageDao alloc] init];
          Message *message = [[Message alloc] init];
          message.localID = 1;
          message.content = @"Hello, WCDB!";
          message.createTime = [NSDate date];
          message.modifiedTime = [NSDate date];
          [messageDao insertMessageWithTransaction:message];
      }
      
      - (IBAction)updateBtnDidClick:(UIButton *)sender {
          MessageDao *messageDao = [[MessageDao alloc] init];
          Message *message = [[Message alloc] init];
          message.content = @"Hello, Wechat!";
          [messageDao updataMessage:message];
      }
      
      - (IBAction)selectBtnDidClick:(UIButton *)sender {
          MessageDao *messageDao = [[MessageDao alloc] init];
          NSArray *messages = [messageDao seleteMessage];
          NSLog(@"%@",messages);
      }
      
      - (IBAction)deleteBtnDidClick:(UIButton *)sender {
          MessageDao *messageDao = [[MessageDao alloc] init];
          [messageDao deleteMessage:nil];
      }
      
      
      @end

       

      更多的查詢操作后續更新.

       

      posted on 2018-01-10 20:28  HJiang  閱讀(1291)  評論(0)    收藏  舉報

      主站蜘蛛池模板: 国产人妻精品一区二区三区不卡| 亚洲狼人久久伊人久久伊| 国色天香成人一区二区| 肉大捧一进一出免费视频| 无码囯产精品一区二区免费| 久久人人爽人人爽人人av| 老熟妇仑乱换频一区二区| 国产剧情福利一区二区麻豆| 九九久久亚洲精品美国国内| 免费人成再在线观看视频| 天堂av在线一区二区| 国产av丝袜熟女一二三| 欧美做受视频播放| 亚洲精品日本一区二区| 成在线人永久免费视频播放| 懂色AV| 国产香蕉尹人综合在线观看| 国产成人精品无码专区| 嫩草院一区二区乱码| 日韩av一区二区高清不卡| 热久在线免费观看视频| 国产精品自拍中文字幕| 国产精品毛片久久久久久久| 成人自拍小视频免费观看| 云霄县| 国产极品精品自在线不卡| 精品人妻中文字幕av| 日本一区二区三区黄色网| bt天堂新版中文在线| 国产99青青成人A在线| 色吊丝免费av一区二区| 久久精品国产亚洲av热一区| 青青草原国产精品啪啪视频 | 美女内射福利大全在线看| 欧美人人妻人人澡人人尤物| 国内精品久久人妻无码妲| 亚洲高清国产拍精品网络战| 91久久天天躁狠狠躁夜夜| 国产精品亚洲二区在线播放| 色欲国产精品一区成人精品| 亚洲精品福利一区二区三区蜜桃|