मुझे कोरडाटा में ऑब्जेक्ट आईडी से निपटने में समस्या हो रही है। मैं सुविधा के लिए जादुई रिकार्ड का उपयोग कर रहा हूं और इसमें 3 संदर्भ हैं: एक निजी कतार कार्य संदर्भ, यूआई के लिए मुख्य कतार संदर्भ और कामकाजी संदर्भ के लिए अभिभावक, और एक निजी कतार बचत संदर्भ जो मुख्य संदर्भ का अभिभावक है।स्थायी NSManagedObjectID इतना स्थायी नहीं है?
मेरा लक्ष्य कार्यस्थल में एक ऑब्जेक्ट बनाना है, लगातार स्टोर में सहेजना है, इसके ऑब्जेक्ट आईडी को NSUserDefaults पर सहेजना है, और उसके बाद ऑब्जेक्ट आईडी का उपयोग करके उस एमओ को खींचने में सक्षम होना चाहिए। हालांकि, मुझे जो मिल रहा है वह यह है कि ऑब्जेक्ट की स्थायी आईडी को सहेजने के बाद बदल रहा है।
नीचे कंसोल आउटपुट में आप देख सकते हैं कि मैं स्थायी आईडी का अनुरोध करने के बाद मूल्य वापस प्राप्त करता हूं "F474F6EE-A225-456B-92EF-AB1407336F15/CDBaseAccount/p1" लेकिन बाद में जब मैं सीडी में सभी ऑब्जेक्ट्स सूचीबद्ध करता हूं एकमात्र वस्तु में आईडी "F474F6EE-A225-456B-92EF-AB1407336F15/CDBaseAccount/p2" है। पी 1 बनाम पी 2, क्या हुआ?
कोड:
NSManagedObjectContext *c = [NSManagedObjectContext MR_contextThatPushesChangesToDefaultContext];
[c performBlockAndWait:^{
NSArray *all = [CDBaseAccount MR_findAllInContext:c];
NSLog(@"count: %d", all.count);
NSLog(@"all accounts = %@", all);
CDBaseAccount *a = [CDBaseAccount MR_createInContext:c];
a.accountName = @"foo";
[c MR_saveNestedContexts];
NSLog(@"temp a.objectID = %@", a.objectID);
NSError *error;
if (![c obtainPermanentIDsForObjects:@[a] error:&error]) {
NSLog(@"perm id error: %@", error);
return;
}
NSLog(@"perm a.objectID = %@", a.objectID);
NSURL *u = a.objectID.URIRepresentation;
dispatch_async(dispatch_get_main_queue(), ^{
NSManagedObjectContext *d = [NSManagedObjectContext MR_defaultContext];
NSArray *all = [CDBaseAccount MR_findAllInContext:d];
NSLog(@"count: %d", all.count);
NSLog(@"all accounts = %@", all);
NSManagedObjectID *i = [d.persistentStoreCoordinator managedObjectIDForURIRepresentation:u];
NSError *objWithIdError = nil;
NSManagedObject *o = [d existingObjectWithID:i error:&objWithIdError];
if (objWithIdError != nil) {
NSLog(@"existing object error: %@", objWithIdError);
return;
}
NSLog(@"o = %@", o);
NSLog(@"o.objectID = %@", o.objectID);
});
}];
कंसोल आउटपुट:
> +[NSManagedObjectContext(MagicalRecord) MR_contextWithStoreCoordinator:](0xa7c9b0) -> Created <NSManagedObjectContext: 0x83522a0>: Context *** MAIN THREAD ***
> count: 0
> all accounts = (
>)
> -[NSManagedObjectContext(MagicalSaves) MR_saveWithErrorCallback:](0x8353de0) -> Saving <NSManagedObjectContext: 0x8353de0>: Context *** MAIN THREAD ***
> -[NSManagedObjectContext(MagicalSaves) MR_saveWithErrorCallback:](0x8195450) -> Saving <NSManagedObjectContext: 0x8195450>: *** DEFAULT *** Context *** MAIN THREAD ***
> -[NSManagedObjectContext(MagicalSaves) MR_saveWithErrorCallback:](0x83522a0) -> Saving <NSManagedObjectContext: 0x83522a0>: *** BACKGROUND SAVE *** Context *** MAIN THREAD ***
> temp a.objectID = 0x8187ee0 <x-coredata:///CDBaseAccount/tF392AC6A-3539-4F39-AC53-35F9E5B3C9322>
> perm a.objectID = 0x8355800 <x-coredata://F474F6EE-A225-456B-92EF-AB1407336F15/CDBaseAccount/p2>
> count: 1
> all accounts = (
"<CDBaseAccount: 0x844ca60> (entity: CDBaseAccount; id: 0x844a4c0 <x-coredata://F474F6EE-A225-456B-92EF-AB1407336F15/CDBaseAccount/p1> ; data: <fault>)"
)
> existing object error: Error Domain=NSCocoaErrorDomain Code=133000 "The operation couldn’t be completed. (Cocoa error 133000.)" UserInfo=0x864d8c0 {NSAffectedObjectsErrorKey=(
"<CDBaseAccount: 0x864b8c0> (entity: CDBaseAccount; id: 0x86405c0 <x-coredata://F474F6EE-A225-456B-92EF-AB1407336F15/CDBaseAccount/p2> ; data: <fault>)"
)}
धन्यवाद, इतना मार्कस! सभी दस्तावेजों में 'स्थायी' शब्द शब्द वास्तव में धोखा दे रहा है। मुझे उम्मीद है कि आप अपनी सीडी बुक का एक नया संस्करण डाल देंगे, क्योंकि पुराना ओओपी है। 'GloballyUniqueString' – brianpartridge
+1 यदि आप' NSManagedObjectID' को लॉन्च करते हैं, तो ऐप लॉन्च किए गए 'समकालीन आईडी' में 'NO'' लौटाता है, तो आप निश्चित रूप से कुछ स्केची कर रहे हैं। यह मेरे लिए बहुत अच्छा काम करता है और लंबे समय से ऐसा करता है। –
के लिए –