ユーザーがUIViewControllerの1つでさまざまなUIControlに入力したものに関連する属性と、各レコードの一意の識別子である1つの属性(「recordKey」)を持つCoreDataエンティティ(「MyData」と呼ばれる)があります。ユーザーがページを開いたときに、そのrecordKeyのレコードが既にあるかどうかを確認したいと思います。その場合は、それをロードし、そのレコードの内容に基づいてすべてのコントロールを設定します。そうでない場合は、「デフォルト」レコードに基づいてすべてのコントロールを設定し、このセッションの新しいレコードを作成してから、ユーザーが終了したときに新しいセッションを保存しますが、「デフォルト」レコードは変更しません。これまでの私のコード(in viewDidLoad
)は次のとおりです。
MyAppDelegate *app = [[UIApplication sharedApplication] delegate];
NSString *table = @"MyData";
NSError *error;
NSManagedObjectContext *context = [app managedObjectContext];
NSEntityDescription *entity = [NSEntityDescription entityForName:table inManagedObjectContext:context];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"recordKey LIKE %@", self.recordKey];
NSFetchRequest *request = [[NSFetchRequest alloc] init];
[request setPredicate:predicate];
[request setEntity:entity];
NSArray *arr = [context executeFetchRequest:request error:&error];
if (arr.count == 0)
{
// No entries exist for this recordKey, so use default values
predicate = [NSPredicate predicateWithFormat:@"recordKey LIKE %@", @"DEFAULT"];
[request setPredicate:predicate];
NSArray *defaultArr = [context executeFetchRequest:request error:&error];
if (defaultArr.count == 1)
{
MyData *defaultData = [defaultArr objectAtIndex:0]; //create placeholder for for default data
currentData = [NSEntityDescription insertNewObjectForEntityForName:table inManagedObjectContext:context]; //create a new row to correspond to this session
currentData = defaultData; //preload with default values
currentData.recordKey = self.recordKey; //set record key for this session to it's unique identifier
}
else
{
NSLog(@"Error - DEFAULT record not found in table '%@', or multiple DEFAULT records found, in viewDidLoad on RunwayAnalysisController.m",table);
}
}
else if (arr.count == 1)
{
// Record found for this recordKey, so set it as the current MyData object
currentData = [arr objectAtIndex:0];
}
それから私がコントローラーを離れるとき、私はただ
if (![context save:&error])
{
NSLog(@"Error writing entry to %@ table in saveClick on RunwayAnalysisController.m",table);
}
これを実行すると、このセッション中にユーザーが行った変更によって、デフォルトのレコードが上書きされます。問題は、currentData = [NSEntityDescription insertNewObjectForEntityForName:table inManagedObjectContext:context]; currentData = defaultData;
私が望んでいることを実行していないことだと思います。新しいエントリを作成し、そのエントリにデフォルトレコードの情報をロードしてから、デフォルトレコードとの関係を切断し、ユーザーとして入力する必要があります。ページ上のコントロールと対話します。私はおそらく、これら2つの行の1つが正確に何をしているのか誤解しています。誰かが私がここで間違っていることを見て、それを修正する方法を提案しますか?