【问题标题】:Data is not being stored in core data database数据未存储在核心数据数据库中
【发布时间】:2014-03-28 06:47:00
【问题描述】:
NSArray  *theArray = [[notification userInfo] objectForKey:@"myArray"];
for (NSDictionary * dict in theArray) {

    CustomerOrder * newEntry = [NSEntityDescription insertNewObjectForEntityForName:@"CustomerOrder"
                                                             inManagedObjectContext:self.managedObjectContext];

    [newEntry setValue:[dict objectForKey:@"customer_id"] forKey:@"customer_id"];
    [newEntry setValue:[dict objectForKey:@"ExecutedOrderCount"] forKey:@"executedOrderCount"];
    [newEntry setValue:[dict objectForKey:@"order_id"] forKey:@"order_id"];
    [newEntry setValue:[dict objectForKey:@"outletLatitude"] forKey:@"outletLatitude"];
    [newEntry setValue:[dict objectForKey:@"outletLongitude"] forKey:@"outletLongitude"];
    [newEntry setValue:[dict objectForKey:@"trigger_days"] forKey:@"trigger_days"];

    [newEntry setValue:[dict objectForKey:@"trigger_end_date"] forKey:@"trigger_end_date"];
    [newEntry setValue:[dict objectForKey:@"trigger_from_time"] forKey:@"trigger_from_time"];
    [newEntry setValue:[dict objectForKey:@"trigger_no_days"] forKey:@"trigger_no_days"];

    [newEntry setValue:[dict objectForKey:@"trigger_radius"] forKey:@"trigger_radius"];
    [newEntry setValue:[dict objectForKey:@"trigger_start_date"] forKey:@"trigger_start_date"];
    [newEntry setValue:[dict objectForKey:@"trigger_to_time"] forKey:@"trigger_to_time"];

    NSLog(@"Log %@", newEntry);

    [SharedAppDelegate saveContext];
}

【问题讨论】:

  • 我推荐你使用 newEntry[@"trigger_radius"] = dict[@"trigger_radius"]。它使您的代码更具可读性。此外,展示你如何保存上下文,并展示你如何知道它没有保存(即展示你的获取代码)。
  • 我已将 [sharedAppDelegate savecontext] 更改为 [newEntry.managedObjectContext save:&err] NSLog(@"error: %@", err.localizedDescription);我已经完成了。我不知道如何获取。我在 sqllite 浏览器中手动检查,显示没有找到表。请提供一些帮助。
  • newEntry 可能为零吗?您的日志语句的输出是什么?您还可以显示获取代码吗?你检查了 save: 方法返回的 BOOL 吗?
  • (实体: CustomerOrder; id: 0x91f0b10 ; 数据: { "customer_id" = 6 ; 执行订单计数 = 0; "order_id" = 93; outletLatitude = "30.8865366"; outletLongitude = "75.8388698"; "trigger_days" = 3; "trigger_end_date" = "2014-04-30T00:00:00"; "trigger_from_time" = " 19:30:00"; "trigger_no_days" = 0; "trigger_radius" = 416; "trigger_start_date" = "2014-03-27T00:00:00"; "trigger_to_time" = "07:30:00"; }) 错误: (null)
  • 这段代码:"NSLog(@"error: %@", err.localizedDescription);"应该只打印出一个错误(如果不存在,则为“null”),但你会显示我怀疑它的输出 NSLog(@"%@", newEntry)。这向您展示了一个新的 NSManagedObject 已创建。对于调试,我建议您替换“[SharedAppDelegate saveContext];” with "NSError * error = nil; if ([newEntry.managedObjectContext save: &error] == NO){NSLog(@"CANNOT SAVE: %@", error); else {NSLog(@"SUCCES, 去检查sqlite文件")}

标签: ios iphone ios7 ios6


【解决方案1】:

只是使用

NSEntityDescription *entityDesc=[NSEntityDescription entityForName:@"CustomerOrder" inManagedObjectContext:self.managedObjectContext];
NSFetchRequest *request=[[NSFetchRequest alloc]init];
[request setEntity:entityDesc];
NSManagedObject * newEntry =[[NSManagedObject alloc]initWithEntity:entityDesc insertIntoManagedObjectContext:self.managedObjectContext];
    ....


