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

标签 objective-c ios sqlite core-data

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

首先,我尝试将它们作为二进制数据存储在我的 SQL 中,但它的运行速度非常慢。 然后我找到了一个“存储在外部记录文件”的选项,我想问一下,这是否对我有帮助,或者我最好只将 url 存储到我的实体属性中的音频文件?

如果第一个更好,我应该如何在第一次启动时将我的持久存储从 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;

最佳答案

对于二进制文件(尤其是大二进制文件,尽管您的“很多”二进制文件也适用)推荐的方法似乎是使用 Core Data 来存储元数据,包括文件路径到实际的二进制文件本身。因此,您会将这些东西存储在应用程序沙箱中的某个位置(即,可能是您在“文档”目录中创建的子目录)。然后你可以使用 [NSData dataWithContentsOfFilePath] 或类似的方法在你想播放它们时实际获取字节,但是你的核心数据获取不会因为试图铲掉这些字节而减慢。

一定要看看有关优化核心数据的 WWDC 视频。关于如何使用 Instruments 和额外的“SQL Debug Timing”开关以确保您正在优化的内容……真正得到优化的绝佳示例。 :)

关于objective-c - 核心数据和 10 000 个音频文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9784795/

相关文章:

Android SQLite ORDER BY 在查询中不起作用

java - 在android中以表格形式排列sqlite表数据?

iphone - 访问存储在应用程序中的文件的最快方法

objective-c - Cocoa 用户可调整大小的 View

objective-c - 拦截/以编程方式设置 IBOutlet 属性

iphone - 有没有办法让 LilyPad Arduino 与 iOS 设备进行通信?

ios - 在 Swift iOS 应用程序中存储数据供以后使用

ios - iOS 中的 Mailto 链接不起作用

java - 创建一个 Student 将其传递给 SQL 对象并在线程 "AWT-EventQueue-0"lang.ArrayIndexOutOfBoundsException : 4 中获取异常

iphone - 委托(delegate)被派往错误的类(class)