[iphone] البيانات الأساسية فون خطأ لم يتم حلها أثناء الحفظ


Answers

أنا ناضلت مع هذا لفترة قصيرة بنفسي. تكمن المشكلة الحقيقية هنا في أن التصحيح الذي تحصل عليه لا يُظهر لك المشكلة. والسبب في ذلك هو أن CoreData سيضع مصفوفة من كائنات NSError في كائن NSError "المستوى الأعلى" ويعيدها إذا كان هناك أكثر من مشكلة واحدة (هذا هو السبب في أنك ترى الخطأ 1560 ، والذي يشير إلى العديد من المشكلات ، ومجموعة من الأخطاء 1570s). يبدو أن CoreData يحتوي على عدد قليل من المفاتيح التي يستخدمها لتخفيض المعلومات في الخطأ الذي يتم إرجاعه إذا كانت هناك مشكلة ستعطيك معلومات أكثر فائدة (مثل الكيان الذي حدث فيه الخطأ ، والعلاقة / السمة التي كانت مفقودة ، إلخ. ). يمكن العثور على المفاتيح التي تستخدمها لفحص قاموس userInfo في المستندات المرجعية هنا .

هذه هي كتلة الكود الذي أستخدمه للحصول على ناتج معقول من الخطأ الذي تم إرجاعه أثناء الحفظ:

    NSError* error;
    if(![[survey managedObjectContext] save:&error]) {
        NSLog(@"Failed to save to data store: %@", [error localizedDescription]);
        NSArray* detailedErrors = [[error userInfo] objectForKey:NSDetailedErrorsKey];
        if(detailedErrors != nil && [detailedErrors count] > 0) {
            for(NSError* detailedError in detailedErrors) {
                NSLog(@"  DetailedError: %@", [detailedError userInfo]);
            }
        }
        else {
            NSLog(@"  %@", [error userInfo]);
        }
    }

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

Question

أتلقى رسالة خطأ غريبة من البيانات الأساسية عند محاولة الحفظ ولكن المشكلة أن الخطأ لا يمكن إعادة إنتاجه (يظهر في أوقات مختلفة عند القيام بمهام مختلفة)

رسالة الخطأ:

Unresolved error Domain=NSCocoaErrorDomain Code=1560 UserInfo=0x14f5480 "Operation could not be completed. (Cocoa error 1560.)", {
NSDetailedErrors = (
Error Domain=NSCocoaErrorDomain Code=1570 UserInfo=0x5406d70 "Operation could not be completed. (Cocoa error 1570.)",
Error Domain=NSCocoaErrorDomain Code=1570 UserInfo=0x14f9be0 "Operation could not be completed. (Cocoa error 1570.)"
);
}

والطريقة التي تولد الخطأ هي:

- (IBAction)saveAction:(id)sender {
    NSError *error;
    if (![[self managedObjectContext] save:&error]) {
        // Handle error
        NSLog(@"Unresolved error %@, %@, %@", error, [error userInfo],[error localizedDescription]);
        exit(-1);  // Fail
    }
}

أي فكرة لسبب هذه الرسالة؟ إعطاء ذلك يظهر في أوقات عشوائية




تلمسني المشكلة ، عندما أقوم بحفظ السجل الثاني إلى CoreData. تمت تعبئة جميع الحقول غير الاختيارية (العلاقة) دون الصفر كذلك ، ولكن في الإخراج الخطأ الذي سألاحظه ، أصبح أحد الحقول في أول كائن تم حفظه لا شيء. غريب قليلا؟ لكن السبب تافه للغاية - علاقة واحدة تلغي الكائن الأول ، عندما أضعه في الثاني.

إذن ، المخطط هو:

"Parent" with relationship "child" One to One
Create Child 1, set parent. Save - OK
Create Child 2, set parent. Save - Error, Child 1.Parent == nil
(behind the scene child 2 did nullify child 1 parent)

تغيير العلاقة في الوالد من واحد إلى واحد إلى العديد إلى واحد حل هذه المهمة.




أعني أن النموذج الخاص بك فشل في التحقق ، والذي قد يحدث لعدد من الأسباب: خاصية غير مستخدمة في النموذج الخاص بك ، القيمة المفقودة التي تم وضع علامة عليها كما هو مطلوب. للحصول على فهم أفضل لما حدث بالضبط ، ضع نقطة توقف في مكان تكون فيه مستعدًا لحفظ الكائن الخاص بك ، واتصل بأحد متغيرات الأسلوب validateFor... ، مثل:

po [myObject validateForInsert]

معلومات أكثر تفصيلاً حول المشكلة في وصف الخطأ. يعني التحقق الناجح أنك لن تحصل على أي مخرجات.






Related