核心数据,第一次运行不会在 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 中显示数据,第二次运行正常的主要内容,如果未能解决你的问题,请参考以下文章

UITableView 重新排序核心数据结果

UITableView 核心数据重新排序(下)

UITableView 中核心数据对象的多个副本

iCloud 同步后 UITableView 不会重新加载(Swift 2)

添加新项目后 UITableView 未更新(使用核心数据)

嵌入在 UIStackView 中的 UITableView 不会重新加载数据