我正在做卡拉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
答案 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执行该任务。