iOS iCloud Development(3) iCloudKit Storage

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

内容简介: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

CKRecordIdentifier 是 Record 的唯一标示,用来确定 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 FROM 和 QUERY 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(@"修改成功");
            }
        }];
    }];
}

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

查看所有标签

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

数据结构与算法分析

数据结构与算法分析

(美)(C.A.谢弗)Clifford A.Shaffer / 电子工业出版社 / 1998-8 / 35.00元

本书综合“数据结构与算法”的知识梳理、习题解答及上机辅导等于一身;精心挑选了覆盖教学大纲的五百多道题目,并且提供所有题目的参考答案;对于较难的算法和上机题,给出了详细的分析和说明;对于学习的重点和难点、易犯的错误、题目的难易和重要性,以及国内教材的差异等都给出了必要的说明。 本书可给使用各种教材讲授和学习“数据结构与算法”(或者“数据结构”)的师生参考,是系统复习该课程和准备应考计算......一起来看看 《数据结构与算法分析》 这本书的介绍吧!

CSS 压缩/解压工具
CSS 压缩/解压工具

在线压缩/解压 CSS 代码

图片转BASE64编码
图片转BASE64编码

在线图片转Base64编码工具

XML 在线格式化
XML 在线格式化

在线 XML 格式化压缩工具