1

私は Core Data を初めて使用し、多対多の関係でいくつかの問題に直面しています。

これが私の構造です

ダイアグラム

この構造により、1 つのプロファイルに複数のアイテムを含めることができ、1 つのアイテムを複数のプロファイルに含めることができます。ストアのようなものです。

両方の関係が逆

そのため、プロファイルに新しいアイテムを追加すると、新しいアイテムがテーブルアイテムに複製されました。

ITENS LIST
========== 
ITEM9
ITEM50
==========

プロフィールに新しいアイテムを追加した後

ITENS LIST
==========
ITEM9
ITEM50
ITEM9
==========

プロフィールをリストすると、「itens」が正しいのは 1 つの新しいアイテムだけです。

PROFILE 
========== 
ITEM9 
==========

この操作の私のコードは次のとおりです。

MocManager* moc = [MocManager sharedMocManager];
NSArray* products = [moc listData:@"products"];
NSMutableString* desc = [NSMutableString string];

if( products != nil ) {
    Item* itemToBuy = products[0]; // This is just a test. get the first
    Item* newItem = [Item initItem];

    NSEntityDescription *entity = [itemToBuy entity];
    for (NSString *attributeName in [entity attributesByName]) {
        [newItem setValue:[itemToBuy valueForKey:attributeName] forKey:attributeName];
    }
    for (NSString *relationshipName in [entity relationshipsByName]) {
        [newItem setValue:[itemToBuy valueForKey:relationshipName] forKey:relationshipName];
    }


    [desc appendString:newItem.identifier];

    [profile addItensObject:newItem];

    [moc saveData];
}

私の質問はです。

  • 重複を防ぐことはできますか?

  • これを防ぐことができない場合。プロファイルが関連付けられていない Itens のみを一覧表示するにはどうすればよいですか?

Tks

ブルーノ

4

1 に答える 1

1

重複をチェックする私の方法は次のとおりです。

ENTITY* obj = nil;
NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"ENTITY"];
request.predicate = [NSPredicate predicateWithFormat:@"ENTITY.ID = %@", NEW_ELEMENT_ID];

NSError *error = nil;
NSArray *matches = [context executeFetchRequest:request error:&error];

if (!matches || ([matches count] > 1)) {
    //NSLog(@"Error, YOU HAVE MORE THAN ONE OBJECT WITH SAME ID");
} else if ([matches count] == 0) {
    //NSLog(@"NEW, OBJ NOT FOUND WITH THAT ID");
    obj = [NSEntityDescription insertNewObjectForEntityForName:@"ENTITY" inManagedObjectContext:YOUR_CONTEXT];
} else {
    obj = [matches lastObject]; //only one obj found... update this one
}

return obj;
于 2014-01-29T17:39:56.290 に答える