iOS iCloud Development(3) iCloudKit Storage

栏目: IOS · 发布时间: 5年前

内容简介:cloud kit一共有7个基础类,简单了解一下这些基础类接下来的使用就比较容易理解了。通过初始化之后就可以使用

cloud kit一共有7个基础类,简单了解一下这些基础类接下来的使用就比较容易理解了。

CKContainer

CKContainer 类似于应用运行时的沙盒,一个应用只能访问自己的沙盒,同样的,一个应用也只能访问自己的Container。

通过初始化之后就可以使用

CKContainer *container = [CKContainer defaultContainer];

CKDatabase

CKDatabase 很明显就是数据库,他拥有 私有数据库 公有数据库 两种类型。用户只能访问自己的私有数据库,一些不敏感的数据也可以存储在公有数据库中。

//公有数据库
 CKDatabase *datebase = container.publicCloudDatabase;
 //私有数据库
 CKDatabase *datebase = container.privateCloudDatabase;

CKRecord

CKRecord 就是数据库中的一条数据记录,他通过key-value的方式来存储和获取数据。目前可以支持如下格式的数据:

  • NSString(swift中的Sting)
  • NSNumber
  • NSData
  • NSDate
  • CLLocation
  • CKReference

  • CKAsset

其中图片的数据类型需要先初始化一个URL,然后把图片保存到本地沙盒,生成URL,再创建 CKAsset 来存储。

CKRecordZone

CKRecordZone 是用来保存 Record 的。所有的 Record 都是保存在这里,应用有一个默认的 zone ,也可以自定义 zone

CKRecordIdentifier

CKRecordIdentifierRecord 的唯一标示,用来确定 Record 在数据库中的位置。

CKReference

CKReference 是一种引用关系。

CKAsset

CKAsset 为资源文件,比如之前提到的照片就是用这种方式存储的。

CloudKit Dashboard

在Xcode中进入或者直接在开发者网站

使用

这次我们只讲简单的操作,所以本篇文章就只使用 Data中的部分功能。

创建 RECORD TYPE

首先点击 Data , RECORD TYPE , Create New Type 创建一个新的RECORD TYPE。

iOS iCloud Development(3) iCloudKit Storage

这里 注意 ,我们的RECORD TYPE Name 是 Note ,这个在之后代码里操作非常重要,所以记得不要写错了。

添加 Field

有了表,接下来就是添加字段了。点击 Add Field 然后输入字段名,选择类型就可以了。这里可以一次性添加多条,添加完点击保存就可以了。 iOS iCloud Development(3) iCloudKit Storage

添加的内容有:

  • title String
  • content String
  • photo Asset

添加 indexs

为了搜索更方便一些,我们添加一些索引。

点击 INDEXS ,选择我们刚刚添加的 Note ,然后添加索引,添加的索引类型有 QUERYABLE , SEARCHABLE , SORTABLE

iOS iCloud Development(3) iCloudKit Storage

添加的内容有:

  • title QUERYABLE
  • title SEARCHABLE
  • title SORTABLE
  • content QUERYABLE
  • content SEARCHABLE
  • content SORTABLE
  • recordName QUERYABLE

添加数据

接下来,我们就可以给表里添加数据了。

选择 RECORD ,确认 LOAD RECORDS FROMQUERY FOR RECORDS OF TYPE 都正确了之后,点击 Creat New Record… ,在右边输入想要插入的数据,添加个几条就可以了。

iOS iCloud Development(3) iCloudKit Storage

查询数据

随便添加几条数据之后,还是在这个页面,点击左侧的 Query Records ,就可以查询到数据了。

通过代码操作 Cloud Kit

使用Cloud Kit时,首先要先引入Cloud kit的框架。 #import <CloudKit/CloudKit.h>

//获取最新的数据
+ (void)getNewDocument:(NSMetadataQuery *)myMetadataQuery
{
    [myMetadataQuery setSearchScopes:@[NSMetadataQueryUbiquitousDocumentsScope]];
    [myMetadataQuery startQuery];
}


#pragma mark - Cloud Kit

+ (void)saveCloudKitModelWithTitle:(NSString *)title content:(NSString *)content photoImage:(UIImage *)image
{
    CKContainer *container = [CKContainer defaultContainer];

    //公共数据
    CKDatabase *datebase = container.publicCloudDatabase;
//    //私有数据
//    CKDatabase *datebase = container.privateCloudDatabase;

    //创建主键
//    CKRecordID *noteID = [[CKRecordID alloc] initWithRecordName:@"NoteID"];
    
    //创建保存数据
    CKRecord *noteRecord = [[CKRecord alloc] initWithRecordType:RECORD_TYPE_NAME];
    
    
    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];
    }
    
    NSDate *dateID = [NSDate dateWithTimeIntervalSinceNow:0];
    NSTimeInterval timeInterval = [dateID timeIntervalSince1970] * 1000;      //*1000表示到毫秒级,这样可以保证不会同时生成两个同样的id
    NSString *idString = [NSString stringWithFormat:@"%.0f", timeInterval];

    NSString *filePath = [NSString stringWithFormat:@"%@/%@",tempPath,idString];
    NSURL *url = [NSURL fileURLWithPath:filePath];
    [imageData writeToURL:url atomically:YES];
    
    CKAsset *asset = [[CKAsset alloc]initWithFileURL:url];
    
    [noteRecord setValue:title forKey:@"title"];
    [noteRecord setValue:content forKey:@"content"];
    [noteRecord setValue:asset forKey:@"image"];
    
    
    [datebase saveRecord:noteRecord completionHandler:^(CKRecord * _Nullable record, NSError * _Nullable error) {
        
        if(!error)
        {
            NSLog(@"保存成功");
        }
        else
        {
            NSLog(@"保存失败");
            NSLog(@"%@",error.description);
        }
    }];
}

