失去我的思想因为获取核心数据总是返回错误

时间:2012-11-25 08:45:15

标签: ios core-data magicalrecord

好的,直截了当......

这是我第一次使用魔法熊猫的神奇记录 我跟随http://yannickloriot.com/2012/03/magicalrecord-how-to-make-programming-with-core-data-pleasant/

关注了tutroial

这是我的代码

Person.h

@property (nonatomic, retain) NSString * firstname;
@property (nonatomic, retain) NSString * lastname;
@property (nonatomic, retain) NSNumber * age;

AppDelegate.M

@implementation AppDelegate

- (void)dealloc
{
    [_window release];
    [_viewController release];
    [super dealloc];
}

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
     [MagicalRecord setupCoreDataStackWithStoreNamed:@"MyDatabase.sqlite"];
    self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease];
    // Override point for customization after application launch.
    self.viewController = [[JASidePanelController alloc] init];
    self.viewController.shouldDelegateAutorotateToVisiblePanel = NO;
  //  self.viewController = [[[ViewControllerCenter alloc] initWithNibName:@"ViewController" bundle:nil] autorelease];
    self.viewController.centerPanel = [[UINavigationController alloc] initWithRootViewController:[[ViewControllerCenter alloc] init]];

    //UINavigationController *navContorller=[[UINavigationController alloc] initWithRootViewController:self.viewController];
    self.viewController.rightPanel = [[NetraRightWindow alloc] init];
    self.window.rootViewController = self.viewController;
    [self.window makeKeyAndVisible];

    return YES;
}

- (void)applicationWillResignActive:(UIApplication *)application
{
    // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state.
    // Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game.
}

- (void)applicationDidEnterBackground:(UIApplication *)application
{


    // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later. 
    // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits.
}

- (void)applicationWillEnterForeground:(UIApplication *)application
{
    // Called as part of the transition from the background to the inactive state; here you can undo many of the changes made on entering the background.
}

- (void)applicationDidBecomeActive:(UIApplication *)application
{

}

- (void)applicationWillTerminate:(UIApplication *)application
{
     [MagicalRecord cleanUp];
    // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:.
}

@end

这是我保存的方法:

-(void)fetchRecords{

   NSManagedObjectContext *localContext= [NSManagedObjectContext MR_defaultContext];

    // Create a new Person in the current thread context
    Person *person                          = [Person MR_createInContext:    [NSManagedObjectContext MR_defaultContext]];
    person.firstname                        = @"Test";
    person.lastname                         = @"merdeka123";
    person.age=[NSNumber numberWithInt:123];

    [[NSManagedObjectContext MR_defaultContext] MR_save];
    NSArray *Result=[Person MR_findAll];

    NSLog(@"Result==%@",Result);

和结果::

2012-11-25 15:43:38.033 Trip[10491:15e03] Cok==(
    "<Person: 0x866fe40> (entity: Person; id: 0x866e170 <x-coredata://15583C03-3EB4-479B-9EF2-B0BC750FC987/Person/p1> ; data: <fault>)",
    "<Person: 0x866fe80> (entity: Person; id: 0x8670210 <x-coredata://15583C03-3EB4-479B-9EF2-B0BC750FC987/Person/p2> ; data: <fault>)",
    "<Person: 0x81471a0> (entity: Person; id: 0x815c2a0 <x-coredata://15583C03-3EB4-479B-9EF2-B0BC750FC987/Person/p3> ; data: {\n    age = 123;\n    firstname = Test;\n    lastname = merdeka123;\n    time = nil;\n})"
)

为什么它总是数据错误?这是一个神奇记录中的问题吗?或者我的代码有什么问题吗?

2 个答案:

答案 0 :(得分:7)

这不是一个错误 - 它是Core Data的一个功能,称为“错误的”&#39;。这是Apple's description

  

Faulting可减少应用程序消耗的内存量。一个   fault是占位符对象,表示托管对象   还没有完全实现,或者是一个集合对象   代表一种关系:

     

托管对象错误是相应类的实例,但是   它的持久变量尚未初始化。关系错误   是集合类的子类,表示   关系。错误允许核心数据在边界上设置边界   对象图。由于未实现故障,因此管理对象发生故障   消耗较少的内存,而不是与故障相关的管理对象   需要在记忆中表现出来。

如果您想查看每个Person对象,则必须专门访问它们。

答案 1 :(得分:1)

我也一直在魔法记录中出错。经过大量的轰动。

[[NSManagedObjectContext defaultContext] saveToPersistentStoreWithCompletion:^(BOOL success, NSError *error) {

if (!success) {

NSLog(@"::: Error saving context :::");

}

}];

现在,当你找到所有。通过在调试器中打印来检查对象。

Person *testObject = [Result objectAtIndex:0];
NSLog(@"%@", testObject.firstname);

这应该在调试器中打印您的结果。