神秘的核心数据行为在第二次获取时检索空对象

Posted

技术标签:

【中文标题】神秘的核心数据行为在第二次获取时检索空对象【英文标题】:Mysterious core data behavior retrieves empty objects on second fetch 【发布时间】:2013-02-01 23:46:01 【问题描述】:

我正在尝试将 Core Data 中的对象列表显示到 UITableViewController 中。这是这个 UITableViewController 的 viewWillAppear:

- (void)viewWillAppear:(BOOL)animated
    [super viewWillAppear:animated];

    self.landmarks = [[TSDataManager sharedInstance] fetchArrayFromDBWithEntity:@"Landmark" forKey:nil withPredicate:nil];
    [self.tableView reloadData];

这里是 fetchArrayFromDBWithEntity:forKey:withPredicate: 实现:

- (NSMutableArray*)fetchArrayFromDBWithEntity:(NSString*)entityName forKey:(NSString*)keyName withPredicate:(NSPredicate*)predicate 
    NSFetchRequest *request = [[NSFetchRequest alloc] init];
    NSEntityDescription *entity = [NSEntityDescription entityForName:entityName inManagedObjectContext:self.managedObjectContext];
    [request setEntity:entity];

    if(keyName != nil)
        NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:keyName ascending:NO];
        NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil];
        [request setSortDescriptors:sortDescriptors];
    

    if (predicate != nil)
        [request setPredicate:predicate];
    

    NSError *error = nil;
    NSMutableArray *mutableFetchResults = [[self.managedObjectContext executeFetchRequest:request error:&error] mutableCopy];
    if (mutableFetchResults == nil) 
        NSLog(@"%@", error);
    
    return mutableFetchResults;

当表格第一次出现时,一切都正确显示,我有 4 个从数据库返回的对象,其标题在每个单元格中正确显示。

但是每当我转到另一个视图并返回时,表格有四个对象还可以,但是它们的“title”属性的值为nil!

这是我的 Landmark 类的代码:

@interface Landmark : NSManagedObject
@property (nonatomic, strong) NSString * title;
@end

@implementation Landmark
@dynamic title;
@end

这是我的表格单元格的构造方式,以防它来自那里:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
    static NSString *CellIdentifier = @"LandmarkCell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];

    Landmark *landmark = (Landmark *) self.landmarks[(NSUInteger) indexPath.row];
    cell.textLabel.text = landmark.title;

    return cell;

显然我在这里做错了什么,但我真的不知道是什么。

【问题讨论】:

您是否绝对肯定该属性正在为其属性使用动态?由于使用合成而不是动态,我不久前遇到了同样的问题。 【参考方案1】:

原来问题出在我将 Core Data 实现为单例。我用 NLCoreData (https://github.com/jksk/NLCoreData) 替换了它,现在一切正常。

【讨论】:

您绝对应该查看 NSFetchedResultsController。看来您使用的是 Core Data,而不是它的预期用途。您执行的每一次“手动”获取都是错误使用 Core Data 的标志。

以上是关于神秘的核心数据行为在第二次获取时检索空对象的主要内容,如果未能解决你的问题,请参考以下文章

尝试在.net核心中绑定下拉列表时在ajax jquery中获取空对象列表

在获取当前纬度和经度时获取空对象引用 [重复]

Sequelize 普通对象返回空 - 花括号行为不端

IOS - 第二次单击相同按钮时,WKWebview 在决定策略中获取空 url

应用程序在第二次选择同一行时崩溃

Json 空数据行为异常