在属性上进行核心数据迁移时,从NSDate转换为NSString不适当地显示string

对于长期的问题,我感到抱歉。 我不知道如何解释这个没有包含大量的代码和图像。

我正在更新我的应用程序,因为我发现与date有关的问题,我不得不将属性从NSDate更改为NSString 。 我正在使用核心数据为我的应用程序。

应用程序的模型是:

交易实体

date实体

年实体

Year实体有一个名为yearOfEvent的NSDatetypes的属性,并且更新到我的应用程序(已经在应用程序商店中),我将yearOfEvent更改为NSString

一些研究和对另一个问题的答案告诉我,我必须自己做这个迁移。

这主要是工作,但还没有完成。

我的应用程序是一个双选项卡UITabBarController其中两个选项卡都是UITableViewControllers 。 首先是时间顺序条目的“时间线”。 第二个标签应该只显示已经input的年份; 所以如果用户使用2014,2013和2012的条目,则可以在“date”选项卡的单元格中看到这些条目,并且在点击该单元格时,会向您显示当年的条目。 这就是我想在这里改变的。 该应用程序由用户填充一些信息添加到UITextFields并从UIDatePicker中获取保存到Core-Data ,然后使用NSFetchedResultsController更新表。

问题

现在,当我从App Store中运行带有数据的应用程序,然后使用自定义迁移迁移到新版本的应用程序时,时间轴没有问题,但dateTableViewController的单元格的标签显示空白年。 单元格的数量是正确的,但是年份是空白的。

我在这个问题中遵循了被接受的答案: 多个通行证的核心数据迁移的例子或说明? 与代码的第一位,但我不知道在哪里把第二部分(代码的最后一部分)。

所以在我的Model类中,我有:

 - (BOOL)createDestinationInstancesForSourceInstance:(NSManagedObject *)sInstance entityMapping:(NSEntityMapping *)mapping manager:(NSMigrationManager *)manager error:(NSError **)error { // Create a new object for the model context NSManagedObject *newObject = [NSEntityDescription insertNewObjectForEntityForName:[mapping destinationEntityName] inManagedObjectContext:[manager destinationContext]]; // do our transfer of nsdate to nsstring NSDate *date = self.transaction.dates.dateOfEvent; //NSDate *date = [sInstance valueForKey:@"timeStamp"]; NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; [dateFormatter setDateFormat:@"y"]; //NSString *stringFromYear = [formatter stringFromDate:trans.years.yearOfEvent]; // set the value for our new object [newObject setValue:[dateFormatter stringFromDate:date] forKey:@"yearOfEvent"]; // do the coupling of old and new [manager associateSourceInstance:sInstance withDestinationInstance:newObject forEntityMapping:mapping]; return YES; } 

所以在我的情况下,我从Date实体中提取“年”,因为yearOfEvent现在是一个string。

另外,我也不知道应该在接受的答案中放置剩下的代码。

为了清楚起见,这里是我设置date的NSFetchedResultsController:

 - (NSFetchedResultsController *)fetchedResultsController { NSManagedObjectContext *managedObjectContext = [self managedObjectContext]; if (_fetchedResultsController != nil) { return _fetchedResultsController; } NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; NSEntityDescription *entity = [NSEntityDescription entityForName:@"Years" inManagedObjectContext:managedObjectContext]; fetchRequest.entity = entity; NSPredicate *d = [NSPredicate predicateWithFormat:@"transactions.years.@count !=0"]; [fetchRequest setPredicate:d]; NSSortDescriptor *sort = [[NSSortDescriptor alloc] initWithKey:@"yearOfEvent" ascending:NO]; fetchRequest.sortDescriptors = [NSArray arrayWithObject:sort]; fetchRequest.fetchBatchSize = 20; NSFetchedResultsController *theFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:managedObjectContext sectionNameKeyPath:nil cacheName:nil]; self.fetchedResultsController = theFetchedResultsController; _fetchedResultsController.delegate = self; return _fetchedResultsController; } - (void)configureCell:(UITableViewCell *)cell atIndexPath:(NSIndexPath *)indexPath { EnvylopeDatesTableViewCell *customCell = (EnvylopeDatesTableViewCell *)cell; Years *years = [self.fetchedResultsController objectAtIndexPath:indexPath]; NSString *stringFromDate = years.yearOfEvent; customCell.datesLabel.text = stringFromDate; customCell.datesLabel.textColor = [UIColor whiteColor]; UIView *customColorView = [[UIView alloc] init]; customColorView.backgroundColor = [UIColor darkGrayColor]; customCell.selectedBackgroundView = customColorView; } 

