首先去CoreData.我这样做了吗?

Kyl*_*ick 0 core-data objective-c

一点背景.我有一个历史上使用NSUserDefaults存储设置的应用程序.这导致了很多问题,因为我存储了关键的激活值,而NSUserDefaults似乎有时会消失,但这是另一个话题.我将转换到使用CoreData,我想确保我正确地接近它.

我已经构建了一个名为Registry的实体,它具有key属性和每种可能数据类型的一个属性.这个想法是键值对,类似于使用NSUserDefaults存储键值对的方式.所以我的模型看起来像这样:

模型

我创建了NSManagedObjectModel的子类.据我所知,没有必要这样做,它带给你的唯一好处是代码更清晰.那是对的吗?

所以我写了一小段测试代码,看看我是否真的得到了它的工作原理.我没有做任何错误处理,我显然会在现实代码中做,这只是为了获得一般性的理解.[编辑:有关正确错误处理的所有评论,我想我会更新,所以错误得到妥善处理.希望这也有助于其他观众学习]

AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
self.managedObjectContext = appDelegate.managedObjectContext;
NSFetchRequest *fetchRequest = [NSFetchRequest fetchRequestWithEntityName:@"Registry"];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"key == %@", @"Test"];
fetchRequest.predicate = predicate;
NSError *coreDataError;
NSArray *fetchedObjects = [self.managedObjectContext executeFetchRequest:fetchRequest error:&coreDataError];
if (coreDataError != nil) {
    NSLog(@"Error in executeFetchRequest: %@\r\n%@", coreDataError, coreDataError.userInfo);
}

Registry *testSetting1;

if ([fetchedObjects count] == 1) {
    testSetting1 = [fetchedObjects objectAtIndex:0];
    NSLog(@"Value of Test = %@", testSetting1.stringVal);
}
else{
    testSetting1 = [NSEntityDescription
                    insertNewObjectForEntityForName:@"Registry"
                    inManagedObjectContext:self.managedObjectContext];
    testSetting1.key = @"Test";
    testSetting1.stringVal = @"ABC123";
    [self.managedObjectContext save:&coreDataError];
    if (coreDataError != nil) {
        NSLog(@"Error in managedObjectContext save: %@\r\n%@", coreDataError, coreDataError.userInfo);
    }
}
Run Code Online (Sandbox Code Playgroud)

这似乎工作,我的设置像他们应该坚持.我只是想确保我完全理解这是如何工作的.请不要回复说阅读Apple文档,我已经.我只是希望你们给我的作业评分:)

如果正确的话,我接下来的步骤就是围绕所有这些编写一个包装器,以便更方便.

谢谢!

Mar*_*rra 7

你没有抓住并处理错误.这对开发人员来说是非常不好的行为.每次看到传递错误指针的位置时,都应传递错误,然后检查错误情况是否发生.

即使你只是打印错误,NSLog()必须检查错误,否则你要求痛苦.

当您调用-executeFetchRequest:error:捕获错误时.如果返回nil则存在错误.打印出错误.

当您调用-save:捕获错误时.如果调用返回NO则存在错误.打印出错误.

如果我是一名教师,我会严厉谴责,因为这是一个等待咬你的隐藏问题.