Использование CoreData на iOS для обработки чего-то похожего на несколько документов - PullRequest
1 голос
/ 19 сентября 2011

Я пытался определить элегантный способ реализации дизайна с использованием CoreData на iOS, который похож на обработку нескольких документов.

В качестве фона у меня есть учебное приложение, в котором я бынравится поддерживать в приложении Puchase учебных курсов.Вероятно, это будет набор файлов, содержащий .sqlite и некоторые вспомогательные мультимедийные файлы, которые при загрузке окажутся в подпапках CourseName в папке библиотеки приложений.

Я бы хотел, чтобывозможность поддержки перечисления всех Coursenames в таблице на уровне Root моего приложения и переключения между ними в зависимости от того, какой пользователь выбирает.

Мне кажется, что я могу переключить Store насоответствующий 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.

Я мог бы жить с курсами, которые доступны только для чтения, когда они загружаются из папки библиотеки, если это упрощает вещи, чтобы иметь одно доступное для записи хранилище и многократное чтениетолько магазины (возможно NSInMemoryStoreType?)

Ответы [ 2 ]

0 голосов
/ 31 октября 2011

Управление ими как постоянными магазинами кажется совершенно правильным. Вот для чего они предназначены. Вы не можете реально контролировать это на уровне MOC. Один логический «документ» может иметь много МОС. Например, в большинстве случаев требуется наличие отдельного MOC для каждого потока. Правильное место для разделения этих вещей в постоянном магазине.

0 голосов
/ 19 сентября 2011

Если все, что вы делаете - это обрабатывает список документов, тогда NSArray и NSUserDefaults, вероятно, - ваш лучший выбор. Это менее технически впечатляюще, но самое простое решение обычно самое простое.

Что касается каждого документа, я не стал бы беспокоиться о базе данных 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 документа.

Просто создайте объект Document, который реализует NSCoding - создайте его из приведенного выше JSON и сохраните его в ваших NSUserDefaults.

Затем при запуске просто заполните свой UITableView из массива, который вы читаете из NSUserDefaults, используя заголовок в качестве текста в UITableViewCell.


Однако может быть веская причина для sqlite - есть ли что-то особенно сложное, что вы планируете делать с документами?

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