NSError *error;                
[self.managedObjectContext save:&error];

希望这会有所帮助..

【讨论】:

    【解决方案2】:

    试试这个代码

    NSArray  *theArray = [[notification userInfo] objectForKey:@"myArray"];
     for (NSDictionary * dict in theArray) {
    
    //TypeCast here
    
    CustomerOrder* newEntry = (CustomerOrder *)[NSEntityDescription insertNewObjectForEntityForName:@"CustomerOrder"
                                                             inManagedObjectContext:self.managedObjectContext];
    
    [newEntry setValue:[dict objectForKey:@"customer_id"] forKey:@"customer_id"];
    [newEntry setValue:[dict objectForKey:@"ExecutedOrderCount"] forKey:@"executedOrderCount"];
    [newEntry setValue:[dict objectForKey:@"order_id"] forKey:@"order_id"];
    [newEntry setValue:[dict objectForKey:@"outletLatitude"] forKey:@"outletLatitude"];
    [newEntry setValue:[dict objectForKey:@"outletLongitude"] forKey:@"outletLongitude"];
    [newEntry setValue:[dict objectForKey:@"trigger_days"] forKey:@"trigger_days"];
    
    [newEntry setValue:[dict objectForKey:@"trigger_end_date"] forKey:@"trigger_end_date"];
    [newEntry setValue:[dict objectForKey:@"trigger_from_time"] forKey:@"trigger_from_time"];
    [newEntry setValue:[dict objectForKey:@"trigger_no_days"] forKey:@"trigger_no_days"];
    
    [newEntry setValue:[dict objectForKey:@"trigger_radius"] forKey:@"trigger_radius"];
    [newEntry setValue:[dict objectForKey:@"trigger_start_date"] forKey:@"trigger_start_date"];
    [newEntry setValue:[dict objectForKey:@"trigger_to_time"] forKey:@"trigger_to_time"];
    
    NSLog(@"Log %@", newEntry);
    
    //Save all  
    NSError *error = nil;
    if (![self.managedObjectContext save:&error]) {
    // Handle Error
          NSLog(@"Save Error: %@, %@", error, [error userInfo]);
      return NO;
      }
    

    }

    【讨论】:

      【解决方案3】:

      您在self.managedObjectContext 中创建实体,但用于保存调用[SharedAppDelegate saveContext];

      你能试试在NSLog后面加上这段代码吗

      NSError * err = nil;
      [newEntry.managedObjectContext save:&err];
      
      NSLog(@"error: %@", err.localizedDescription);
      

      循环调用后保存在父上下文中

      __weak typeof (self) weakSelf;
      [self.managedObjectContext.parentContext performBlock:^(){ [weakSelf.managedObjectContext.parentContext save:NULL] }];
      

      【讨论】:

      • 错误为空。但在数据库中,如果我检查没有创建的表,它会显示。
      • 这是我的文件路径,我在 sqllite 浏览器中打开它。 ///Users/vishnuemani/Library/Application%20Support/iPhone%20Simulator/7.1/Applications/4BC11011-F80F-41C7-870A-99F3666E678F/Documents/CoreData.sqlite
      • @user3420042 更新了答案,想法是在父上下文中调用保存
      • 这是做什么的 __weak typeof (self) weakSelf; [self.managedObjectContext.parentContext performBlock:^(){ [weakSelf.managedObjectContext.parentContext save:NULL] }];
      • 仅在 CoreData 中 root 上下文将更改写入持久存储(文件),所有嵌套上下文都提交更改。这段代码我添加了调用 save: 在父上下文中,但是使用了 performBlock,因为我们不应该从不同的线程访问上下文
      猜你喜欢
      • 1970-01-01
      • 2016-05-03
      • 1970-01-01
      • 1970-01-01
      • 2016-07-26
      • 1970-01-01
      • 1970-01-01
      • 2013-09-24
      • 1970-01-01
      相关资源
      最近更新 更多