在iOS上使用Core Data来处理类似于多个文档的内容

时间:2011-09-19 11:39:06

标签: iphone ios sqlite core-data

我一直试图确定一种优雅的方式来处理在iOS上使用CoreData实现设计,类似于处理多个文档。

作为背景,我有一个培训应用程序,我想支持应用程序中的培训课程。这些文件可能是包含.sqlite和一些支持媒体文件的文件包,这些文件将在下载后放入App Library文件夹中的CourseName个子文件夹中。

我希望能够支持在我的应用程序的根级别列出表中的所有Coursenames,并根据用户选择的那个在它们之间切换。

我的直觉是我可以将商店切换到适当的sqlite。

    NSString *sqliteFileForCourseName = [self sqliteFileForCourseName];
    storeURL = [[self applicationLibraryDirectory] URLByAppendingPathComponent:sqliteFileForCourseName];
    if(!__persistentStoreCoordinator)
        __persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];
    if (![__persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:options error:&error])
    // handle error

我认为这将是管理[persistentStoreCoordinator persistentStores]中的项目的问题。

我不确定这是否是处理该功能的正确级别(多个持久存储),或者是否可以在NSManagedObjectContext级别完成。

如果Courses课程从Library文件夹中加载,那么我可以将它们简单化为一个可写的Store和多个只读商店(可能是NSInMemoryStoreType?)

2 个答案:

答案 0 :(得分:0)

如果您所做的只是处理文档列表,那么NSArrayNSUserDefaults可能是您最好的选择。技术上不那么令人印象深刻,但最简单的解决方案通常是最简单的。

对于每个Document,除非你真的有很多数据需要阅读,否则我不会打扰sqlite数据库。我会使用.json文件来存档,该文件提供该文档的信息,即

index.json

{
    "name":"Document 1",
    "author":"Bob Smith"
    "pages":[
        { "title":"Title", "path":"title.html" },
        { "title":"Contents", "path":"contents.html" },
        { "title":"1", "path":"contents/1.html" }
    ]
}

其中每个页面都是一个html文件(或任何你想要的格式),它的位置是在文档的json描述中指定的。

只需创建一个实现NSCoding的Document对象 - 从上面的JSON创建它并将其存储在NSUserDefaults中。

然后,在启动时,只需使用标题作为UITableViewCell中的文本,从NSUserDefaults中读取的数组中填充UITableView。


但是,sqlite可能有正当理由 - 您是否计划对文档进行特别复杂的处理?

答案 1 :(得分:0)

将这些作为持久存储进行管理似乎完全正确。这就是他们的设计目标。你无法在MOC层面真正控制它。单个逻辑“文档”可以具有许多MOC。在大多数情况下,例如每个线程需要单独的MOC。将这些东西分开的正确位置是持久存储。