[iCloud]CloudKit簡單使用

上篇文章[iCloud]項目內(nèi)啟用iCloud及CloudKit Dashboard介紹簡單介紹了怎樣在項目中啟用iCloud,以及一個web端的預覽存儲數(shù)據(jù)的工具.今天我來介紹一下實現(xiàn)數(shù)據(jù)存儲到iCloud的框架: CloudKit.framework.
CloudKit存儲數(shù)據(jù)的結(jié)構(gòu)類似數(shù)據(jù)庫,下面的很多操作你都會有似曾相識的感覺;
首先.我們來看一下,它能存儲哪些類型的數(shù)據(jù):

  • NSData (single bytes)
  • NSDate (date and time)
  • NSNumber (both Int and Double)
  • NSString (or String in Swift)
  • NSArray (list)
  • CKReference (used to create relationships between objects)
  • CLLocation (location)
  • CKAsset (file)

CK開頭的數(shù)據(jù)類型,是CloudKit.framework的一部分.這里我主要介紹字符串的處理,日期和資源(一種特殊情況),上面的CKReferenceCLLocation(特殊類型)暫且不在討論范圍,如果有興趣,可以參考官網(wǎng)資料學習...
本次討論,主要是實現(xiàn)數(shù)據(jù)的增刪改查操作,更多功能可參考官方API.

1. 添加數(shù)據(jù)

CloudKit給應(yīng)用程序分配部分空間,用于存儲數(shù)據(jù),首先要獲取這個存儲空間,這里我們直接獲取了默認的存儲器(可以自定義存儲器):

CKContainer *container = [CKContainer defaultContainer];  

然后獲取他的數(shù)據(jù)種類,也就是你要存的數(shù)據(jù)是隱私數(shù)據(jù),還是對外公開的公共數(shù)據(jù):

CKDatabase *database = container.publicCloudDatabase;//公共數(shù)據(jù)  
  
CKDatabase *database = container.privateCloudDatabase;//隱私數(shù)據(jù) 

接著,就要設(shè)置要保存的數(shù)據(jù),每一個數(shù)據(jù)庫都有一個唯一的字段來標識唯一的一條數(shù)據(jù),這里也不例外,就是CKRecordID:

//創(chuàng)建主鍵id  
CKRecordID *noteId = [[CKRecordID alloc]initWithRecordName:@"IDname"];  

每一條記錄(數(shù)據(jù)),就是一個CKRecord;
創(chuàng)建一條記錄(數(shù)據(jù)):

//創(chuàng)建CKRecord 保存數(shù)據(jù)  
    CKRecord *noteRecord = [[CKRecord alloc]initWithRecordType:@"recordType" recordID:noteId];  

這里的recordType可以理解為一個數(shù)據(jù)模型,這兒傳的就是模型的名稱;
設(shè)置數(shù)據(jù),CKRecord的使用和字典非常相似,如下保存一個字符串:

noteRecord setObject:@"value" forKey:@"key"]  

關(guān)于圖片的保存,需要用到CKAsset,他的初始化需要一個URL,所以這里,我先把圖片數(shù)據(jù)保存到本地沙盒,生成一個URL,然后再去創(chuàng)建CKAsset:

NSData *imageData = UIImagePNGRepresentation(image);  
if (imageData == nil) {  
    imageData = UIImageJPEGRepresentation(image, 0.6);  
    }  
    NSString *tempPath = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents/imagesTemp"];  
    NSFileManager *manager = [NSFileManager defaultManager];  
    if (![manager fileExistsAtPath:tempPath]) {  
          
        [manager createDirectoryAtPath:tempPath withIntermediateDirectories:YES attributes:nil error:nil];  
    }  
      
    NSString *filePath = [NSString stringWithFormat:@"%@/%@",tempPath,[self LZCreatRedomString]];  
    NSURL *url = [NSURL fileURLWithPath:filePath];  
    [imageData writeToURL:url atomically:YES];  
      
    CKAsset *asset = [[CKAsset alloc]initWithFileURL:url];  

這樣一條數(shù)據(jù)就準備好了,最后,將他寫入iCloud:

