Momento和1到多个联合:CoreData方法,设计考虑因素和意见

时间:2012-05-11 17:58:21

标签: ios core-data uitableview

使用Indexcard隐喻的给定和基于coredata的应用程序。每个索引卡可以选择与许多其他实体/表具有一对多的关系;即我将使用Momento的'Moment'作为我的Indexcard对象的代理,以及Momento对这些其他对象/表的标签,位置等的辅助。

显示这些外表关系是否存在于整个应用程序中最重要的tableView上的“最快”方法是什么?

布局细胞部分的最佳方法是什么,显示关系是否存在以及每种关系类型的数量?

再次,使用Momento作为设计模式。在Flickr上使用link to a screenshot(因为stackOverflow不允许我发布图片,因为我是菜鸟。)

也许我的前RDBMS内容正在污染我的想法,但是他们没有做mongo-join来将值放到合适的位置吗? [标签,事件,人物,地点。必须有一种更优雅的方式,我只是没有看到。

我在右侧布置单元格的想法是可能使用一些布尔值,如果YES显示图标和计数,但对于每个单元格来说这似乎相当昂贵。

我确信这个布局问题的答案将由问题第一部分采取的方法驱动。出于维护原因,我似乎不希望在'main / moment'IndexCard对象中存储辅助关系。

提前感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

如果设置索引卡与标记(或其他)的一对多关系,则获取的索引卡对象应具有NSSet标记作为属性。对于其他人来说也是如此,你应该能够得到集合的计数并显示在每个适当的图标旁边。

..除非我误解你的问题。

编辑:要回答第二部分,你应该确实有一个条件的cellForRowAtIndex路径,它检查每个集合的数量,并且只显示它带有图标(可能有0然后,通常很好),或检查是否为0并隐藏图像,如果它是你所说的。我不认为任何一种解决方案都会降低您的应用程序速度,因为数据在呈现单元格时已经被提取了,但是您只是通过计数而不检查它是否为0的解决方案通常会很快整体

编辑以提供一些示例代码:  您的核心数据模型将具有IndexCard实体,然后是每种类型的可能相关对象的实体。

<强> 1)模型

IndexCard - 与其他每个实体都有一对多的关系

标签

位置

2)创建此模型和相应的Object类之后,最终会得到一个IndexCard类,其标题中包含以下内容

@property (nonatomic, strong) NSSet *tags
@property (nonatomic, strong) NSSet *locations
@property (nonatomic, strong) NSSet *people

当然还有以下内容

@dynamic tags
@dynamic locations
@dynamic people

3)现在我们已经建立了这个核心数据模型,我们可以执行nsfetchrequest(当然在使用tableview时,你应该使用nsfetchedresultscontroller,因为它会在你滚动浏览时动态获取它需要的IndexCards表)。此代码假定我们在其范围内有一个可用的NSManagedObjectContext(理想情况下从AppDelegate传入并设置为ivar)并且我们的IndexCard对象具有我们可以搜索的某种键/ id属性,让我们称之为“数字”< / p>

NSNumber *numberWeWant = [NSNumber numberWithInt:1];

NSFetchRequest *request = [[NSFetchRequest alloc] init];
request.entity = [NSEntityDescription entityForName:@"IndexCard" inManagedObjectContext:ourContext];
request.predicate = [NSPredicate predicateWithFormat:@"number == %@", numberWeWant];

NSError *error = nil;

NSArray *results = [context executeFetchRequest:request error:&error];

//didn't bother error checking in case no IndexCard matches
IndexCard *ourCard = [results lastObject];

//you can now use these to display in the cell or hide the appropriate icons if they = 0
int numTags = ourCard.tags.count;
int numLocations = ourCard.locations.count;
int numPeople = ourCard.people.count;

//just a sample of how we would access the individual related objects
for(Tag *tag in ourCard.tags)
{
    //do whatever you want with each tag here
}

同样,这段代码只是为了获取一个IndexCard。在实际的表中,您将在加载包含它的视图时初始化nsfetchedresultscontroller,然后在cellForRowAtIndexPath中匹配IndexPath.row的位置访问IndexCard。

这也假设IndexCard可以与有限数量的对象相关联。如果类型可以随意改变和增加,则需要修改此方法。

希望这有帮助。