0

ブール値プロパティが削除された NSManagedObject サブクラスが与えられた場合 (これは、両方のアプローチが機能しないため、以下のコードを使用して 2 つの異なる方法で示されます):

【コード一覧1】

@interface MyManagedObject : NSManagedObject

@property (nonatomic, retain) NSNumber *deleted;
// Or @property (nonatomic) BOOL deleted;

@end

次のように作成され、Core Data に挿入されます。

【コードリスト2】

metadata.deleted = [NSNumber numberWithBool:NO];
// metadata.deleted = NO;

そして取ってきた

【コードリスト3】

// setup entity description
NSEntityDescription* entityDescription = [self entityDescription];

// setup the sorter
NSSortDescriptor* sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"createdAt" ascending:YES];
NSSortDescriptor* sortDescriptorSection = [[NSSortDescriptor alloc] initWithKey:@"myManagedObject.category.title" ascending:YES];

// Build request
NSFetchRequest* request = [[NSFetchRequest alloc] init];
[request setEntity:entityDescription];
[request setSortDescriptors:[NSArray arrayWithObjects:sortDescriptorSection, sortDescriptor, nil]];
[request setPredicate:[NSPredicate predicateWithFormat:@"deleted == %@", [NSNumber numberWithBool:NO]]];

// Fetch request
NSArray* items = [[self managedObjectContext] executeFetchRequest:request error:nil];

期待どおり、items 配列内の 1 つのアイテムを返します。問題は、deleted が変更されたときです。

【コードリスト4】

MyManagedObject* myManagedObject; // Assume initialized
myManagedObject.deleted = [NSNumber numberWithBool:YES];
// myManagedObject.deleted = YES;

// Printing description of myManagedObject in debugger shows deleted = 0 at this point

[myManagedObject.managedObjectContext save:nil];

// Printing description of myManagedObject in debugger still shows deleted = 0 at this point

BOOL testValue = myManagedObject.deleted;
if (testValue) {
    NSLog(@"value updated"); // This line is executed
}

コード リスト 3 を再実行すると、データベースを監視している NSFetchResultsController が更新を開始した後でも、items 配列に 1 つのアイテムが生成されます。アプリケーションを終了して再起動した場合、コード リスト 3 を再実行すると、項目 NSArray に項目が生成されません。

4

3 に答える 3

2

Core Data プロパティを「deleted」と呼ぶと、 のisDeletedプロパティと競合しますNSManagedObject

コア データの比較NSPredicate "deleted == NO" は、同様の問題と一部の実験で期待どおりに機能しません。

ところで。プロパティ「updated」を呼び出すことも問題を引き起こします。compare Magical Record では日付を比較する述語を使用できません

于 2013-08-07T16:36:44.250 に答える
0

NSManagedObject サブクラスのプロパティ名として delete を使用しないでください。

また、deleted は BOOL ではなく NSNumber です。したがって、使用している場合:

BOOL testValue = myManagedObject.deleted;
if (testValue) {
    NSLog(@"value updated"); // This line is executed
}

myManagedObject の削除されたプロパティが nil かどうかをテストしています。値がある場合 ([NSNumber numberWithBool:YES] であっても)、testValue は true になります。

関係のないことですが、NSManagedObjectContext の save メソッドを呼び出すときに、エラーをキャプチャしてログに記録することもお勧めします。

于 2013-08-07T16:31:43.037 に答える