我正在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];
编辑:
...我只是将每个后期数据块(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本身.相反,开始编写一个小型测试应用程序,您可以在其中手动编写所有数据模型类.它不必详细说明每个类的几个属性和某种类型的引用到另一个类.考虑如何管理将数据解析到每个类,将类和它们的数据链接在一起,然后将其取出.手动执行一次或两次,对象图的性质变得显而易见.