1

私のアプリケーションには、多くの停留所がある旅行があります。これは、.xcdatamodeld ファイルで指定されています。私は好きな方法で旅行を操作することができ、それらはすべて問題なく機能します。ただし、各旅行に多くの停車地を追加すると問題が発生します。持続しないようです。これが次のコードです。このコードは旅行の detailViewController 内にあるため、特定の旅行が既にクリックされています。

Trip * trip = [self retrieveObjectWithID:_passedObjectId];


    StopOff *newStop = [NSEntityDescription insertNewObjectForEntityForName:@"StopOff" inManagedObjectContext:managedObjectContext];

    [newStop setValue:stopName forKey:@"stopName"];
    [newStop setValue:stopCity forKey:@"stopCity"];
    [newStop setValue:stopDate forKey:@"stopDate"];
    [newStop setValue:stopAddress forKey:@"stopAddress"];
    [newStop setValue:stopState forKey:@"stopState"];
    [newStop setValue:stopTime forKey:@"stopTime"];

    newStop.trip = trip;
    [trip addStopObject:newStop];

    NSLog(@" stop count %i", [trip.stop count]);

これを実行するために初めてボタンを押したときに、コンソールが吐き出すのは次のとおりです。CoreData: annotation: to-many relationship fault "stop" for objectID 0x8bb2810 <x-coredata://4CE70783-4729-46E0-B18B-8E325D1020CC/Trip/p20> fulfilled from database. Got 0 rows 2013-11-24 21:19:43.417 Tracker[30633:70b] stop count 1

ボタンを押し続けると、停止回数が増えます。アプリを再起動すると、停止カウントが下がって最初からやり直すので、持続していないようです。

私の質問は、旅行に対応する多くの停車地を正確に挿入するにはどうすればよいか、また、それらが挿入されて永続化されたら、その旅行に対応するすべての停車地を取得するにはどうすればよいかということです。

これは、各旅行をうまく取得するためのコードです。をmanagedObjectContext使用して親View Controllerで処理されNSFetchedResultsControllerます。さらに情報が必要な場合はお知らせください

- (Trip*)retrieveObjectWithID:(NSManagedObjectID*)theID
{
    NSError *error = nil;
    Trip *theObject = (Trip*)[self.managedObjectContext existingObjectWithID:theID error:&error];
    if (error)
        NSLog (@"Error retrieving object with ID %@: %@", theID, error);
    return theObject;
}
4

2 に答える 2

3

StopOff変更 (新しいオブジェクト)を適用した後、コンテキストを保存していません。

を追加した後StopOff、呼び出し[managedObjectContext save:&error]を行うと、新しいオブジェクトがストアに永続化されます。

CoreData は自動的に保存されず、save:呼び出されないと、コンテキストに加えられた一時的な変更がすべて失われます。

[trip addStopObject:newStop];また、逆の関係の一部として CoreData がそれを処理しているため、必要はありません。

于 2013-11-25T03:57:39.850 に答える
1

newStop.trip = trip対多関係のセットアップがあります。との両方は必要ありません[trip addStopObject:newStop]。これがあなたが警告を受けている理由だと思います。

ある時点で、次のように呼び出したいと思うでしょう:

NSError *error = nil;
[managedObjectContext save:&error];
于 2013-11-25T03:57:46.853 に答える