我在iOS中创建了一个单一视图应用程序,它还包含了核心数据。我从另一个应用程序移动了我的.xcdatamodel文件,然后输入我正在处理的那个文件,我遇到了问题。我所做的是剪切并粘贴上一个应用程序中的代码并将其放在我的AppDelegate.h / m文件中:
@interface DBAppDelegate : UIResponder <UIApplicationDelegate>
@property (strong, nonatomic) UIWindow *window;
@property (readonly, strong, nonatomic) NSManagedObjectContext *managedObjectContext;
@property (readonly, strong, nonatomic) NSManagedObjectModel *managedObjectModel;
@property (readonly, strong, nonatomic) NSPersistentStoreCoordinator *persistentStoreCoordinator;
- (void)saveContext;
- (NSURL *)applicationDocumentsDirectory;
@end
和我的.m文件:
@implementation DBAppDelegate
@synthesize managedObjectContext = _managedObjectContext;
@synthesize managedObjectModel = _managedObjectModel;
@synthesize persistentStoreCoordinator = _persistentStoreCoordinator;
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
// Override point for customization after application launch.
UINavigationController *navigationController = (UINavigationController *)self.window.rootViewController;
//the line below is what is causing an error
DBViewController *controller = (DBViewController *)navigationController.topViewController;
controller.managedObjectContext = self.managedObjectContext;
return YES;
}
在我的.m文件中,我还包含了Core Data的样板代码,这个代码也在我以前的应用程序中,我还没有发布。在我的新应用程序中,我所做的是创建了一个访问层,它还提供了一个Singleton实例来访问该层。我在这个类中进行CRUD操作,并在.h文件中声明了以下属性:
@property (strong, nonatomic) NSManagedObjectContext *managedObjectContext;
@property (strong, nonatomic) NSManagedObjectModel *managedObjectModel;
@property (strong, nonatomic) NSPersistentStoreCoordinator *persistentStoreCoordinator;
@property (nonatomic, strong) NSFetchedResultsController *fetchedResultsController;
目前,我收到以下错误:
在“DBViewController”类型的对象上找不到“属性'managedObjectContext'。我想要做的是初始化我的方法中的managedObjectContext,它允许创建一个Singleton实例:
static DB *sharedSingleton = nil;
+ (DB *) sharedInstance {
if (sharedSingleton == nil) {
sharedSingleton = [[super alloc] init];
}
return sharedSingleton;
}
任何人都可以看到我做错了吗?我意识到我没有在我的DBViewController中声明一个managedObjectContext对象,但是我应该用什么代替这一行呢?我认为这将是我的Singleton课程的一部分,但我老实说这里没有线索。
感谢所有回复的人。
答案 0 :(得分:2)
您要做的事情通常被称为“数据存储”单例,这是一个很好的设计模式。我在我的应用程序中做的是有一个名为DataStore
的单例类,您可以使用类方法随意调用它:
+ (id)sharedStore{
static DataStore *sharedStore = nil;
if (!sharedStore) {
sharedStore = [[self alloc] init];
}
return sharedStore;
}
每当我需要访问数据存储区提供的资源时,我都会这样做:
Datastore *ds = [Datastore sharedStore];
为了提供对Core Data的访问,我有一个数据存储方法:
+ (NSManagedObjectContext*)managedObjectContext{
static NSManagedObjectContext *context = nil;
if(context){
return context;
}
NSPersistentStoreCoordinator *coordinator = nil;
NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"Model" withExtension:@"momd"];
NSManagedObjectModel *objectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];
if (!coordinator) {
coordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:objectModel];
}
if(!coordinator){
return nil;
}
NSString *storePath = [[self documentsDirectoryPath] stringByAppendingPathComponent:@"datastore.sqlite"];
NSURL *storeURL = [NSURL URLWithString:storePath];
NSError *error;
if (![coordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:NULL error:&error])
{
NSLog(@"Database error: %@", error);
// if you make changes to your model and a database already exists in the app
// you'll get a NSInternalInconsistencyException exception. When the model is updated
// the databasefile must be removed. Remove the database here because it's easy.
NSFileManager *fileManager = [NSFileManager defaultManager];
[fileManager removeItemAtURL:storeURL error:nil];
//try to add the persistant store one more time. If it still fails then abort
if (![coordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:NULL error:&error])
return nil;
}
context = [[NSManagedObjectContext alloc] init];
[context setPersistentStoreCoordinator:coordinator];
[context setUndoManager:nil];
return context;
}
如果无法创建nil
,则此方法返回NSManagedObjectContext
。这样你只需要这样做:
NSManagedObjectContext *context = [[DataStore sharedStore] managedObjectContext];
每当您需要使用Core Data时。这可以在viewDidLoad
中执行一次。
编辑:
managedObjectContext
方法使用以下方法查找文档目录:
+ (NSString *)documentsDirectoryPath
{
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *basePath = ([paths count] > 0) ? [paths objectAtIndex:0] : nil;
return basePath;
}