无法在表格视图中加载核心数据?

Posted

技术标签:

【中文标题】无法在表格视图中加载核心数据?【英文标题】:Can not load core data in a table view? 【发布时间】:2013-10-05 14:47:02 【问题描述】:

我正在做一个卡拉 OK 项目。我想使用 NSManagedObjectModel 将我的数据加载到表视图中,但它不起作用

首先,我将所有歌曲加载到我的 KBDataInitializer.m 中,它运行良好。我可以将它们推到一个数组中。我也可以 NSlog 所有歌曲的名字。

@implementation KBDataInitializer

- (NSArray*) getAllSongs

    [self setupDataContext];
    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc ] initWithEntityName:@"KBSong"];
    NSError *fetchError;
    NSArray *songs = [self.dataContext executeFetchRequest:fetchRequest error:&fetchError];

    if (fetchError !=NULL)
        NSLog(@"fetch data ERROR");
    
      return songs;

但是,当我将每首歌曲加载到 HomeController 中的 tableview 时,它什么也不显示,当我尝试 NSlog 我的变量 *song 时,它显示一条消息(这意味着它们无法加载数据):

$3 = 0x0e483d90 <KBSong: 0xe483d90> (entity: KBSong; id: 0x818b630 <x-coredata://4BA983BA-1914-47C9-A22B-0373E84EAFC8/KBSong/p1> ; data: <fault>)

However in my viewDidLoad() I can load all songs.

我在 HomeController.h 中的代码

@interface KBHomeController : UIViewController<UITableViewDataSource,UITableViewDelegate>

    NSArray *songs;

@end

这是我在 HomeController.m 的表格视图中的加载代码

- (void)viewDidLoad

    [super viewDidLoad];
    // Do any additional setup after loading the view from its nib.
    KBDataInitializer *data = [[KBDataInitializer alloc]init];

    //Use for import updated new Songs
    //[data importData];

    songs = [data getAllSongs];

    // This one works fine
    for (KBSong *song in songs)
    
        NSLog(song.name);
    

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

    static NSString *simpleTableIdentifier = @"SimpleTableItem";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:simpleTableIdentifier];

    if (cell == nil) 
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:simpleTableIdentifier];
    

    KBSong *song = [songs objectAtIndex:indexPath.row];
    cell.textLabel.text = song.name;
    return cell;

这是我的 KBSong.h

@interface KBSong : NSManagedObject

@property (nonatomic, retain) NSNumber * code;
@property (nonatomic, retain) NSString * composer;
@property (nonatomic, retain) NSString * language;
@property (nonatomic, retain) NSString * lyric;
@property (nonatomic, retain) NSString * name;
@property (nonatomic, retain) NSNumber * volume;
@property (nonatomic, retain) NSNumber * favorite;

@end

【问题讨论】:

你能不能试试 NSString *tempString = song.name;然后 cell.textlabel.text = tempString;然后告诉我你是否仍然收到错误。如果这能解决你的问题,那么我会向你解释这个 我做到了,但结果还是一样 :(。我“po song”并显示“...data: ”。奇怪的是我的歌曲数组仍然有 1000对象,但我无法将每个对象推送到我的 *song 变量中。 KBSong 中的歌曲从何而来 *song = [songs objectAtIndex:indexPath.row]; 您能否将您的代码发送至 anurag.soni@psit.in,以便更好地了解您的工作流程 会不会是你的 managedObjectContext 被释放了。你是如何使用 managedObjectContext 的 【参考方案1】:

基本上你所有的内存管理都错了。

首先,分配一个对象并将其放入一个局部变量中,会使得该对象在方法结束后消失。 所以在你的结束之后

- (void)viewDidLoad

你的方法

KBDataInitializer *data = ...

再次超出范围。与它一起,

@property (strong, nonatomic) NSManagedObjectContext *dataContext;

没了。

第二,歌曲是

@interface KBSong : NSManagedObject

这使得它们依赖于它们的 NSManagedObjectContext。

这些是基础知识,解决当前问题的捷径是:

KBHomeController.h:

#import <UIKit/UIKit.h>

@class KBDataInitializer;

@interface KBHomeController : UIViewController<UITableViewDataSource,UITableViewDelegate>

    NSArray *songs;


@property (nonatomic, strong) KBDataInitializer *data;

@end

KBHomeController.m:

- (void)viewDidLoad

    [super viewDidLoad];
    // Do any additional setup after loading the view from its nib.
    self.data = [[KBDataInitializer alloc]init];

    //Use for import updated new Songs
    [self.data importData];

    songs = [self.data getAllSongs];

...

但这只会帮助您解决当前的问题。要了解您做错了什么,请阅读https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/MemoryMgmt/Articles/MemoryMgmt.html。和http://www.raywenderlich.com/2657/memory-management-tutorial-for-ios。和http://www.raywenderlich.com/5677/beginning-arc-in-ios-5-part-1。加上他们的跟进。 所有的。也试着去理解它。

另外请注意,我将使用NSFetchedResultsController 来完成该任务。

【讨论】:

感谢您的帮助 :)

以上是关于无法在表格视图中加载核心数据?的主要内容,如果未能解决你的问题,请参考以下文章

TabBar 项目 - 表格视图中的核心数据

无法在标签栏控制器中重新加载表格视图

核心数据:在表格视图中滚动时,存储在数组中的 NSManagedObjects 变为 nil

在 Swift 中删除表格视图的核心数据记录(行)

删除或插入核心数据后表视图未加载

如何从核心数据中获取数据并在表格视图中显示 iOS 6