通過保存記錄創建數據庫架構
在開發過程中,使用CloudKit API創建架構很容易。將記錄對象保存到數據庫時,將自動為您創建關聯的記錄類型及其字段。此功能稱為即時模式,僅當您使用開發環境(商店中出售的應用程序無法訪問)時才可用。例如,在開發過程中,您可以使用存儲在屬性列表中的測試記錄填充CloudKit數據庫。
本章介紹一些CloudKit API,并包含代碼片段。#import <CloudKit/CloudKit.h>
在每個使用CloudKit類和方法的實施文件的頂部添加。閱讀Cloud Kit Framework Reference,以獲取有關CloudKit API的詳細信息。
關于設計架構
設計CloudKit模式,以存儲要保留的應用程序對象模型的各個部分。如果要從頭開始實現應用程序,請使用Model-View-Controller設計模式將用戶界面視圖與模型對象分開。然后設計一個架構,以有效地存儲要存儲在iCloud中的對象模型的各個部分。
將數據分為記錄類型
CloudKit架構由一個或多個具有名稱,字段和其他元數據的記錄類型組成。字段類型與允許的屬性列表類型相似,但有一些補充。Asset
對于與記錄分開存儲的大容量數據,請使用特殊的類型;Location
對于有效查詢地理坐標的類型,請使用一種特殊的類型;對于記錄之間Reference
的一對一和一對多的關系,請使用一種特殊的類型。一條記錄的最大大小為1MB,因此對于大數據,請使用該Asset
類型(而不是該Bytes
類型)。
該表顯示了可能出現的字段類型(與它們在CloudKit儀表板中一樣)以及它們等效的CloudKit框架類。
使用這些字段設計記錄類型以存儲應用程序的持久數據。例如,此主從細節用戶界面的草圖在主界面(左側的列)中顯示了藝術品標題的集合,在詳細信息界面(右側的區域)中顯示了所選藝術品的屬性。
在代碼中,基礎對象模型由Artwork和Artist類組成,其中和Artwork具有一對一的關系Artist。
在模式中,此對象模型中的對象與記錄類型Artwork和之間存在一對一的映射Artist。記錄類型的artist字段是具有對Artwork記錄的引用的引用類型Artist。該image字段是Asset包含URL 的類型,并且該location字段是Location具有經度和緯度屬性的類型。在所有其他領域Artwork,并Artist是簡單的String和Date類型。
確定記錄名稱
確定為您的記錄創建唯一名稱的啟發式方法。的記錄名稱加上一個記錄區(一個數據庫的一個分區)是記錄標識符,它表示一個記錄在數據庫中的位置。記錄名稱可以是另一個數據源使用的外鍵,也可以是使其在記錄區域內唯一的字符串組合。例如,記錄的記錄名稱Artwork
可以將藝術家的名字和姓氏與目錄號結合在一起,如string所示115 Chen, Mei
。如果您使用CloudKit儀表板創建記錄,則會為該記錄自動分配一個唯一ID。
以編程方式創建記錄
首先創建一個記錄標識符,[CKRecordID](https://developer.apple.com/documentation/cloudkit/ckrecordid)
該類的實例,指定記錄名稱和記錄區域。然后創建一條記錄,[CKRecord](https://developer.apple.com/documentation/cloudkit/ckrecord)
該類的實例,并傳遞記錄標識符。使用鍵值編碼樣式方法設置記錄的字段。
用代碼創建記錄
- 創建一個指定唯一記錄名稱的記錄ID
let artworkRecordID = CKRecordID(recordName: "115")
CKRecordID *artworkRecordID = [[CKRecordID alloc] initWithRecordName:@"115"];
- 創建一個記錄對象。
let artworkRecord = CKRecord(recordType: "Artwork", recordID: artworkRecordID)
CKRecord *artworkRecord = [[CKRecord alloc] initWithRecordType:@"Artwork" recordID:artworkRecordID];
- 設置記錄內容
artworkRecord["title"] = "MacKerricher State Park" as NSString
artworkRecord["artist"] = "Mei Chen" as NSString
artworkRecord["address"] = "Fort Bragg, CA" as NSString
artworkRecord[@"title" ] = @"MacKerricher State Park";
artworkRecord[@"artist"] = @"Mei Chen";
artworkRecord[@"address"] = @"Fort Bragg, CA";
保存記錄
首先選擇一個數據庫,您將在其中保存記錄(公共,私有或自定義),然后保存記錄。如果該記錄不存在記錄類型,則會為您創建。
保存記錄
在應用程序的默認容器中獲取數據庫。
要獲取公共數據庫:
獲得公共數據庫
let myContainer = CKContainer.default()
let publicDatabase = myContainer.publicCloudDatabase
CKContainer *myContainer = [CKContainer defaultContainer];
CKDatabase *publicDatabase = [myContainer publicCloudDatabase];
獲得個人數據庫
let myContainer = CKContainer.default()
let privateDatabase = myContainer.privateDatabase
CKContainer *myContainer = [CKContainer defaultContainer];
CKDatabase *privateDatabase = [myContainer privateCloudDatabase];
獲得自定義容器
let myContainer = CKContainer(identifier: "iCloud.com.example.ajohnson.GalleryShared")
CKContainer *myContainer = [CKContainer containerWithIdentifier:@"iCloud.com.example.ajohnson.GalleryShared"];
要創建由多個應用共享的自定義容器,請閱讀在應用之間共享容器。
- 保存記錄。
publicDatabase.save(artworkRecord) {
(record, error) in
if let error = error {
// Insert error handling
return
}
// Insert successfully saved record code
}
[publicDatabase saveRecord:artworkRecord completionHandler:^(CKRecord *artworkRecord, NSError *error){
if (error) {
// Insert error handling
return
}
// Insert successfully saved record code
}];
在運行應用程序之前輸入iCloud憑據
在開發中,當您在模擬器或設備上通過Xcode運行應用程序時,需要輸入iCloud憑據才能讀取公共數據庫中的記錄。在生產中,默認權限允許未經身份驗證的用戶讀取公共數據庫中的記錄,但不允許他們寫入記錄。
因此,在運行應用程序并將記錄保存到數據庫之前,請在iOS的“設置”或Mac的“系統偏好設置”中輸入iCloud帳戶。同時啟用iCloud Drive。稍后,編寫必要的錯誤處理,以在需要iCloud憑據時向用戶顯示對話框,如提醒用戶輸入iCloud憑據中所述。
要在iOS模擬器中運行您的應用程序,請在選擇模擬器之前在iOS模擬器中輸入iCloud憑據,然后單擊Xco??de中的“運行”按鈕。您需要對在Xcode的“方案”彈出菜單中選擇的每個iOS模擬器執行這些步驟。
在iOS模擬器中輸入iCloud憑據
- 選擇“ Xcode”>“打開開發者工具”>“ iOS模擬器”。
- 在iOS模擬器中,選擇“硬件”>“主頁”。
- 啟動設置應用程序,然后單擊iCloud。
輸入一個Apple ID和密碼。
-
單擊登錄。
等待iOS驗證iCloud帳戶。
-
要啟用iCloud Drive,請單擊iCloud Drive開關。
如果未出現該開關,則說明已啟用iCloud Drive。
有關如何創建iCloud帳戶的信息,請閱讀創建用于開發的iCloud帳戶。
提醒用戶輸入iCloud憑據
通過在保存記錄之前驗證用戶已登錄其iCloud帳戶來改善用戶的體驗。如果用戶未登錄,則顯示警報,指示用戶如何輸入其iCloud憑據并啟用iCloud Drive。在else下面的子句中插入保存記錄的代碼。
[[CKContainer defaultContainer] accountStatusWithCompletionHandler:^(CKAccountStatus accountStatus, NSError *error) {
if (accountStatus == CKAccountStatusNoAccount) {
UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"Sign in to iCloud"
message:@"Sign in to your iCloud account to write records. On the Home screen, launch Settings, tap iCloud, and enter your Apple ID. Turn iCloud Drive on. If you don't have an iCloud account, tap Create a new Apple ID."
preferredStyle:UIAlertControllerStyleAlert];
[alert addAction:[UIAlertAction actionWithTitle:@"Okay"
style:UIAlertActionStyleCancel
handler:nil]];
[self presentViewController:alert animated:YES completion:nil];
}
else {
// Insert your just-in-time schema code here
}
}];
要了解保存記錄時可能發生的錯誤,請閱讀CloudKit Framework Constants Reference。
運行您的應用
在Xcode中,運行您的應用程序以執行保存記錄并在數據庫中創建架構的代碼。
驗證您的步驟
使用CloudKit儀表板來驗證記錄類型是否已添加到架構以及記錄是否已添加到數據庫。
使用CloudKit儀表板查看記錄類型
驗證記錄類型具有正確的字段名稱和類型。
查看記錄類型
登錄到CloudKit儀表板。
從列表中選擇您的應用程序使用的容器。
在開發或生產環境中選擇數據。
在標簽欄中,單擊“記錄類型”。
-
選擇一種記錄類型。
字段名稱和類型顯示在右側的詳細信息區域中。
-
Users
出現的記錄類型是保留的系統記錄類型,無法刪除,但是可以向其添加字段。
在查看記錄之前啟用RecordName索引
默認情況下,禁用使用即時模式創建的記錄類型的所有元數據索引。需要啟用recordName查詢索引以查看CloudKit儀表板中的關聯記錄。
啟用recordName查詢索引
在標簽欄中,單擊“索引”,然后選擇一種記錄類型。
單擊添加索引,然后選擇recordName字段。
單擊保存記錄類型。
使用CloudKit儀表板查看記錄
驗證保存的記錄是否包含所有數據。
查看記錄
在CloudKit儀表板的標簽欄中,單擊“記錄”。
通過添加過濾器或排序條件來定義查詢。
單擊查詢記錄。
-
在第二列中,選擇一個recordName。
記錄鍵值對顯示在右側的詳細信息區域中
技術交流
QQ:3365059189
SwiftUI技術交流QQ群:518696470