无法在表格视图中加载核心数据?
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:基本上你所有的内存管理都错了。
首先,分配一个对象并将其放入一个局部变量中,会使得该对象在方法结束后消失。 所以在你的结束之后
- (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 来完成该任务。
【讨论】:
感谢您的帮助 :)以上是关于无法在表格视图中加载核心数据?的主要内容,如果未能解决你的问题,请参考以下文章