SQL является основанным на наборе языком - это - то, что он прилагает все усилия.
я думаю, что курсоры являются все еще плохим выбором, если Вы не понимаете достаточно о них для выравнивания по ширине их использования при ограниченных обстоятельствах.
Другая причина мне не нравятся курсоры, ясность. Блок курсора так ужасен, что трудно использовать ясным и эффективным способом.
Все, что быть сказанным, там некоторые случаи, где курсор действительно является лучшим - они просто не обычно случаи, для которых новички хотят использовать их.
Если вы используете CoreData с поддержкой SQLite, тогда обязательно. Самый простой вариант - позволить приложению сгенерировать схему для вас, а затем, используя эту пустую базу данных / оболочку, запустить инструмент миграции xml-to-sql. Вам просто нужно обновить свой инструмент, чтобы учесть структуру, которую CoreData генерирует для вас из xcdm.
В качестве альтернативы вы можете использовать свой инструмент для записи базы данных sqlite, которая включена в ваш пакет, затем во время выполнения при запуске, считывать данные из базы данных sqlite, вставлять их в CoreData и продолжать. При этом ваша база данных sqlite будет использоваться в качестве контейнера для «данных предварительной загрузки» и всего дальнейшего взаимодействия с данными в хранилище данных CoreData.
Вероятно, это вопрос предпочтений.
Я не верю, что Core Data по своей сути обеспечивает этот тип функциональности. Если бы я был на вашем месте, я бы написал небольшой инструмент, который бы выполнял синтаксический анализ XML и делал все необходимое для создания модели Core Data из этих данных и ее сохранения. Затем просто переместите базу данных sqlite, созданную Core Data, в ваш настоящий проект.
Затем, возможно, напишите какой-нибудь код, который копирует эту базу данных по умолчанию в нужное место на iPhone, если базы данных там еще нет. Это также позволит вам легко вернуться к «чистым» данным, если вы попадете в плохое состояние, поскольку вы можете просто удалить файл базы данных и повторно запустить приложение.
Вы можете использовать аналогичный подход. Самый простой способ - настроить контекст, управляемый основными данными, а затем прочитать его в вашем XML-файле, создав управляемые объекты по мере анализа XML-файла.
NSManagedObjet *managedObject = [[NSEntityDescription insertNewObjectForEntityForName:@"DataTypeName"
inManagedObjectContext:managedContext] retain];
[managedObject setValue:@"some data" forKey:@"keyName"];
/* ... */
Я немного опоздал на эту вечеринку, но я делаю что-то подобное для езды на продукты. У меня есть данные, хранящиеся в файлах Plist, которые мне нужны в My Coredata SQLite Store. Я написал инструмент Foundation командной строки, который работает на моем Mac, который анализирует файлы plist, а затем используя мою модель объекта CARE COORE создает SQLite Store. Я запускаю этот инструмент командной строки как часть моей сборки (для некоторых конфигураций сборки), чтобы я мог восстановить данные по желанию. Чтобы создать этот вид инструмента в Xcode, выберите Файл -> Новый проект -> Mac OS X -> Инструмент командной строки и выберите «Основные данные» из меню «Тип». Вот какой-то выборки:
#import <objc/objc-auto.h>
int main (int argc, const char * argv[]) {
objc_startCollectorThread();
//You may not know this, but NSUserDefaults can be used to parse command line arguments!
//in this case, the arguments are passed in like this:
// -fullMomPath /hd/some/path/file.mom -fullStorePath /hd/some/path/file.sql
//by passing in the storePath, the calling script knows where the sqlite file will be and can copy it to the resulting application bundle
NSUserDefaults *args = [NSUserDefaults standardUserDefaults];
NSString *momPath = [args stringForKey:@"fullMomPath"];
NSString *storePath = [args stringForKey:@"fullStorePath"];
// Create the managed object context
NSManagedObjectContext *context = managedObjectContext(momPath, storePath);
//build and save your NSManagedObjects here
//in my case, i parse some plist files and create GroceryList type stuff, but whatever you do is your business.
return 0;
}
NSManagedObjectModel *managedObjectModel(NSString* momPath) {
static NSManagedObjectModel *model = nil;
if (model != nil) {
return model;
}
NSURL *modelURL = [NSURL fileURLWithPath:momPath];
model = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];
return model;
}
NSManagedObjectContext *managedObjectContext(NSString* momPath, NSString* storePath) {
static NSManagedObjectContext *context = nil;
if (context != nil) {
return context;
}
context = [[NSManagedObjectContext alloc] init];
NSPersistentStoreCoordinator *coordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel: managedObjectModel(momPath)];
[context setPersistentStoreCoordinator: coordinator];
NSString *STORE_TYPE = NSSQLiteStoreType;
NSURL *url = [NSURL fileURLWithPath:storePath];
NSError *error;
NSPersistentStore *newStore = [coordinator addPersistentStoreWithType:STORE_TYPE configuration:nil URL:url options:nil error:&error];
if (newStore == nil) {
NSLog(@"Store Configuration Failure\n%@",
([error localizedDescription] != nil) ?
[error localizedDescription] : @"Unknown Error");
}
return context;
}