核心数据,第一次运行不会在 uitableview 中显示数据,第二次运行正常
Posted
技术标签:
【中文标题】核心数据,第一次运行不会在 uitableview 中显示数据,第二次运行正常【英文标题】:Core Data, on first run won't display data in uitableview, 2nd run ok 【发布时间】:2014-01-21 23:39:32 【问题描述】:我想用 plist 文件中的数据将 UITableView 填充到核心数据中
这样我就可以很容易地在以后的版本中更新 uitableview,然后我只需要在 plist 生命中进行更改,其余的由核心数据处理。请告诉我是否有更好的方法...
无论如何,我在这里做的事情都不能正常工作,在第一次运行时它会填充核心数据但 UITableView 是空的,然后如果你完全关闭应用程序,也可以从多任务栏的东西启动它再次启动它现在显示带有数据的 uitableview
在我的应用 delegate.h 我有:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
if ( ![userDefaults valueForKey:@"version"] )
[self value1];
[self value2];
[self value3];
[self value4];
[self value5];
[self value6];
NSLog(@"running code");
[[NSManagedObjectContext MR_defaultContext] MR_saveToPersistentStoreAndWait];
// Adding version number to NSUserDefaults for first version:
[userDefaults setFloat:[[[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleVersion"] floatValue] forKey:@"version"];
if ([[NSUserDefaults standardUserDefaults] floatForKey:@"version"] == [[[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleVersion"] floatValue] )
/// Same Version so dont run the function
else
[Hovedmenu MR_truncateAll];
[BarneDaab MR_truncateAll];
[Graviditeten MR_truncateAll];
[MineSygedomme MR_truncateAll];
[Fortalt MR_truncateAll];
[Familien MR_truncateAll];
[self value2];
[self value3];
[self value4];
[self value5];
[self value6];
[self value1];
[[NSManagedObjectContext MR_defaultContext] MR_saveToPersistentStoreAndWait];
NSLog(@"running code agian");
// Update version number to NSUserDefaults for other versions:
[userDefaults setFloat:[[[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleVersion"] floatValue] forKey:@"version"];
和 value1 2 3 4 5 6 几乎都相同,但来自不同的 plist,这里是示例
-(void)value1
NSManagedObjectModel *mom = [self managedObjectModel];
NSDictionary *attrs = [[[mom entitiesByName] objectForKey:@"Hovedmenu"] attributesByName];
NSArray *keyedValues = [[NSArray alloc] initWithContentsOfFile:
[[NSBundle mainBundle] pathForResource:@"hovedMenu" ofType:@"plist"]
];
for( NSDictionary *keyedValueDict in keyedValues )
NSManagedObject *mObj = [NSEntityDescription insertNewObjectForEntityForName:@"Hovedmenu" inManagedObjectContext:[self managedObjectContext]];
for (NSString *attribute in attrs)
id value = [keyedValueDict objectForKey:attribute];
if (value == nil)
// Don't attempt to set nil, or you'll overwite values in self that aren't present in keyedValues
continue;
NSAttributeType attributeType = [[attrs objectForKey:attribute] attributeType];
if ((attributeType == NSStringAttributeType) && ([value isKindOfClass:[NSNumber class]]))
value = [value stringValue];
else if (((attributeType == NSInteger16AttributeType) || (attributeType == NSInteger32AttributeType) || (attributeType == NSInteger64AttributeType) || (attributeType == NSBooleanAttributeType)) && ([value isKindOfClass:[NSString class]]))
value = [NSNumber numberWithInteger:[value integerValue]];
else if ((attributeType == NSFloatAttributeType) && ([value isKindOfClass:[NSString class]]))
value = [NSNumber numberWithDouble:[value doubleValue]];
[mObj setValue:value forKey:attribute];
NSLog(@"Value %@ for Key %@", value, attribute);
NSError *error;
[[self managedObjectContext] save:&error];
在我的 viewcontroller.h 中
-(void)viewWillAppear:(BOOL)animated
[self.mainTableView reloadData];
[super viewWillAppear:animated];
NSError *error = nil;
if (![[self fetchedResultsController] performFetch:&error])
// Update to handle the error appropriately.
NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
exit(-1); // Fail
- (NSFetchedResultsController *)fetchedResultsController
if (_fetchedResultsController != nil)
return _fetchedResultsController;
_fetchedResultsController = [Hovedmenu fetchAllGroupedBy:nil withPredicate:nil sortedBy:@"numberRow" ascending:YES delegate:self];
return _fetchedResultsController;
我也在使用 MagicalRecord
【问题讨论】:
【参考方案1】:最有可能的是,从我从您的代码中可以看出,您用于获取 value1、value2 等值的上下文与 MagicalRecord 为您创建的上下文不同。如果您更改该上下文以使用 MR_defaultContext,则可能会正确更新所有内容。
【讨论】:
[NSManagedObjectContext(MagicalSaves) MR_saveWithOptions:completion:](0x8c944e0) **默认**上下文没有变化 - 不保存 让它工作。只是尽可能地改变了你所说的,现在它的探测器更新了以上是关于核心数据,第一次运行不会在 uitableview 中显示数据,第二次运行正常的主要内容,如果未能解决你的问题,请参考以下文章
iCloud 同步后 UITableView 不会重新加载(Swift 2)