Как добавить базовые данные в существующий проект? - PullRequest
1 голос
/ 18 ноября 2011

Я сейчас работаю, хотя это руководство , которое объясняет, как добавить базовые данные в существующий проект.

Я дошел до части под названием

AppDelegate.m

Это говорит это:

Реализация applicationDocumentsDirectory и явная запись методов доступа для каждого нового свойства, а не просто использование @synthesize ключевое слово. Обратите внимание на аксессор persistentStoreCoordinator есть место, где вы должны назвать файл SQLite, используемый для хранить; скорее всего, это должно быть название вашего проекта. Запомни правильно отпустите каждый объект в dealloc:

Я не понимаю, что эта часть просит меня сделать

Реализация applicationDocumentsDirectory и явная запись методов доступа для каждого нового свойства, а не просто использование @synthesize ключевое слово.

Из того, что я могу сказать, меня попросили реализовать переменные не так, как я обычно делаю их с @synthesize ... но я не уверен, как еще это сделать ... если бы кто-то мог мне помочь, это было бы здорово .

Вот мой код недвижимости

//Core Data
@property (nonatomic, strong, readonly) NSManagedObjectModel *managedObjectModel;
@property (nonatomic, strong, readonly) NSManagedObjectContext *managedObjectContext;
@property (nonatomic, strong, readonly) NSPersistentStoreCoordinator *persistentStoreCoordinator;

Ответы [ 3 ]

3 голосов
/ 18 ноября 2011

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

Например, если вы посмотрите на новый проект нового шаблона, созданный XCode, вы заметите, чтоу всех свойств CoreData есть свои настраиваемые методы получения, и они лениво создают / создают ивары при первом обращении к ним.

Например, нижеприведенный метод проверяет, не равен ли ваш ивар managedObjectContext нулю, в этом случаеконтекст уже создан, поэтому метод getter просто возвращает его вызывающему методу (который обычно используется для доступа к свойству managedObjectContext с помощью self.managedObjectProperty)

- (NSManagedObjectContext*)managedObjectContext
{
    if (_managedObjectContext != nil)
       return _managedObjectContext
    _managedObjectContext = ...
}

Метод ApplicationsDocumentDirectory - это просто удобствометод, который возвращает путь к каталогу документов, который затем будет использоваться вашим координатором постоянного хранилища для установки пути к файлу базы данных CoreData.

Лучше всего создать новый проект и скопировать весь стек CoreData.из AppDelперейти на ваш существующий проект.Затем вам нужно будет создать управляемую объектную модель и убедиться, что вы правильно задали имя в методе NSManagedObjectModel, тогда вам следует хорошо идти.

3 голосов
/ 18 ноября 2011

Вы можете много очищать шаблон кода Core Data.Ссылки на NSPersistentStoreCoordinator и NSManagedObjectModel не нужны.Я склоняюсь к тому, чтобы свести все три в один метод, чтобы сделать код немного более кратким.

@interface AppDelegate()

@property (nonatomic, retain) NSManagedObjectContext *managedObjectContext;

@implementation AppDelegate

@synthesize managedObjectContext = $managedObjectContext;

- (NSManagedObjectContext *)managedObjectContext
{
  if ($managedObjectContext) return $managedObjectContext;

  NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"Example" withExtension:@"momd"];
  NSManagedObjectModel *mom = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];
  NSAssert1(mom, @"%@:%@ No model to generate a store from", [self class], NSStringFromSelector(_cmd));

  NSFileManager *fileManager = [NSFileManager defaultManager];
  NSURL *libraryURL = [[fileManager URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject];
  NSURL *url = [libraryURL URLByAppendingPathComponent:@"Example.storedata"];
  NSPersistentStoreCoordinator *coordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:mom];
  NSAssert(coordinator, @"Failed to initialize coordinator");

  NAssert1([coordinator addPersistentStoreWithType:NSXMLStoreType configuration:nil URL:url options:nil error:&error], @"Error: %@", error);

  $managedObjectContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];
  [$managedObjectContext setPersistentStoreCoordinator:coordinator];

  return $managedObjectContext;
}

С этим кодом у вас есть продолжение класса, которое обрабатывает ивар.Мы используем синтез, чтобы мы могли напрямую общаться с иваром в методе доступа get.

Поскольку к MOM и PSC можно обращаться через MOC, нет необходимости хранить дополнительные ссылки на них.

1 голос
/ 18 ноября 2011

Даже с объявлениями @property вы все равно можете реализовывать методы доступа по своему усмотрению.

- (NSString *)applicationDocumentsDirectory {
    return [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...