Проблема со свойством, унаследованным от родительского объекта - PullRequest
0 голосов
/ 25 августа 2011

Я пытаюсь сохранить маршрут путешествия в основных данных, и вот моя модель данных.У меня есть сущность Координата , поддерживающая двойную широту и долготу, затем я создал Локализуемую сущность и установил связь между этими двумя сущностями.

Coordinate <-> Locatable

тогда у меня есть POI объект, унаследованный Locatable эти POI , представляющие мой маршрут.наконец, у меня есть пункт назначения унаследованная сущность POI , использующая в качестве пункта назначения

Coordinate <-> Locatable
                   |
                   V
                  POI
                   |
                   V
               Destination

Мой Маршрут класс имеет точки как один ко многимсвязь с этими POI и пункт назначения как один к одному с Пункт назначения .Проблема возникает, когда я пытаюсь получить свою коллекцию POI для создания маршрута с помощью MKPolylineView, когда я вызываю route.points, я также получаю точку назначения с этими POI.Я знаю, что базовые данные создают большие Locatable как для 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 голосов
/ 25 августа 2011

Я думаю, что ваша установка слишком сложна.Кроме того, вы устанавливаете свои отношения немного как подклассы .Но отношения и подклассы - это совершенно разные понятия, и я думаю, что вы можете смешивать их.

Вот что я предлагаю:

Есть сущность Местоположение ,с атрибутами широта , долгота и имя .Установите широта и долгота как необязательные, но name как необязательные.Теперь у вас есть все основные строительные блоки, которые вам нужны.

В своем коде вы можете определить такие объекты, как * POI типа Местоположение , * Назначение типа Местоположение и* startPoint типа Местоположение .Вы можете использовать координаты для расчета кратчайшего маршрута, например.Установив имя , вы можете превратить любое Местоположение в POI.Если вам нужны имена для не POI, создайте логический атрибут isPOI .

Теперь, если вы хотите сохранить определенные маршруты путешествий, вы можете ввести сущность Маршрут с такими атрибутами, как имя , дата и т. Д.и отношение один ко многим с Местоположение .Обратите внимание, что по этой схеме вы не можете поместить множество Locations в какой-либо конкретный порядок.Однако вы можете включить еще два взаимно-однозначных отношения с Location , одно из которых называется startLocation и одно destination .

Если вам действительно нужно более сложное описание маршрутов в вашей базовой модели данных, вам, вероятно, нужен другой объект.Вы могли бы назвать это TravelPoints с отношением «многие к одному» с Маршрутом , отношением «один к одному» с Местоположение и такими атрибутами, как прибытие-дата, timeStayed или flightDate , sequentialNumber (для указания порядка в Route ) и т. Д.

С этой настройкой вы сможете далеко продвинуться в своем проекте.

...