0

だから、私は `NSManagedObject's User、Boundary、および Preset を持っています。プリセットは常に 1 人のユーザーに関連付けられています。ユーザーは多くのプリセットを持つことができます。各プリセットは境界を結ぶことができます。

基本的に、ユーザーは自分が持っている各境界に保存できるプリセットを持っています。

ユーザーはプリセットと対多の関係にあります。Boundary は Preset と多対多の関係にあります。

ユーザーがすでに境界に関連付けられているものを差し引いたプリセットのリストを生成しようとしています。

マジカルレコードを使用しています。

私の問題は、新しいユーザーと境界を作成するときです。これは機能します。

Boundary *boundary = [Boundary MR_createEntity];
boundary.name = @"test boundary";

UserDB *user = [UserDB MR_createEntity];
user.username = @"test User";

Preset *preset01 = [Preset MR_findFirstByAttribute:@"nameDisplay" withValue:@"C4"];
DLog(@"preset01.nameDisplay: %@", preset01.nameDisplay);
Preset *preset02 = [Preset MR_findFirstByAttribute:@"nameDisplay" withValue:@"B"];
DLog(@"preset02.nameDisplay: %@", preset02.nameDisplay);

[boundary setPresets:[NSSet setWithObject:preset01]];
[user setPresets:[NSSet setWithObjects:preset01, preset02, nil]];

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"user == %@ AND boundary != %@", user, boundary];

NSArray *presetsList = [Preset MR_findAllWithPredicate:predicate];

DLog(@"presetsList: %@", presetsList);

そこで、境界にpreset01を設定しました。ユーザーにpreset01とpreset02を設定しました。そのため、preset02 をユーザーに表示するリストが必要です (preset01 は既に境界に関連付けられているため、ユーザーはそれを再度追加することはできません)。

DEBUG | -[LoginViewController viewDidLoad] | preset01.nameDisplay: C4
DEBUG | -[LoginViewController viewDidLoad] | preset02.nameDisplay: B
DEBUG | -[LoginViewController viewDidLoad] | presetList: (
    "<SoilTestPointPreset: 0x1e06b8b0> (entity: Preset; id: 0x1e06bca0 <x-coredata://7476DB86-AF79-445C-B3AE-6C91088704A0/Preset/p98> ; data: {\n    attributes = \"<relationship fault: 0x1e074000 'attributes'>\";\n    boundary = nil;\n    gpsLocation = nil;\n    nameDisplay = B;\n    nameTitle = nil;\n    rgbColor = \"0x1e06b1d0 <x-coredata://7476DB86-AF79-445C-B3AE-6C91088704A0/RGBColor/p49>\";\n    testing = nil;\n    user = \"0x1e05ff60 <x-coredata:///UserDB/t59757D99-2FBF-4FBF-97AF-39582FC4B5503>\";\n})"

)

それが私が期待したことです。しかし、今 User オブジェクトと Boundary オブジェクトをフェッチすると、次のようになります。

Boundary *boundary = [Boundary MR_findFirstByAttribute:@"boundaryID" withValue:@3748];
DLog(@"boundary.name: %@", boundary.name);

UserDB *user = [UserDB MR_findFirstByAttribute:@"uid" withValue:@99];
DLog(@"user.username: %@", user.username);

私の配列は空です:

DEBUG | -[LoginViewController viewDidLoad] | boundary.name: 997677
DEBUG | -[LoginViewController viewDidLoad] | user.username: thatPerson
DEBUG | -[LoginViewController viewDidLoad] | preset01.nameDisplay: C4
DEBUG | -[LoginViewController viewDidLoad] | preset02.nameDisplay: B
DEBUG | -[LoginViewController viewDidLoad] | presetList: (
)

コア データからユーザーと境界をフェッチすると、結果が作成されるのではなく変更されるのはなぜですか?

アップデート:

追加した:

Boundary *boundary = [Boundary MR_findFirstByAttribute:@"boundaryID" withValue:@3748];
DLog(@"boundary.name: %@", boundary.name);
DLog(@"boundary.presets.count: %d", boundary.presets.count); // Added

UserDB *user = [UserDB MR_findFirstByAttribute:AVI_UID withValue:@99];
DLog(@"user.username: %@", user.username);
DLog(@"user.presets.count: %d", user.presets.count); // Added

DLog(@"AFTER | boundary.presets.count: %d", boundary.presets.count); //Added
DLog(@"AFTER | user.presets.count: %d", user.presets.count); //Added

[[NSManagedObjectContext MR_contextForCurrentThread] MR_saveToPersistentStoreAndWait]; //Added

User と Boundary には Presets 関係があります。

DEBUG | -[LoginViewController viewDidLoad] | boundary.name: 997677
DEBUG | -[LoginViewController viewDidLoad] | BEFORE | boundary.presets.count: 0
DEBUG | -[LoginViewController viewDidLoad] | user.username: iDealer
DEBUG | -[LoginViewController viewDidLoad] | BEFORE | user.presets.count: 0
DEBUG | -[LoginViewController viewDidLoad] | preset01.nameDisplay: C4
DEBUG | -[LoginViewController viewDidLoad] | preset02.nameDisplay: B
DEBUG | -[LoginViewController viewDidLoad] | AFTER | boundary.presets.count: 1
DEBUG | -[LoginViewController viewDidLoad] | AFTER | user.presets.count: 2
-[NSManagedObjectContext(MagicalSaves) MR_saveWithOptions:completion:](0x20831a80) → Saving <NSManagedObjectContext (0x20831a80): *** DEFAULT ***> on *** MAIN THREAD ***
-[NSManagedObjectContext(MagicalSaves) MR_saveWithOptions:completion:](0x20831a80) → Save Parents? 1
-[NSManagedObjectContext(MagicalSaves) MR_saveWithOptions:completion:](0x20831a80) → Save Synchronously? 1
-[NSManagedObjectContext(MagicalSaves) MR_saveWithOptions:completion:](0x1f59e860) → Saving <NSManagedObjectContext (0x1f59e860): *** BACKGROUND SAVING (ROOT) ***> on *** MAIN THREAD ***
-[NSManagedObjectContext(MagicalSaves) MR_saveWithOptions:completion:](0x1f59e860) → Save Parents? 0
-[NSManagedObjectContext(MagicalSaves) MR_saveWithOptions:completion:](0x1f59e860) → Save Synchronously? 1
__70-[NSManagedObjectContext(MagicalSaves) MR_saveWithOptions:completion:]_block_invoke21(0x1f59e860) → Finished saving: <NSManagedObjectContext (0x1f59e860): *** BACKGROUND SAVING (ROOT) ***> on *** MAIN THREAD ***
DEBUG | -[LoginViewController viewDidLoad] | presetList: (
)
4

2 に答える 2

0

いろいろ遊んだ後、問題を私が使用していたものに絞り込みましたNSPredicate

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"user == %@ AND boundary != %@", user, boundary];

NOTNONEクエリに問題があるようです。私が投稿した別の質問で答えを得ました: NSPredicate with a !=?

答えは のSUBQUERY代わりに a を使用することですNOT

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"user == %@ AND SUBQUERY(boundary, $p, $p == %@).@count == 0", user, boundary];

私が行っていたフェッチはうまくいっNSPredicateたと思います。悪いため 0 が返されますが、肯定的ではありません。

于 2013-11-01T15:46:47.773 に答える
0

ストアから取得する前に、データを保存する必要があります。MR_saveToPersistentStoreAndWait またはその他のバリアントを使用します。フェッチは常に「ディスク」になるため、最初に保存することでこれを修正できます。

于 2013-10-31T15:30:38.850 に答える