2011-10-24 36 views
5

Tôi đang làm việc với các tính năng UIDocument mới trong iOS 5.0. Tôi có một ứng dụng hiện có sử dụng nhiều Mô hình Dữ liệu khác nhau (các tệp momd). Theo tài liệu cho UIManagedDocument, bạn có thể ghi đè lên - (NSManagedObjectModel *) managedObjectModel để tải một Mô hình Dữ liệu cụ thể (mặc định là tải tất cả các mô hình dữ liệu được tìm thấy được hợp nhất với nhau). Cả hai mô hình dữ liệu đều có các tên mô hình trùng lặp với các lược đồ khác nhau, vì vậy điều này là không mong muốn trong trường hợp của tôi.Ghi đè managedObjectModel trong UIManagedDocument

Relevant Apple Doc

Vì vậy, vấn đề tôi có ở đây trong một mẫu đơn giản, là tôi có thể ghi đè lên các chức năng, nhưng tôi không thể gán nó là kết quả. Cả hai đều là private, do đó, _managedObjectModel không thể được truy cập bởi lớp con; và, nó là chỉ đọc, vì vậy self.managedObjectModel không thể được chỉ định ..

Tôi đã tìm một ví dụ UIManagedDocument ghi đè lên managedObjectModel, nhưng Apple không xuất hiện để cung cấp một.

Tôi có thể xác định biến mẫu mới _myManagedObjectModel và gán biến đó. Sau đó trả lại trên accessor tôi ghi đè. Mối quan tâm của tôi là có thể phá vỡ một số thực hiện nội bộ của UIManagedDocument mà không sử dụng accessor managedObjectModel ưu tiên cho _managedObjectModel (thường được thấy trong việc triển khai Apples ...)

Có vẻ như một vấn đề thẳng về phía trước và tôi nghi ngờ mình ' m chỉ thiếu một cái gì đó thực sự đơn giản để cho phép ghi đè thích hợp.

// 
// DTNoteDocument.m 
// document-test 
// 
// 

#import "DTNoteDocument.h" 

@implementation DTNoteDocument 

NSString * const kDataManagerModelName = @"Note"; 

-(NSManagedObjectModel*)managedObjectModel { 

    if (_managedObjectModel != nil) 
     return _managedObjectModel; 

    NSBundle *bundle = [NSBundle mainBundle]; 
    NSString *modelPath = [bundle pathForResource:kDataManagerModelName ofType:@"momd"]; 
    _managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:[NSURL fileURLWithPath:modelPath]]; // compile error on this line, private variable cannot be assigned 

    return _managedObjectModel; 
} 
@end 

Tiêu đề:

#import <UIKit/UIKit.h> 

@interface DTNoteDocument : UIManagedDocument 

@end 

Trả lời

5

tôi giải quyết cuối tuần này, nhưng figured tôi muốn cập nhật để phản ánh giải pháp của tôi. Nếu bạn tìm thấy một cái gì đó tốt hơn, tôi sẽ rất vui khi thấy nó.

tôi đã thêm một tài sản duy nhất để tiêu đề lớp học của tôi để bắt đầu:

@property (nonatomic,retain,readonly) NSManagedObjectModel *myManagedObjectModel; 

Sau đó thêm vào phần sau đây để thực hiện lớp học của tôi:

-(NSManagedObjectModel*)myManagedObjectModel { 
    if (myManagedObjectModel) 
     return myManagedObjectModel; 

    NSBundle *bundle = [NSBundle mainBundle]; 
    NSString *modelPath = [bundle pathForResource:kDataManagerModelName ofType:@"momd"]; 
    myManagedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:[NSURL fileURLWithPath:modelPath]]; 

    return myManagedObjectModel; 
} 

-(NSManagedObjectModel*)managedObjectModel { 
    return self.myManagedObjectModel; 
} 

Kể từ khi tôi có thể ghi đè lên có được tài sản cho managedObjectModel, điều này hoạt động khá tốt. Các UIManagedDocument khởi tạo và hoạt động tốt trong các thử nghiệm và triển khai của tôi cho đến nay. Thực hiện một dấu vết cho thấy managedObjectModel được gọi trên init, vì vậy tôi giả sử mọi thứ được khởi tạo đúng từ kết quả trả về.

0

Cuối cùng, tôi đã phát hiện ra sự cố của tôi với giải pháp của bạn. Các UIManagedDocument nên cho phép chúng ta thay đổi các tùy chọn objectmodelLoading ...

Bạn đang thiếu trong mã của bạn này:

tập tin .m

#import <CoreData/CoreData.h> 

@implementation DTNoteDocument{ 
    NSManagedObjectModel * myManagedObjectModel; 
}