在MappingModel中,我保留了YearstoYears实体的默认值expression式,并确保将Custom Policy设置为我创build的Model类(Model.h / m)。

在这里输入图像说明

任何指导,将非常感激。

– 我有一个date和年份选项卡的原因是格式化整个应用程序。 我敢肯定,我可能只是有一个date,然后提取“年”到NSString。 我会做到这一点,但现在,我只是想让迁移工作适当。

  • 重申,问题是,如果我正在运行应用程序的旧版本,并且我迁移到这个新build版本,date选项卡不正确设置年,并且单元格为一年的空白。

我之前没有进行过重量级的迁移,而更喜欢使用轻量级迁移。 我祝贺你解决这个详细的过程。

从Marcus S. Zarra撰写的实用书架 – “核心数据,第二版,iOS,OS X和iCloud的数据存储和pipe理”(2013年1月) ,特别是第三章“版本和迁移”

关于你对这个SO问题的答案的代码的最后部分的位置的问题… 多个通行证的核心数据迁移的例子或解释? 我怀疑这个答案的代码的最后一部分应该放在你需要添加你的持久化存储(在你的NSPersistentStore传递URL)(在这个例子中是NSURL *destinationStoreURL )到你的NSPersistentStoreCoordinator 。 也就是说,在核心数据堆栈中的代码行看起来类似于这个…

 NSPersistentStore *persistentStore = [self.persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:destinationStoreURL options:options]; 

现在到你的问题 –

“date”选项卡不会更正(设置)年份,单元格在一年中为空白

我有两个问题

你的NSFetchResultsController运行后,你能够logging( NSLog )的fetchedObjects的值来检查你是否实际上从你的fetchedObjects接收任何数据? 这可能是数据转换不成功,你的FRC返回nil ? 例如:

 NSLog(@"fetched objects are: %@", self.fetchResultsController.fetchedObjects); 

另外,在你的configureCell:方法中,你能够logging你的本地variablesNSString * stringFromDate吗?

让我知道你是如何去…是否从NSFetchedResultsController接收数据,以及是否成功传递给configureCell方法。

一旦我们知道了我的问题的答案,我希望能帮助你找出一个解决scheme。

这是答案@AndrewBuilder的答案。

我很感谢你的回答,并对迟交的回复表示歉意。 进行定制迁移是非常可怕的方法,特别是因为我对开发还很陌生。 不过,除了我的问题中的代码之外,我还是设法用一行代码来修复它。

当我回到我提到的答案时,我注意到在转换之前他有一行valueForKey,所以我只是这样做了:

 - (BOOL)createDestinationInstancesForSourceInstance:(NSManagedObject *)sInstance entityMapping:(NSEntityMapping *)mapping manager:(NSMigrationManager *)manager error:(NSError **)error { // Create a new object for the model context NSManagedObject *newObject = [NSEntityDescription insertNewObjectForEntityForName:[mapping destinationEntityName] inManagedObjectContext:[manager destinationContext]]; // do our transfer of nsdate to nsstring NSDate *date = [sInstance valueForKey:@"yearOfEvent"]; //NSDate *date = [sInstance valueForKey:@"timeStamp"]; NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; [dateFormatter setDateFormat:@"y"]; //NSString *stringFromYear = [formatter stringFromDate:trans.years.yearOfEvent]; // set the value for our new object [newObject setValue:[dateFormatter stringFromDate:date] forKey:@"yearOfEvent"]; // do the coupling of old and new [manager associateSourceInstance:sInstance withDestinationInstance:newObject forEntityMapping:mapping]; return YES; } 

在我的情况下,关键是yearOfEvent。

令人担忧,或有趣的是,这只是我必须做的,以实现这个工作。 当我使用yearOfEvent NSDate *date = [sInstance valueForKey:@"yearOfEvent"]; 它开始工作了。

我对我的方法持怀疑态度,因为我实际上并没有将其余的代码放在我的代码的任何地方,但是从1.0版本到1.2.0,1.1.1到1.2.0和1.0到1.1版本的迁移工作。 1至1.2.0。

我将不得不弄清楚这里发生了什么事情!