[英]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方法中正確設置了名稱,然后就可以了。
您可以清理很多模板核心數據代碼。 不需要對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;
}
使用該代碼,您可以處理ivar的類延續。 我們使用synthesize,以便我們可以直接與get訪問器中的ivar對話。
由於可以通過MOC訪問MOM和PSC,因此無需保留對其的額外引用。
即使使用@property
聲明,您仍然可以根據需要實現訪問器。
- (NSString *)applicationDocumentsDirectory {
return [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.