سؤال

هل من الممكن أن نموذج العلاقات بين الكيانات التي تم تعريفها في فصل NSManagedObjectModels إذا الكيانات التي تستخدم دائما في NSManagedObjectModel التي يتم إنشاؤها بواسطة دمج النماذج ذات الصلة?

على سبيل المثال ، يقول نموذج 1 يحدد كيان Foo مع العلاقة (واحد إلى واحد) toBar وهذا نموذج 2 يحدد كيان Bar مع العلاقة (واحد إلى واحد) toFoo.سأبني كوريداتا المكدس باستخدام -[NSManagedObjectModel mergedModelFromModels], دمج نموذج 1 نموذج 2.هل هناك أي طريقة لتحديد هذه العلاقات سواء في البيانات التماثيل أو برمجيا بحيث يتصرفون كما لو كانوا في نموذج العلاقات ؟

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

المحلول

لا نموذج 1 ولا نموذج 2 سيتم التحميل في وقت التشغيل إلا أنهم بشكل جيد — هذا إن لم تكن toBar و toFoo العلاقات الوجهات.وعلاوة على ذلك, إذا كان نموذج 1 نموذج 2 مماثل اسمه النماذج, أنت لن تكون قادرة على إنشاء دمج نموذج منها ؛ فإنها لن تكون ملتئم ، فإنها سوف تصطدم, وهو خطأ.

ومع ذلك ، يمكنك استخدام NSManagedObjectModel API يدويا لتحميل كل نموذج إنشاء نموذج جديد عن طريق اليد الذي يحتوي على الجهات على حد سواء.على NSEntityDescription و NSPropertyDescription الطبقات (والفئات الفرعية) لا تنفذ NSCopying البروتوكول وذلك في معظم الحالات عليك أن تكون قادرا على نسخ خصائص أكثر من كل عنصر النموذج إلى النموذج الشامل.

وعلاوة على ذلك ، NS*Description فصول كل دعم userInfo القاموس أنه يمكنك تحرير في كسكودي بيانات النمذجة أداة التي يمكنك استخدامها للقيام بأشياء مثل الوسم وجهة علاقة باعتبارها تقف في.على سبيل المثال في نموذج 1 هل يمكن أن يكون Bar الكيان userInfo الرئيسية MyRealEntity وتحقق ذلك عند إنشاء دمج النموذج ، في إشارة إلى استخدام كيان حقيقي بدلا من ذلك.

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

وهكذا إذا كان الخاص بك الحقيقي Foo لديه name السمة الخاصة بك الحقيقي شريط له kind السمة الخاصة بك الوقوف في Foo و Bar لن تحتاج تلك مجرد الوقوف في toBar و toFoo العلاقات.

هنا بعض رمز يدل على ماذا أتحدث:

- (NSManagedObjectModel *)mergeModelsReplacingDuplicates:(NSArray *)models {
    NSManagedObjectModel *mergedModel = [[[NSManagedObjectModel alloc] init] autorelease];

    // General strategy:  For each model, copy its non-placeholder entities
    // and add them to the merged model. Placeholder entities are identified
    // by a MyRealEntity key in their userInfo (which names their real entity,
    // though their mere existence is sufficient for the merging).

    NSMutableArray *mergedModelEntities = [NSMutableArray arrayWithCapacity:0];

    for (NSManagedObjectModel *model in models) {
        for (NSEntityDescription *entity in [model entities]) {
            if ([[entity userInfo] objectForKey:@"MyRealEntity"] == nil) {
                NSEntityDescription *newEntity = [entity copy];
                [mergedModelEntities addObject:newEntity];
                [newEntity release];
            } else {
                // Ignore placeholder.
            }
        }
    }

    [mergedModel setEntities:mergedModelEntities];

    return mergedModel;
}

يعمل هذا لأن النسخ NS*Description الكائنات في البيانات الأساسية هو اسم بدلا من القيمة فيما يتعلق بعلاقة وجهة الكيان معكوس (وأن الكيان subentities كذلك).وهكذا حين نموذج قابلة للتغيير — أي قبل ضبطه نموذج NSPersistentStoreCoordinator — يمكنك استخدام الحيل مثل هذا لكسر النموذج الخاص بك إلى عدة نماذج.

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