查询数据

查询所有数据

查询数据同样,我们也要先获取容器和数据库。

/查询数据
+ (void)queryCloudKitData
{
    //获取位置
    CKContainer *container = [CKContainer defaultContainer];
    CKDatabase *database = container.publicCloudDatabase;
    
    //添加查询条件
    NSPredicate *predicate = [NSPredicate predicateWithValue:YES];
    CKQuery *query = [[CKQuery alloc] initWithRecordType:RECORD_TYPE_NAME predicate:predicate];
    query.sortDescriptors = @[[NSSortDescriptor sortDescriptorWithKey:@"collectTime" ascending:NO]];
    //开始查询
    [database performQuery:query inZoneWithID:nil completionHandler:^(NSArray<CKRecord *> * _Nullable results, NSError * _Nullable error) {
        
        NSLog(@"%@",results);
        //把数据做成字典通知出去
        NSDictionary *userinfoDic = [NSDictionary dictionaryWithObject:results forKey:@"key"];

        [[NSNotificationCenter defaultCenter] postNotificationName:@"CloudDataQueryFinished" object:nil userInfo:userinfoDic];
    }];

}

查询单个数据

//查询单条数据
+ (void)querySingleRecordWithRecordID:(CKRecordID *)recordID
{
    //获取容器
    CKContainer *container = [CKContainer defaultContainer];
    //获取公有数据库
    CKDatabase *database = container.publicCloudDatabase;
    
    [database fetchRecordWithID:recordID completionHandler:^(CKRecord * _Nullable record, NSError * _Nullable error) {
        
        dispatch_async(dispatch_get_main_queue(), ^{
            NSLog(@"%@",record);
            //把数据做成字典通知出去
            NSDictionary *userinfoDic = [NSDictionary dictionaryWithObject:record forKey:@"key"];
            [[NSNotificationCenter defaultCenter] postNotificationName:@"CloudDataSingleQueryFinished" object:nil userInfo:userinfoDic];
        });
    }];
}

删除数据

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

}

修改数据

//修改数据
+ (void)changeCloudKitWithTitle:(NSString *)title content:(NSString *)content photoImage:(UIImage *)image RecordID:(CKRecordID *)recordID
{
    //获取容器
    CKContainer *container = [CKContainer defaultContainer];
    //获取公有数据库
    CKDatabase *database = container.publicCloudDatabase;
    
    [database fetchRecordWithID:recordID completionHandler:^(CKRecord * _Nullable record, NSError * _Nullable error) {
        
        
        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];
        }
        
        NSDate *dateID = [NSDate dateWithTimeIntervalSinceNow:0];
        NSTimeInterval timeInterval = [dateID timeIntervalSince1970] * 1000;      //*1000表示到毫秒级,这样可以保证不会同时生成两个同样的id
        NSString *idString = [NSString stringWithFormat:@"%.0f", timeInterval];
        
        NSString *filePath = [NSString stringWithFormat:@"%@/%@",tempPath,idString];
        NSURL *url = [NSURL fileURLWithPath:filePath];
        [imageData writeToURL:url atomically:YES];
        CKAsset *asset = [[CKAsset alloc]initWithFileURL:url];
        [record setObject:title forKey:@"title"];
        [record setObject:content forKey:@"content"];
        [record setValue:asset forKey:@"photo"];
        [database saveRecord:record completionHandler:^(CKRecord * _Nullable record, NSError * _Nullable error) {
            
            if(error)
            {
                
                NSLog(@"修改失败 %@",error.description);
            }
            else
            {
                NSLog(@"修改成功");
            }
        }];
    }];
}

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

TCP/IP详解 卷1:协议

TCP/IP详解 卷1:协议

W.Richard Stevens / 范建华 / 机械工业出版社 / 2000-4-1 / 45.00元

《TCP/IP详解卷1:协议》是一本完整而详细的TCP/IP协议指南。描述了属于每一层的各个协议以及它们如何在不同操作系统中运行。作者W.Richard Stevens用Lawrence Berkeley实验室的tcpdump程序来捕获不同操作系统和TCP/IP实现之间传输的不同分组。对tcpdump输出的研究可以帮助理解不同协议如何工作。 《TCP/IP详解卷1:协议》适合作为计算机专业学......一起来看看 《TCP/IP详解 卷1:协议》 这本书的介绍吧!

JS 压缩/解压工具
JS 压缩/解压工具

在线压缩/解压 JS 代码

XML、JSON 在线转换
XML、JSON 在线转换

在线XML、JSON转换工具