簡體   English   中英

如何將核心數據添加到現有項目?

[英]How to add Core Data to an existing project?

我目前正在通過本教程進行工作, 該教程說明了如何將Core Data添加到現有項目。

我已經完成了標題為

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;

我認為特定段落在說的是您需要為CoreData ivars創建自定義吸氣劑。

例如,如果您查看由Xcode創建的全新模板項目,您會注意到所有CoreData屬性都設置了自定義getter,並且在您首次訪問它們時便懶惰地實例化/創建了ivars。

例如,下面的方法檢查您的managedObjectContext ivar是否不為nil,在這種情況下,上下文已經創建,因此getter方法將簡單地將其返回給調用方法(通常是使用self.managedObjectProperty訪問managedObjectContext屬性)。

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

applicationsDocumentDirectory方法只是一種便捷的方法,它返回文檔目錄的路徑,然后持久存儲協調器將使用該路徑來設置CoreData數據庫文件的路徑。

最好的選擇是創建一個新項目,然后將整個CoreData堆棧從AppDelegate復制到現有項目中。 然后,您將需要創建一個托管對象模型,並確保已在NSManagedObjectModel方法中正確設置了名稱,然后就可以了。

您可以清理很多模板核心數據代碼。 不需要對NSPersistentStoreCoordinatorNSManagedObjectModel的引用。 我傾向於將所有三個匯總為一個方法,以使代碼更簡潔。

@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;
}

使用該代碼,您可以處理ivar的類延續。 我們使用synthesize,以便我們可以直接與get訪問器中的ivar對話。

由於可以通過MOC訪問MOM和PSC,因此無需保留對其的額外引用。

即使使用@property聲明,您仍然可以根據需要實現訪問器。

- (NSString *)applicationDocumentsDirectory {
    return [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM