علاقات البيانات الأساسية تسبب حفظ الخطأ بعد حذفه

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

  •  13-09-2019
  •  | 
  •  

سؤال

هذا السؤال ربما لقطة طويلة. لا يمكنني معرفة الأخطاء التي أحصل عليها في مشروع البيانات الأساسية عندما أحفظ بعد حذف كيان.

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

للبريد:

2009-09-22 20:17:37.771 itryiton[29027:20b] Operation could not be completed. (Cocoa error 1600.)
2009-09-22 20:17:37.773 itryiton[29027:20b]   {
    NSLocalizedDescription = "Operation could not be completed. (Cocoa error 1600.)";
    NSValidationErrorKey = outfitArticleViewProperties;
    NSValidationErrorObject = <Article: 0x12aa3c0> (entity: Article; id: 0x12b49a0 <x-coredata://7046DA47-FCE1-4E21-8D7B-E532AAC0CC46/Article/p1> ; data: {
    articleID = 2009-09-22 19:05:19 -0400;
    articleImage = 0x12b4de0 <x-coredata://7046DA47-FCE1-4E21-8D7B-E532AAC0CC46/ArticleImage/p1>;
    articleType = nil;
    attributeTitles = "(...not nil..)";
    color = nil;
    comment = nil;
    dateCreated = 2009-09-22 19:05:19 -0400;
    designer = nil;
    imageView = "(...not nil..)";
    location = "(...not nil..)";
    outfitArticleViewProperties =     (
        0x12b50f0 <x-coredata://7046DA47-FCE1-4E21-8D7B-E532AAC0CC46/OutfitArticleViewProperties/p1>
    );
    ownesOrWants = 0;
    pattern = nil;
    price = nil;
    retailer = nil;
    thumbnail = "(...not nil..)";
    washRequirements = nil;
    wearableSeasons = nil;
});
    NSValidationErrorValue =     {(
        <OutfitArticleViewProperties: 0x1215340> (entity: OutfitArticleViewProperties; id: 0x12b50f0 <x-coredata://7046DA47-FCE1-4E21-8D7B-E532AAC0CC46/OutfitArticleViewProperties/p1> ; data: {
    article = 0x12b49a0 <x-coredata://7046DA47-FCE1-4E21-8D7B-E532AAC0CC46/Article/p1>;
    articleViewPropertiesID = nil;
    outfit = nil;
    touch = nil;
    view = "(...not nil..)";
})
    )};
}

وإذا قمت بحذف مقال أحصل عليه:

2009-09-22 18:58:38.591 itryiton[28655:20b] Operation could not be completed. (Cocoa error 1560.)
2009-09-22 18:58:38.593 itryiton[28655:20b]   DetailedError: {
    NSLocalizedDescription = "Operation could not be completed. (Cocoa error 1600.)";
    NSValidationErrorKey = articleImage;
    NSValidationErrorObject = <Article: 0x12aa340> (entity: Article; id: 0x12b3f10 <x-coredata://05340FA6-B5DC-4646-A5B4-745C828C73C3/Article/p1> ; data: {
    articleID = 2009-09-22 18:58:26 -0400;
    articleImage = 0x12b4d00 <x-coredata://05340FA6-B5DC-4646-A5B4-745C828C73C3/ArticleImage/p1>;
    articleType = nil;
    attributeTitles = "(...not nil..)";
    color = nil;
    comment = nil;
    dateCreated = 2009-09-22 18:58:26 -0400;
    designer = nil;
    imageView = "(...not nil..)";
    location = "(...not nil..)";
    outfitArticleViewProperties =     (
        0x12b5010 <x-coredata://05340FA6-B5DC-4646-A5B4-745C828C73C3/OutfitArticleViewProperties/p1>
    );
    ownesOrWants = 0;
    pattern = nil;
    price = nil;
    retailer = nil;
    thumbnail = "(...not nil..)";
    washRequirements = nil;
    wearableSeasons = nil;
});
    NSValidationErrorValue = <ArticleImage: 0x12ad600> (entity: ArticleImage; id: 0x12b4d00 <x-coredata://05340FA6-B5DC-4646-A5B4-745C828C73C3/ArticleImage/p1> ; data: {
    article = 0x12b3f10 <x-coredata://05340FA6-B5DC-4646-A5B4-745C828C73C3/Article/p1>;
    image = "(...not nil..)";
});
}

خطأ 1600 هو:

nsvalidationrelationshipdenieddeleteError.
رمز الخطأ للإشارة إلى بعض العلاقة
مع حذف القاعدة nsdeletereruledeny
غير فارغ.

متوفر في Mac OS X V10.4 والإصدارات الأحدث.

أعلن في CoredataErrors.h.

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

لا أستطيع تحديد هذا الحل، لأنني لم أحلها حقا، لكن لدي عمل عمل يعمل. في ال .m لكل من بلدي managedObjects أضفت طريقة تبدو وكأنها:

-(void) deleteFromManangedObjectContext{ 
   self.outfit = nil; 
   self.article = nil; 
   [[self managedObjectContext] deleteObject:self]; 
} 

لذلك يمكنك أن ترى، أولا أتحمل العلاقات يدويا، ثم لدي الكائن حذف نفسه. في كائنات أخرى، بدلا من nil-ing, ، يتم استدعاء طريقة حذف بلدي بعض علاقات الكائنات، للحصول على سلسلة.

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

المحلول 3

لا أستطيع تحديد هذا الحل، لأنني لم أحلها حقا، لكن لدي عمل عمل يعمل. في .m لكل من ManiamedBjects، أضفت طريقة تبدو وكأنها:

-(void) deleteFromManangedObjectContext{ 
   self.outfit = nil; 
   self.article = nil; 
   [[self managedObjectContext] deleteObject:self]; 
} 

لذلك يمكنك أن ترى، أولا أتحمل العلاقات يدويا، ثم لدي الكائن حذف نفسه. في كائنات أخرى، بدلا من NIL-ING، يتم استدعاء طريقة حذف بلدي على بعض العلاقات بين الكائنات، للحصول على سلسلة.

ما زلت مهتما بالجواب "الصحيح". ولكن هذا هو أفضل حل لدي، وهو يسمح ببعض السيطرة الجميلة على كيفية حذف علاقاتي.

نصائح أخرى

كان لدي مشكلة حذف فشل، وهبطت على هذا السؤال. لقد اكتشفت مشكلتي ويعتقد أنني أشاطر ذلك أيضا وربما يكون لدى شخص ما نفس المشكلة أيضا.

الخطأ الذي أدلت به هو أن الكائن (أ) أحاول حذف لديه علاقة مع كائن آخر (ب) مع خالية من حذف قاعدة. ومع ذلك، فإن كائن B لديه علاقة مع A وغير اختياري. لذلك، عندما أحذف علاقة A، أصبحت باء لا شيء غير مسموح به. عندما أقوم بتغيير قاعدة حذف إلى Cascade وعملت.

هل تصادف لتنفيذ بعض الملحقات إلى العلاقة بنفسك؟ كان لدي مرة واحدة رمز مثل

-(NSSet*)articles
{
       re-calculates properties....
       return [self primitiveValueForKey:@"articles"];
}

في فئة فرعية من nsmanagedobject وكان لديه خطأ في حفظ. ما حدث كان ذلك، عندما يتم حذف هذا الكائن من ManagedObjectContext، يستدعي Coredata "مقالات" الملحق "للتعامل مع انتشار الحذف. حدث إعادة حساب المقالات هذه أثناء انتشار الحذف، والتي أعادت تسليم "المقالات" الملطخة في حالتي.

