当前位置:  开发笔记 > 数据库 > 正文

分组核心数据数据结果?

如何解决《分组核心数据数据结果?》经验,为你挑选了1个好方法。

我正在iPhone上创建一个想法,但我在SQLite和CoreData的十字路口.主要原因是我似乎无法弄清楚如何对核心数据进行分组.

基本上我想显示按用户名分组的最新项目.在SQL语句中执行起来非常简单,但我无法在核心数据中使用它.我想,因为我正在开始一个新的应用程序,我不妨尝试使核心数据工作,但这部分是一个主要的障碍.

我在我的fetchrequest中添加了一个谓词,但这只给了我最近添加的单个记录,而不是每个用户最近添加的记录.

此时数据模型非常基础.它使用以下字段:username(字符串),post(字符串),created(datetime)

长话短说,这些类型的查询是否可以与CoreData一起使用?我想如果SQLite在幕后,必须有一些方法来做到这一点.



1> TechZen..:

首先,不要将Core Data视为另一种做SQL的方式.SQL不是Core Data的"幕后".核心数据处理对象.实体描述不是表,实体实例不是记录.使用Core Data进行编程与SQL无关,它只是将SQL用作几种可能类型的持久存储之一.你不直接处理它,而且永远不应该用SQL术语来考虑核心数据.

那种方式就是疯狂.

你需要喝很多龙舌兰酒并反复冲击头部,直到你忘记了所有关于SQL的知识.否则,您最终会得到一个对象图,它只是一个大的电子表格.

有几种方法可以在Core Data中实现您想要的功能.通常,您将使用复合谓词构造fetch,该谓词将返回特定用户在特定日期范围内的所有帖子.获取结果控制器对此尤其方便.

最简单的方法是将对象图设置为:

UserEntity
--Attribute username
--Relationship post <-->> PostEntity

PostEntity
--Attribute creationDate
--Attribute content
-- Relationship user <<--> UserEntity

然后在你的UserEntity类中有一个像这样的方法:

- (NSArray *) mostRecentPost{
    NSPredicate *recentPred=[NSPredicate predicateWithFormat:@"creationDate>%@", [NSDate dateWithTimeIntervalSinceNow:-(60*60*24)]];
    NSSet *recentSet=[self.post filteredSetUsingPredicate:recentPred];
    NSSortDescriptor *dateSort=[[NSSortDescriptor alloc] initWithKey:@"creationDate" ascending:NO];
    NSArray *returnArray=[[recentSet allObjects] sortedArrayUsingDescriptors:[NSArray arrayWithObject:dateSort]];
    return returnArray;
}

如果您想要按日期排序的特定用户的最新帖子列表,请致电:

NSArray *arrayForDisplay=[aUserEntityClassInstance mostRecentPost];

编辑:

...我只是将每个后期数据块(content,creationDate)传递给post实体?我是否也将用户名传递给帖子实体?用户实体如何知道何时创建新用户?

让我伪代码吧.您有两个定义userObj和postObj实例的类.当有新帖发布时,您:

Parse inputPost for a user;
Search existing userObj for that name;
if userObj with name does not exist
    create new userObj;
    set userObj.userName to name;
else 
    return the existing userObj that matches the name;
Parse inputPost for creation date and content;
Search post of chosen userObj;
if an exiting post does not match content or creation date
    create new postObj
    set postObj.creationDate to creation date;
    set postObj,content to content;
    set postObj.user to userObj; // the reciprocal in userObj is created automatically
else // most likely ignore as duplicate

你有单独的userObj和postObj,因为虽然每个帖子都是唯一的,但每个用户可能有很多帖子.

要掌握的重要概念是你处理对象即数据和逻辑的封装实例.这不仅仅是db中的行和列.例如,您可以编写托管对象子类,其中单个实例可以决定是否与另一个类的实例形成关系,除非达到该对象的特定内部状态.dbs中的记录没有那种逻辑或自治.

处理数据模型使用对象图的最佳方法是不仅忽略db而且忽略Core Data本身.相反,开始编写一个小型测试应用程序,您可以在其中手动编写所有数据模型类.它不必详细说明每个类的几个属性和某种类型的引用到另一个类.考虑如何管理将数据解析到每个类,将类和它们的数据链接在一起,然后将其取出.手动执行一次或两次,对象图的性质变得显而易见.

推荐阅读
我我檬檬我我186
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有