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

时间:2013-10-05 14:47:03

标签: ios objective-c core-data tableview

我正在做卡拉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我的变量*歌曲时,它会显示一条消息(这意味着它们无法加载数据):

$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

1 个答案:

答案 0 :(得分: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执行该任务。