البيانات الأساسية: إعادة الإعداد إلى علاقة كثيرة

StackOverflow https://stackoverflow.com/questions/1696181

سؤال

لقد قمت بإنشاء نموذج يمكنك رؤيته هناك:http://i.imagehost.org/0836/2009-11-08_14_37_41.png.

أريد تخزين معلومات حول الفئات الصوتية وبعض الأصوات عينة لكل فئة. الفئة لديها اسم (nsstring) ومصعد الصوت (NSSTSON NSDATA، والتي تمثل الأصوات).

هذه هي المشكلة: على سبيل المثال، لدي بعض الفئة التي تحتوي على العديد من الأصوات المرتبطة بها. افترض عدد الأصوات 3. لذلك إذا قمت بذلك

NSLog(@"description: \n%@", category);

سأرى معلومات حول الاسم وهذه الأصوات الثلاثة. شيء من هذا القبيل:

Name = "Cat1";
SoundsRelation =     (
    0x174e90 <x-coredata://2E783972-3772-4CCA-9676-1D5F732D1FD2/Sounds/p9>,
    0x174ea0 <x-coredata://2E783972-3772-4CCA-9676-1D5F732D1FD2/Sounds/p10>,
    0x174eb0 <x-coredata://2E783972-3772-4CCA-9676-1D5F732D1FD2/Sounds/p11>
);

ثم أريد مسح هذه الفئة من الأصوات. أريد تعيين SoundSrelation إلى NIL.

أنا افعل:

[category setValue:nil forKeyPath:@"SoundsRelation"];

الآن إذا فعلت

NSLog(@"description: \n%@", category);

سيكون لدي شيء مثل:

Name = "Cat1";
SoundsRelation =     (
);

حسنا، يبدو أن CAT1 ليس لديه أصوات مرتبطة به.

الآن أنا أحفظ بلدي managedbjectxontext باستخدام [managedObjectContext save:] طريقة و إنهاء التطبيق.

عندما أعدل عن تطبيقي وفعل

NSLog(@"description: \n%@", category);

سأمتلك:

Name = "Cat1";
SoundsRelation =     (
    0x174e90 <x-coredata://2E783972-3772-4CCA-9676-1D5F732D1FD2/Sounds/p9>,
    0x174ea0 <x-coredata://2E783972-3772-4CCA-9676-1D5F732D1FD2/Sounds/p10>,
    0x174eb0 <x-coredata://2E783972-3772-4CCA-9676-1D5F732D1FD2/Sounds/p11>
);

أرى أصواتي السابقة!

الآن، إذا تجاوزت SoundSrelation مع بعض Nsset الأخرى التي تحتوي على 5 أصوات أخرى: [فئة SetValue: Otheretwithfivesounds forkeypath: @ "SoundSrelation"]؛

وفعل: NSLOG (@ "الوصف: n٪ @"، فئة)؛

أرى: الاسم = "CAT1"؛ SoundSrelation = (0x174e90، 0x174ef0، 0x174ab0، 0x1743b0، 0x1744b0)؛

الآن إذا قمت بالحفظ والإقلاع عن التدخين و Relaunch، بعد nslogging فئة بلدي أرى:

Name = "Cat1";
SoundsRelation =     (
    0x174e90 <x-coredata://2E783972-3772-4CCA-9676-1D5F732D1FD2/Sounds/p9>,
    0x174ea0 <x-coredata://2E783972-3772-4CCA-9676-1D5F732D1FD2/Sounds/p10>,
    0x174eb0 <x-coredata://2E783972-3772-4CCA-9676-1D5F732D1FD2/Sounds/p11>,
    0x174e90 <x-coredata://2E783972-3772-4CCA-9676-1D5F732D1FD2/Sounds/p12>,
    0x174ef0 <x-coredata://2E783972-3772-4CCA-9676-1D5F732D1FD2/Sounds/p13>,
    0x174ab0 <x-coredata://2E783972-3772-4CCA-9676-1D5F732D1FD2/Sounds/p14>,
    0x1743b0 <x-coredata://2E783972-3772-4CCA-9676-1D5F732D1FD2/Sounds/p15>,
    0x1744b0 <x-coredata://2E783972-3772-4CCA-9676-1D5F732D1FD2/Sounds/p16>
);

أرى الأصوات القديمة + أصوات جديدة! لماذا ا؟ ماذا علي أن أفعل لتجاوز العلاقات القديمة تماما إلى علاقات جديدة؟

هل كانت مفيدة؟

المحلول

هذا الخط:

[category setValue:nil forKeyPath:@"SoundsRelation"];

لا يزيل الأصوات من managedobjectcontext. إنه يكسر الربط بين كائن الفئة وكائن الأصوات. لا يحب Coredata ذلك لأنه يخلق كائنات تيتيمة في المتجر المستمر. عند إعادة التشغيل، يفترض Coredata أن الخطأ يتيم الكائنات ويعديه إلى والدهم الأصلي.

يجب عليك استخدام الأمر "managedbjectedbjectext deleteobject" الصريح: `أمر لإزالة الأصوات وتحتاج إلى التأكد من أن لديك قاعدة حذف المناسبة لتعيين العلاقة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top