[iCloud]CloudKit简单使用

上篇文章:[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)

CK开头的数据类型,是 CloudKit.framework的一部分.这里我主要介绍字符串的处理,日期和资源(一种特殊情况),上面的CKReference和CLLocation(特殊类型)暂且不在讨论范围,如果有兴趣,可以参考官网资料学习...

本次讨论,主要是实现数据的增删改查操作,更多功能可参考官方API.

1.添加数据

CloudKit给应用程序分配部分空间,用于存储数据,首先要获取这个存储空间,这里我们直接获取了默认的存储器(可以自定义存储器):

CKContainer *container = [CKContainer defaultContainer];

然后获取他的数据种类,也就是你要存的数据是隐私数据,还是对外公开的公共数据:

CKDatabase *database = container.publicCloudDatabase;//公共数据

CKDatabase *database = container.privateCloudDatabase;//隐私数据

接着,就要设置要保存的数据,每一个数据库都有一个唯一的字段来标识唯一的一条数据,这里也不例外,就是CKRecordID:

//创建主键id
    CKRecordID *noteId = [[CKRecordID alloc]initWithRecordName:@"IDname"];

创建一条记录(数据):

//创建CKRecord 保存数据
    CKRecord *noteRecord = [[CKRecord alloc]initWithRecordType:@"recordType" recordID:noteId];


这里的recordType可以理解为一个数据模型,这儿传的就是模型的名称;

设置数据,CKRecord的使用和字典非常相似,如下保存一个字符串:

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

关于图片的保存,需要用到CKAsset,他的初始化需要一个URL,所以这里,我先把图片数据保存到本地沙盒,生成一个URL,然后再去创建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];


这样一条数据就准备好了,最后,将他写入iCloud:

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

这样在CloudKit Dashboard上的Record Types中可以看到新添加的数据模型,在PUBLIC DATA中的Default Zone可以看到这条记录的详细信息;

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>
    

执行查询的操作,用到了另一个类:CKQuery:

    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);
    }];

这里的results就是包含当前数据模型下的所有记录的数组,其成员为CKRecord对象;

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);
        });
    }];

3. 修改记录

修改一个记录,需要先获取这个记录,然后进行相应的修改,这里假设已经获取到了这条数据,我直接进行修改:

    [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说明文档

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值