核心数据和10 000个音频文件

时间:2012-03-20 10:14:34

标签: objective-c ios sqlite core-data

我有一个实体“Word”,其中有两个属性--inputSound和outputSound,它们都很少,大约有10KB的音频文件,但在我的SQL数据库中这个实体会有4000个实例。

首先,我尝试将它们作为二进制数据存储在我的SQL中,这使得它的工作速度非常慢。 那么我找到了“存储在外部记录文件中”的选项,我想问一下,如果这对我有帮助,或者我应该更好地将url存储到我的实体属性中的音频文件中?

如果第一个更好,我应该如何在第一次启动时将我的pesistent存储从Bundle移动到文档目录?

现在我正在处理一个SQL(它是我在我的应用程序的开发人员中预先填充的),但是我应该如何处理这么多文件?我能以某种方式在背景中这样做以便我第一次启动更快,更人性化?

这就是我现在这样做的方式

- (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 个答案:

答案 0 :(得分:2)

对于二进制(尤其是大型的,虽然你的“很多”的情况也适用),推荐的方法似乎是使用Core Data来存储元数据,包括文件路径到实际的二进制本身。因此,您将这些内容存储在Application的沙箱中(即,可能是“Documents”目录中创建的子目录)。然后你可以使用[NSData dataWithContentsOfFilePath]或类似的方法来实际获取你想要播放它们的字节数,但是你的核心数据提取并没有因为尝试铲除这些字节而减慢。

绝对看看有关优化核心数据的WWDC视频。如何使用Instruments和其他“SQL Debug Timing”开关的绝佳示例,以确保您正在优化的内容......实际上已经过优化。 :)