上篇文章:[iCloud]iCloud学习笔记--APP内启用iCloud及CloudKit Dashboard介绍我简单介绍了怎样在项目中启用iCloud,以及一个web端的预览存储数据的工具.今天我来介绍一下实现数据存储到iCloud的框架:CloudKit.framework.
CloudKit存储数据的结构类似数据库,下面的很多操作你都会有似曾相识的感觉;
首先.我们来看一下,它能存储哪些类型的数据:
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)
本次讨论,主要是实现数据的增删改查操作,更多功能可参考官方API.
1.添加数据
CloudKit给应用程序分配部分空间,用于存储数据,首先要获取这个存储空间,这里我们直接获取了默认的存储器(可以自定义存储器):
CKContainer *container = [CKContainer defaultContainer];
CKDatabase *database = container.publicCloudDatabase;//公共数据 CKDatabase *database = container.privateCloudDatabase;//隐私数据
//创建主键id CKRecordID *noteId = [[CKRecordID alloc]initWithRecordName:@"IDname"];
//创建CKRecord 保存数据 CKRecord *noteRecord = [[CKRecord alloc]initWithRecordType:@"recordType" recordID:noteId];
设置数据,CKRecord的使用和字典非常相似,如下保存一个字符串:
noteRecord setObject:@"value" forKey:@"key"]
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];
[database saveRecord:noteRecord completionHandler:^(CKRecord * _Nullable record, NSError * _Nullable error) { if (!error) { NSLog(@"保存成功"); }];
2. 查询数据
2.1.查询所有的记录
查询数据,同样需要获取当前的数据的存储位置:
CKContainer *container = [CKContainer defaultContainer]; CKDatabase *database = <span style="font-family: Arial, Helvetica, sans-serif;">container.publicCloudDatabase</span><span style="font-family: Arial, Helvetica, sans-serif;">;</span>
NSPredicate *predicate = [NSPredicate predicateWithValue:YES]; CKQuery *query = [[CKQuery alloc]initWithRecordType:@"recordType" predicate:predicate];
开始查询:
[database performQuery:query inZoneWithID:nil completionHandler:^(NSArray<CKRecord *> * _Nullable results, NSError * _Nullable error) { NSLog(@"%@",results); }];
2.2. 查询单个记录
单条数据的查询就比较简单了,只需要知道他的CKRecordID就行了:
//创建主键id CKRecordID *noteId = [[CKRecordID alloc]initWithRecordName:@"IDName"]; //获取容器 CKContainer *container = [CKContainer defaultContainer]; //获取公有数据库 CKDatabase *database = <span style="font-family: Arial, Helvetica, sans-serif;">container.publicCloudDatabase</span><span style="font-family: Arial, Helvetica, sans-serif;">;</span> [database fetchRecordWithID:noteId completionHandler:^(CKRecord * _Nullable record, NSError * _Nullable error) { dispatch_async(dispatch_get_main_queue(), ^{ NSLog(@"%@",record); }); }];
修改一个记录,需要先获取这个记录,然后进行相应的修改,这里假设已经获取到了这条数据,我直接进行修改:
[record setObject:@"改变一下" forKey:@"key"]; [record setObject:@"原模型没有这个字段" forKey:@"newKey"];
需要注意,上面的newKey,原先的数据模型(recordType)里是没有这个字段的,如果修改的时候设置了,相当于新加一个字段,这样也是可以的;
然后,再执行保存操作:
//获取容器 CKContainer *container = [CKContainer defaultContainer]; //获取公有数据库 CKDatabase *database = <span style="font-family: Arial, Helvetica, sans-serif;">container.publicCloudDatabase</span><span style="font-family: Arial, Helvetica, sans-serif;">;</span> [database saveRecord:record completionHandler:^(CKRecord * _Nullable record, NSError * _Nullable error) { NSLog(@"修改成功"); }];
4. 删除记录
同样,删除也是已那个唯一的CKRecordID来进行的,直接给出代码:
CKRecordID *recordID = record.recordID; CKContainer *container = [CKContainer defaultContainer]; CKDatabase *database = <span style="font-family: Arial, Helvetica, sans-serif;">container.publicCloudDatabase;</span> [database deleteRecordWithID:recordID completionHandler:^(CKRecordID * _Nullable recordID, NSError * _Nullable error) { NSLog(@"删除成功"); }];
总结:
a.这里只是进行了简单的增删改查操作,也是最基本的操作,CloudKit中还有许多其他高级的操作,可以参考其官方文档学习;
b.上面的增删改查的结果,都是在子线程进行的,如果需要操作UI,请在回调的block内回到主线程进行;
c.所有操作的变化,都可以在CloudKit Dashboard上查看;
d.所有的操作都是在开发环境下进行的,如果要应用到项目中,还需要进行很多的配置,包括证书的设置;
e.笔者也是初步接触这个框架,不足之处还请指教!
参考资料:
文章
官方文档1
官方文档2
以及XcodeAPI说明文档