objective-c – 对核心数据数据结果进行分组?

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

基本上我想显示用户名分组的最新项目.在sql语句中这很容易,但是我无法在核心数据中使用它.我想,因为我正在开始一个新的应用程序,我不妨尝试使核心数据工作,但这部分是一个主要的障碍.

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

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

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

解决方法

首先,不要将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];

编辑:

…do I just pass each post block of
data (content,creationDate) to the
post entity? Do I also pass the
username to the post entity? How does
the user entity kNow when to create a
new user?

让我伪代码吧.您有两个定义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中的记录没有那种逻辑或自治.

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

相关文章

我正在用TitaniumDeveloper编写一个应用程序,它允许我使用Ja...
我的问题是当我尝试从UIWebView中调用我的AngularJS应用程序...
我想获取在我的Mac上运行的所有前台应用程序的应用程序图标....
我是一名PHP开发人员,我使用MVC模式和面向对象的代码.我真的...
OSX中的SetTimer在Windows中是否有任何等效功能?我正在使用...
我不确定引擎盖下到底发生了什么,但这是我的设置,示例代码和...