2011-01-23 4 views
1

Существующее приложение на основе документов, которое сохраняет и загружает свои данные с использованием NSKeyedArchiver/NSKeyedUnarchiver, в настоящее время преобразуется для использования Core Data в качестве хранилища.Как NSKeyedUnarchive подклассы NSManagedObject для импорта в основные данные?

Теперь я пытаюсь импортировать файлы, сохраненные с использованием прежнего приложения. Структура объекта не изменилась, но я изменил все объекты на NSManagedObject. Теперь initWithCoder: вызывает [super initWithCoder:] и не создает объект, используя NSEntityDescription. Это происходит нереально (как и ожидалось).

Мой вопрос: что является лучшей практикой/хорошим советом, чтобы иметь такую ​​функциональность импорта?

+0

После того, как я собрал свое собственное решение (с каким-то ударным голова-на-столе), я нашел то же самое решение, описанное The Mental Faculty: –

+0

Вы должны переместить свой комментарий к ответу и принять его, чтобы другие могли его найти. – TechZen

ответ

0

Правильный способ заключается в реализации подкласса NSAtomicStore, который отформатирует старый формат данных в представлении Core Data. После загрузки старых данных с помощью этого магазина, вы можете легко перенести данные с помощью -[NSPersistentStoreCoordinator migratePersistentStore:toURL:options:withType:NSSQLiteStoreType error:]

OLD (НЕПРАВИЛЬНО) ОТВЕТ:

После fiddeling вместе мое собственное решения (с некоторым столом Стук-лобовой-вовлеченным) Я нашел одно решение, описанное ментальный факультет:

KEYED-ARCHIVING TO CORE DATA MIGRATION

Я сделал это так же, как они это делают, но я создал свой собственный подкласс NSKeyedValueDecoder, который хранит контекст. initWithCoder: моих CBManagedObject суперкласс для всех субъектов выглядит следующим образом:

- (id) initWithCoder:(NSCoder *)inCoder { 
    NSManagedObjectContext *context = ((CBNSKeyedUnarchiverCoreData*)inCoder).context; 
    self = [super initWithEntity:[NSEntityDescription entityForName:[[self class] entityName] 
              inManagedObjectContext:context] insertIntoManagedObjectContext:context]; 
    if (!self) return nil; 
    return self; 
} 

Каждый субъект дает свое имя лица с помощью метода класса +entityName.

Похоже, хорошее решение, так как оно работает очень хорошо.

Смежные вопросы