从父实体继承的属性问题

时间:2011-08-25 15:59:25

标签: core-data entity parent

我正在努力保持核心数据的旅行路线,这是我的数据模型。我有实体坐标保持纬度和经度为double,然后我创建可定位实体并在这两个实体之间建立关系。

Coordinate <-> Locatable

然后我有 POI 实体继承可定位这些 POI 代表我的路线。 最后我使用目的地实体继承 POI 作为我的目标点

Coordinate <-> Locatable
                   |
                   V
                  POI
                   |
                   V
               Destination

我的路线课程将积分与这些 POI 的一对多关系与目标列为目的地的一对一关系。 当我尝试使用MKPolylineView获取创建路径的 POI 集合时出现问题,当我调用route.points时,我也会获得带有这些POI的目标点。我知道核心数据为POI和Destination创建了大的Locatable,但是这种行为在逻辑上并不正确,我的目标点不应该显示点。这是正确的行为还是我遗漏了什么。

如果我错过了一些重要信息,请告诉我。非常复杂。

更新了更多说明

我有一对一的Route实体,目的地为目的地,一对多,POI为点(我用作旅行路径)

当我添加目的地

route.destination = destination_obj

它也出现在

route.points

这是不正确的,因为这两个属性有两个不同的目的(一个用于制作行进路径,另一个用于预先计算一些数据)。这种行为是否有任何文件或解释?

添加了小型数据模型和代码示例,以便每个人都可以重现此 制作3个实体

Family 
- int generation
- parents as to-may relation to Parent and family as inverse
- child as to-one relation to Child and family as inverse
Parent
- String name
- family to-one relation to Family
Child : Parent

这是我的代码

Family *fam;

NSEntityDescription *entity = [NSEntityDescription entityForName:@"Family" inManagedObjectContext:self.managedObjectContext];

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
[fetchRequest setEntity:entity];

NSArray *meters = [self.managedObjectContext executeFetchRequest:fetchRequest error:nil];

if ([meters count] > 0) {
    NSLog(@"found");
    fam = [meters lastObject];
    fam.generation = [NSNumber numberWithInt:[fam.generation intValue] + 1];
} else {
    NSLog(@"new");
    fam = [NSEntityDescription insertNewObjectForEntityForName:[entity name] inManagedObjectContext:self.managedObjectContext];
    fam.generation = [NSNumber numberWithInt:1];
    [self saveContext];
};
NSLog(@"There are %d paren", [fam.parents count]);
for (Parent *p in fam.parents) {
    NSLog(@"name : %@", p.name);
}
Child *child;
if (!fam.child) {
    child = [NSEntityDescription insertNewObjectForEntityForName:
             [[NSEntityDescription entityForName:@"Child" inManagedObjectContext:self.managedObjectContext] name]
                                          inManagedObjectContext:self.managedObjectContext];
    fam.child = child;
}
fam.child.name = [NSString stringWithFormat:@"child number %d", [fam.generation intValue]];
NSLog(@"There are %d parent after adding one child", [fam.parents count]);

Parent *parent = [NSEntityDescription insertNewObjectForEntityForName:
                  [[NSEntityDescription entityForName:@"Parent" inManagedObjectContext:self.managedObjectContext] name]
                                               inManagedObjectContext:self.managedObjectContext];
parent.name = [NSString stringWithFormat:@"parent number %d", [fam.generation intValue]];
[fam addParentsObject:parent];

NSLog(@"There are  %d parent after add parent", [fam.parents count]);
for (Parent *p in fam.parents) {
    NSLog(@"name : %@", p.name);
}

[self saveContext];

简而言之,我创建了一个家庭,并为这个家庭添加了一个孩子和一个父母,并打印出一些输出 在第一次运行中我得到了这个结果

2011-08-27 19:06:28.271 child[2015:207] new
2011-08-27 19:06:28.276 child[2015:207] There are 0 paren
2011-08-27 19:06:28.278 child[2015:207] There are 0 parent after adding one child
2011-08-27 19:06:28.279 child[2015:207] There are  1 parent after add parent
2011-08-27 19:06:28.280 child[2015:207] name : parent number 1

这是我的预期,然后我再次重新运行应用程序,这就是奇怪的事情发生了

2011-08-27 19:08:12.383 child[2035:207] found
2011-08-27 19:08:12.386 child[2035:207] There are 2 paren
2011-08-27 19:08:12.387 child[2035:207] name : parent number 1
2011-08-27 19:08:12.388 child[2035:207] name : child number 1
2011-08-27 19:08:12.389 child[2035:207] There are 2 parent after adding one child
2011-08-27 19:08:12.390 child[2035:207] There are  3 parent after add parent
2011-08-27 19:08:12.390 child[2035:207] name : parent number 1
2011-08-27 19:08:12.391 child[2035:207] name : parent number 2
2011-08-27 19:08:12.391 child[2035:207] name : child number 2

子实体包含在父属性中。这是我的一种误解,或者这是SDK上的一个错误?

1 个答案:

答案 0 :(得分:0)

我认为您的设置过于复杂。此外,您将关系设置为子类。但是关系和子类是完全不同的概念,我认为你可能会混淆它们。

这是我的建议:

拥有实体位置,属性纬度经度名称。将纬度经度设置为非可选,但名称为可选。现在您拥有了所需的所有基本构建块。

在您的代码中,您可以定义对象,例如类型为位置的* POI,*类型位置的目的地和*类型位置的* startPoint 。例如,您可以使用坐标计算最短路径。通过设置名称,您可以将任何位置设置为POI。如果您需要非POI的名称,请创建布尔属性 isPOI

现在,如果您想存储特定的旅行路线,您可以引入实体路线,其中包含名称日期等属性。以及与位置的一对多关系。请注意,您不能使用此方案以任何特定顺序放置多个位置。但是,您可以做的是包括两个与位置的一对一关系,一个名为 startLocation ,一个目标

如果您真的需要核心数据模型中更复杂的行程描述,您可能需要另一个实体。您可以将其称为 TravelPoints 路线的多对一关系,与位置的一对一关系以及< strong> arrivalDate , timeStayed departureDate sequentialNumber (表示路线中的顺序),等。

通过此设置,您应该可以远离您的项目。