[database saveRecord:noteRecord completionHandler:^(CKRecord * _Nullable record, NSError * _Nullable error) {  
        if (!error) {  
              
            NSLog(@"保存成功");  
    }];

這樣在CloudKit Dashboard上的Record Types中可以看到新添加的數(shù)據(jù)模型,在PUBLIC DATA中的Default Zone可以看到這條記錄的詳細信息;

2. 查詢記錄(數(shù)據(jù))

2.1 查詢所有的記錄(數(shù)據(jù))

查詢數(shù)據(jù),同樣需要獲取當前的數(shù)據(jù)的存儲位置:

CKContainer *container = [CKContainer defaultContainer];  
CKDatabase *database = container.publicCloudDatabase

執(zhí)行查詢的操作,用到了另一個類: CKQuery

NSPredicate *predicate = [NSPredicate predicateWithValue:YES];  
CKQuery *query = [[CKQuery alloc]initWithRecordType:@"recordType" predicate:predicate];  

這里的第一個就是你要查詢的是那種類型的數(shù)據(jù),第二個參數(shù)是查詢條件,就是一個謂詞;
開始查詢:

[database performQuery:query inZoneWithID:nil completionHandler:^(NSArray<CKRecord *> * _Nullable results, NSError * _Nullable error) {  
          
        NSLog(@"%@",results);  
    }]; 

這里的results就是包含當前數(shù)據(jù)模型下的所有記錄的數(shù)組,其成員為CKRecord對象;

2.2. 查詢單個記錄

單條數(shù)據(jù)的查詢就比較簡單了,只需要知道他的CKRecordID就行了:

//創(chuàng)建主鍵id  
    CKRecordID *noteId = [[CKRecordID alloc]initWithRecordName:@"IDName"];  
      
    //獲取容器  
    CKContainer *container = [CKContainer defaultContainer];  
    //獲取公有數(shù)據(jù)庫  
    CKDatabase *database = container.publicCloudDatabase 
      
    [database fetchRecordWithID:noteId completionHandler:^(CKRecord * _Nullable record, NSError * _Nullable error) {  
          
        dispatch_async(dispatch_get_main_queue(), ^{  
            NSLog(@"%@",record);  
        });  
    }];  

3. 修改記錄(數(shù)據(jù))

修改一個記錄,需要先獲取這個記錄,然后進行相應(yīng)的修改,這里假設(shè)已經(jīng)獲取到了這條數(shù)據(jù),我直接進行修改:

[record setObject:@"改變一下" forKey:@"key"];  
[record setObject:@"原模型沒有這個字段" forKey:@"newKey"];  

需要注意,上面的newKey,原先的數(shù)據(jù)模型(recordType)里是沒有這個字段的,如果修改的時候設(shè)置了,相當于新加一個字段,這樣也是可以的;
然后,再執(zhí)行保存操作:

//獲取容器  
    CKContainer *container = [CKContainer defaultContainer];  
    //獲取公有數(shù)據(jù)庫  
    CKDatabase *database = container.publicCloudDatabase  
      
    [database saveRecord:record completionHandler:^(CKRecord * _Nullable record, NSError * _Nullable error) {  
          
        NSLog(@"修改成功");  
    }]; 

這樣原先的記錄就被修改了,而且多了一個字段;

4. 刪除記錄(數(shù)據(jù))

同樣,刪除也是以那個唯一的CKRecordID來進行的,直接給出代碼:

CKRecordID *recordID = record.recordID;  
  
CKContainer *container = [CKContainer defaultContainer];  
CKDatabase *database = container.publicCloudDatabase; 
  
[database deleteRecordWithID:recordID completionHandler:^(CKRecordID * _Nullable recordID, NSError * _Nullable error) {  
    NSLog(@"刪除成功");  
}];  

這樣就刪除成功了;

總結(jié):

  • a.這里只是進行了簡單的增刪改查操作,也是最基本的操作,CloudKit中還有許多其他高級的操作,可以參考其官方文檔學習;
  • b.上面的增刪改查的結(jié)果,都是在子線程進行的,如果需要操作UI,請在回調(diào)的block內(nèi)回到主線程進行;
  • c.所有操作的變化,都可以在CloudKit Dashboard上查看;
  • d.所有的操作都是在開發(fā)環(huán)境下進行的,如果要應(yīng)用到項目中,還需要進行很多的配置,包括證書的設(shè)置;
  • e.筆者也是初步接觸這個框架,不足之處還請指教!

參考資料

http://www.devtf.cn/?p=574
官方文檔 1
官方文檔 2
以及XcodeAPI說明文檔.

(完)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末留量,一起剝皮案震驚了整個濱河市古拴,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖颓哮,帶你破解...
    沈念sama閱讀 221,198評論 6 514
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件趴乡,死亡現(xiàn)場離奇詭異,居然都是意外死亡惑淳,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,334評論 3 398
  • 文/潘曉璐 我一進店門饺窿,熙熙樓的掌柜王于貴愁眉苦臉地迎上來歧焦,“玉大人,你說我怎么就攤上這事肚医【钼桑” “怎么了?”我有些...
    開封第一講書人閱讀 167,643評論 0 360
  • 文/不壞的土叔 我叫張陵肠套,是天一觀的道長舰涌。 經(jīng)常有香客問我,道長你稚,這世上最難降的妖魔是什么瓷耙? 我笑而不...
    開封第一講書人閱讀 59,495評論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮刁赖,結(jié)果婚禮上搁痛,老公的妹妹穿的比我還像新娘。我一直安慰自己宇弛,他們只是感情好鸡典,可當我...
    茶點故事閱讀 68,502評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著涯肩,像睡著了一般轿钠。 火紅的嫁衣襯著肌膚如雪巢钓。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,156評論 1 308
  • 那天疗垛,我揣著相機與錄音症汹,去河邊找鬼。 笑死贷腕,一個胖子當著我的面吹牛背镇,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播泽裳,決...
    沈念sama閱讀 40,743評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼瞒斩,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了涮总?” 一聲冷哼從身側(cè)響起胸囱,我...
    開封第一講書人閱讀 39,659評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎瀑梗,沒想到半個月后烹笔,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,200評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡抛丽,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,282評論 3 340
  • 正文 我和宋清朗相戀三年谤职,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片亿鲜。...
    茶點故事閱讀 40,424評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡允蜈,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出蒿柳,到底是詐尸還是另有隱情饶套,我是刑警寧澤,帶...
    沈念sama閱讀 36,107評論 5 349
  • 正文 年R本政府宣布其馏,位于F島的核電站凤跑,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏叛复。R本人自食惡果不足惜仔引,卻給世界環(huán)境...
    茶點故事閱讀 41,789評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望褐奥。 院中可真熱鬧咖耘,春花似錦、人聲如沸撬码。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,264評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至夫否,卻和暖如春彻犁,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背凰慈。 一陣腳步聲響...
    開封第一講書人閱讀 33,390評論 1 271
  • 我被黑心中介騙來泰國打工汞幢, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人微谓。 一個月前我還...
    沈念sama閱讀 48,798評論 3 376
  • 正文 我出身青樓森篷,卻偏偏與公主長得像,于是被迫代替她去往敵國和親豺型。 傳聞我的和親對象是個殘疾皇子仲智,可洞房花燭夜當晚...
    茶點故事閱讀 45,435評論 2 359

推薦閱讀更多精彩內(nèi)容