افحص xcdatamodel ملف ل Deny حذف القاعدة. انقر على كل علاقة حتى تجدها. ستحتاج إلى تغيير هذه القاعدة أو ضبط كيفية حذف الكائنات المدارة لتوقع تطبيق القاعدة على العلاقة.

كان لدي مشكلة مماثلة حيث تحول المشكلة في ملف .xib. عندما قمت بتبديل خانة الاختيار "حذف الكائنات على إزالة" (ضمن Bindings-> محتوى المحتوى) لوحدة تحكم الصفيف ذات الصلة، ذهبت المشكلة بعيدا.

لا أعرف ما إذا كان هذا سيساعد في قضيتك، لكن لدي الكثير من الشعر يذهب رماديا على المشاكل التي تحولت مخفية في مكان ما داخل باني واجهة.

في حالتي، قمت بإنشاء طريقة مخصصة في الفئة الفرعية الخاصة بي من NSManagedObject: ISDeleted. كنت واجهت استثناءات غريبة واحدة حتى أزلت / إعادة تسميةها. بعد فقدان عقلي، قرأت الوثائق مرة أخرى أكثر من ذلك الوقت هذه المرة. اتضح أنني تجاوزت واحدة من أساليب NSMANAGEDOBJECT يجب ألا يتجاوز المرء.

تحقق مما إذا كانت هذه المقتطف من المستندات تساعدك:

طرق يجب ألا تتجاوز

تقوم NSManagedObject نفسها بتصميم العديد من ميزات NSOBJECT بحيث يمكن دمج الكائنات المدارة بشكل صحيح في البنية التحتية للبيانات الأساسية. تعتمد البيانات الأساسية على تنفيذ NSManagedObject للطرق التالية، والتي يجب ألا تتجاوزها تماما: Primitivervalueforkey:، SetPrimIveValue: Forkey:، Isequal:، تجزئة، فائقة، فئة، ISProxy، IskindOfclass:، ISMEMBEROFCLASS:، conformstopclass:، الاستجابة يتم حذف, ، isfault، alloc، allocwithzone:، جديد، instanssrespondtoselector:، instantancemethodforselector:، methoneforselector:، methodsignaturefrorector:، instancemethodsignatureAdjector:، issubclassofclass :.

إضافة إلى ذلك - هناك طرق أخرى يمكنك تجاوزها ولكن يجب عليك الاتصال بالتنفيذ الفائق مثل أو الاتصال: willAccessPrimitiveForKey, didAccessPrimitiveForKey في مسافر و willChangevalueForKey, didChangeValueForKey في setters ....

لقد صادفت مؤخرا هذا الخطأ لأنني كان لدي رمز في طريقة WillSave - (الفراغ) التي قمت بتحديث بعض خصائص كائن الحذف المدار بعد - (BOOL) ISDeleted عاد بالفعل صحيحا.

أنا إصلاحها عن طريق:

- (void)willSave {
    if (![self isDeleted]) {
    //Do stuff...
    }
}

كنت تواجه مشكلة مماثلة للغاية مع حذف المتتالية، على علاقات الوالدين غير الاختيارية. كان مربكا للغاية لأنني اعتقدت أن حذف العلاقة الأصلية تم تعيين القاعدة على التلال. اتضح أن محرر نموذج البيانات في Xcode لم يكن حفظ قاعدة حذف. أود أن أقوم بتعيينه على Cascade، انتقل إلى وجهة نظر مختلفة والعودة وسيتم تعيينها لإلغاء مرة أخرى. اضطررت إلى إعادة تشغيل XCode وتعيين قاعدة حذف إلى Cascade. بعد أن فعلت هذا كل شيء يعمل.

لذا، إذا واجه أي شخص آخر هذه المشكلة، فحدث التحقق من أن Xcode يحفظ قواعد حذفك قبل الخوض في حلول أكثر تعقيدا.

بالمناسبة أنا أستخدم البيانات الأساسية على نظام التشغيل iOS مع محرر نموذج البيانات Xcode 5.

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