-2

我正在做一个卡拉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
4

1 回答 1

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 。

于 2013-10-07T08:34:03.910 回答