-2

カラオケ企画やってます。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 のテーブルビューに各曲をロードすると何も表示されず、変数 *song を 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
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 に答える