我一直试图确定一种优雅的方式来处理在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
?)
答案 0 :(得分:0)
如果您所做的只是处理文档列表,那么NSArray
和NSUserDefaults
可能是您最好的选择。技术上不那么令人印象深刻,但最简单的解决方案通常是最简单的。
对于每个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。将这些东西分开的正确位置是持久存储。