Базовые данные и 10 000 аудиофайлов - PullRequest
1 голос
/ 20 марта 2012

У меня есть сущность "Word", и в ней есть два свойства - inputSound и outputSound, оба они маленькие, около 10 КБ аудиофайлов, но в моей базе данных SQL будет 4000 экземпляров этой сущности.

Сначала я попытался сохранить их в виде двоичных данных в моем SQL, и это сделало его довольно медленным. Итак, я нашел опцию «Сохранить во внешнем файле записи» и хочу спросить, поможет ли это мне, или мне лучше просто сохранить URL-адрес аудиофайла в свойстве объекта?

Если первое лучше, как мне переместить мой постоянный магазин из Bundle в каталог документов при первом запуске?

Прямо сейчас я просто справляюсь с SQL (он предварительно заполнен мной в части моего приложения для разработчика), но как мне сделать это с таким количеством файлов? И могу ли я сделать это как-то в backgrouns, чтобы сделать мой первый запуск быстрее и удобнее?

Вот как я это делаю сейчас

- (NSPersistentStoreCoordinator *)persistentStoreCoordinator
{

if (__persistentStoreCoordinator != nil)
        return __persistentStoreCoordinator;

NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:
                         [NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption,
                         [NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption, nil];
NSString *documentsDirectory = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)lastObject];
NSString *defaultStore = [documentsDirectory stringByAppendingPathComponent:@"Easy10.sqlite"];

NSString *sqliteInBundle = [[[NSBundle mainBundle] pathForResource:@"Easy10" ofType:@"sqlite"]stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"Easy10.sqlite"]; 
NSError *error =nil;
NSFileManager *fileManager = [NSFileManager defaultManager];

if (![fileManager fileExistsAtPath:defaultStore])
    [fileManager copyItemAtPath:sqliteInBundle toPath:defaultStore error:&error];



__persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];
[__persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:options error:&error];    
return __persistentStoreCoordinator;

}

1 Ответ

2 голосов
/ 20 марта 2012

Для двоичных файлов (и особенно больших, хотя ваш случай «многих» из них также может применяться), похоже, рекомендуется использовать базовые данные для хранения метаданных, включая путь к файлу для сам фактический двоичный файл. Таким образом, вы будете хранить эти вещи где-нибудь в песочнице приложения (то есть, возможно, в подкаталоге вашего создания в каталоге «Documents»). Затем вы можете использовать [NSData dataWithContentsOfFilePath] или аналогичный, чтобы фактически получить байты, когда вы хотите их воспроизвести, но ваши выборки Базовых данных не замедляются, пытаясь сгладить эти байты вокруг.

Обязательно посмотрите видео WWDC по оптимизации основных данных. Прекрасные примеры того, как использовать инструменты и дополнительные переключатели «SQL Debug Timing», чтобы убедиться, что то, что вы оптимизируете… действительно было оптимизировано. :)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...