1

ユーザーが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つが正確に何をしているのか誤解しています。誰かが私がここで間違っていることを見て、それを修正する方法を提案しますか?

4

1 に答える 1

1

ちなみに、CoreDataオブジェクトを単純にフェッチして、managedObjectContextに再挿入することはできません。コピーが必要な場合は、新しいmanagedObjectを作成し、デフォルト値を設定します。

ObjectModelでは、デフォルト値をエンティティに設定することもできます...これは私が推測するさらに良い方法です。次に、新しいmanagedObjectを作成し、変更が必要なものを変更する必要があります。コピーは必要ありません。(デフォルトのモデルが変更されない限り。)

managedObjectを作成する方法は私には良さそうです

MyData *defaultData = [defaultArr objectAtIndex:0];
currentData = [NSEntityDescription insertNewObjectForEntityForName:table inManagedObjectContext:context];

ただし、設定currentData = defaultData;すると、前のオブジェクトが上書きされます。やったほうがいい:

currentData.var1 = defaultData.var1;
currentData.var2 = defaultData.var2;
...
于 2012-11-06T14:40:37.423 に答える