بيانات iPhone الأساسية "الهجرة التلقائية خفيفة الوزن"

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

سؤال

أحاول تحديث التطبيق الذي ينفذ مخزن بيانات أساسي. أضيف سمة إلى إحدى الكيانات.

أضفت الزميلة التالية إلى فئة مفوضي:

- (NSPersistentStoreCoordinator *)persistentStoreCoordinator {

    if (persistentStoreCoordinator != nil) {
        return persistentStoreCoordinator;
    }

    NSURL *storeUrl = [NSURL fileURLWithPath: [[self applicationDocumentsDirectory] stringByAppendingPathComponent: @"Shoppee.sqlite"]];

    NSError *error = nil;
    persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];

    NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:
                             [NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption,
                             [NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption, nil];

    if (![persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeUrl options:options error:&error]) {
        NSLog(@"Error: %@",error);
        NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
        abort();
    }    

    return persistentStoreCoordinator;
}

كان هذا من عنوان URL التالي:Doc.

أحصل على الخطأ التالي عند تنفيذ التعليمات البرمجية:

2009-12-01 20:04:22.877

Shoppee [25633: 207] خطأ: خطأ

المجال = nscocoaerrordomain رمز = 134130

UserInfo = 0x1624d20 "تعذر إكمال العملية. (خطأ الكاكاو 134130.)" 2009-12-01 20: 04: 22.879 Shoppee [25633: 207] مجال خطأ غير مرتبط أكملت. (خطأ الكاكاو 134130.) "، {url = ملف: // localhost / المستخدمين / إريك / مكتبة / .sqlite؛ البيانات الوصفية = {nspersistenceframeworkversion = 241؛ nsstoremodelversionhashes = {item = <869d4b20 088E5C44 5C345006 87D245CD 67AB9BC4 14CADF45 180251E9 F741A98F>؛ متجر = <47C250F4 895E6FD1 5033AB42 22D2D493 7819BA75 3C0ACFFC 2DC54515 8DEEED7A>؛ } nsstoremodelversionhashesversion = 3؛ nsstoremodelveriderifiers = ()؛ nsstoretype = sqlite؛ nsstoreuuid = "8DC65301-3BC5-42BE-80B8-E44577B8F8E1"؛ } السبب = "لا يمكن العثور على نموذج متجر للمصدر"؛ }

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

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

المحلول

إلى RECAP / دليل كامل:

  1. قبل إجراء أي تغيير، قم بإنشاء إصدار نموذج جديد.

    في Xcode 4: حدد .xcdatamodel -> محرر -> إضافة إصدار نموذج.

    في Xcode 3: التصميم -> نموذج البيانات -> إضافة إصدار نموذج.

    سوف ترى أن جديد .xcdatamodel يتم إنشاؤها في الخاص بك .xcdatamodeld المجلد (الذي تم إنشاؤه أيضا إذا لم يكن لديك أي).

  2. يحفظ.

  3. اختر الجديد .xcdatamodel وجعل التغيير الذي ترغب في توظيفه وفقا ال هجرة خفيفة الوزن توثيق.

  4. يحفظ.

  5. قم بتعيين المخطط الحالي / النشط إلى المخطط الذي تم إنشاؤه حديثا.

    مع ال .xcdatamodeld مجلد محدد:

    في Xcode 4: المرافق الشريط الجانبي -> ملف المفتش -> نموذج البيانات الأساسية للنسخ -> حدد المخطط الجديد.

    في Xcode 3: التصميم> نموذج البيانات> تعيين الإصدار الحالي.

    القراد الأخضر على .xcdatamodel سوف أيقونة الانتقال إلى المخطط الجديد.

  6. يحفظ.

  7. تنفيذ التعليمات البرمجية اللازمة لأداء الترحيل في وقت التشغيل.

    حيث الخاص بك NSPersistentStoreCoordinator يتم إنشاؤه (عادة فئة appdelegate)، ل options المعلمة، استبدال. nil مع التعليمات البرمجية التالية:

    [NSDictionary dictionaryWithObjectsAndKeys:
                      [NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption, 
                      [NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption, nil]
    
  8. تشغيل التطبيق الخاص بك. إذا لم يكن هناك تحطم، فربما تراجعت بنجاح :)

  9. عندما تكون قد ترحيل بنجاح، يمكن إزالة رمز الترحيل (الخطوة 7). (الأمر متروك للمطور لتحديد متى يمكن اعتبار مستخدمي تطبيق مستخدم منشور.)

الأهمية: لا تحذف الإصدارات الطويلة القديمة / المخططات. تحتاج البيانات الأساسية إلى الإصدار القديم للترحيل إلى الإصدار الجديد.

نصائح أخرى

اكتشفتها.

تصميم> نموذج البيانات> إضافة إصدار نموذج

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

  1. قبل إجراء التغييرات، قم بالتصميم -> نموذج البيانات -> إضافة إصدار نموذج (سوف ترى أن جديد .xcdatamodel يتم إنشاؤها في الخاص بك .xcdatamodeld مجلد)
  2. يحفظ
  3. اجعل التغيير الخاص بك
  4. يحفظ
  5. تشغيل التطبيق

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

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

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

مجرد ملاحظة بالنسبة لأولئك الذين صادفوا هذا googling، يبدو حتى مع الترحيل التلقائي (السحر) الذي لا تزال بحاجة إلى إنشاء إصدار من متجرك الأصلي، وواحد جديد، وقم بتعيين واحد جديد كإصدار الحالي.

حتى الآن أرى فقط كيفية تجنب رسالة الخطأ.

ولكن كيف يمكننا إصلاحه - في حالة افسولنا الأشياء بالفعل؟

الحل التالي إصلاح المشكلة ولكنك سوف تفقد البيانات في DB:

حذف / إعادة تسمية ملف SQLite من التطبيق المنتشر / المثبت.
يتم تقديم الملفات اسم الموقع مباشرة بعد رسالة الخطأ. على سبيل المثال:

السبب = لا يمكن العثور على نموذج لتخزين المصدر}، {
عنوان URL = "ملف: //localhost/users/yourname/library/application٪20support/iphone٪20simulator/4.3/applications/62f342d4-f007-4f6f-96d2-68f902d3719a/documents/locations.sqlite"؛

شيء يجب وضعه في الاعتبار عند إجراء هجرة خفيفة الوزن -

إذا كنت تخطط لإعادة تسمية / تعديل السمات، تذكر أن تحدد قيمة "إعادة تسمية المعرف" في النموذج الجديد أو القديم. لاستخدام مثال Apple الخاص، في Xcode 4.3، حدد Paintcolor في الطراز الجديد> التبديل إلى مفتش نموذج البيانات> تعيين حقل "إعادة تسمية المعرف" إلى اللون في قسم "الإصدار". بالنسبة لي، أدت الفشل في القيام بهذه الخطوة إلى خطأ وقت التشغيل. هذا الخطأ نفسه هو أيضا مغطاة هنا. وبعد كمستخدم جديد، لا يسمح لي بنشر الصور، حتى هنا IMGUR LINK. (وليس البريد المزعج، حقا).

    (Cocoa error 134140.)" UserInfo=0x622b350 {reason=Can't find or automatically infer mapping model for migration

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

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

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