0

属性としてempId、Name、deptIdを持つ「従業員」エンティティからデータを取得しようとしています。

// Used to Populate data in table
Employee : NSObject 

@property (nonatomic, retain) NSString *name;
@property int empId;
@property int deptId;

@synthesize empId, name, deptId;

&

CDEmployee : NSManagedObject 

@property (nonatomic, retain) NSString *name;
@property int empId;
@property int deptId;
- (void)convertMyData:(Employee *)emp;

@dynamic empId, name, deptId;

- (void)convertMyData:(Employee *)emp
{
self.empId = emp.empId;
self.name = emp.name;
self.deptId = emp.deptId;
}


// My code to fetch & convert data retured from db to Employee class
-(NSArray *)getAllEmployees:(NSManagedObjectContext*)context
{
        NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(empId > %@)",[NSNumber numberWithInt:-1],[NSNumber numberWithInt:1]];
        NSFetchRequest* req = [self createRequest:context]; // Request is correct
        [req setPredicate:predicate];
        NSFetchedResultsController* fetchContr = [[NSFetchedResultsController alloc] initWithFetchRequest:req managedObjectContext:context sectionNameKeyPath:nil cacheName:nil];

        NSError* error = nil;
        [fetchContr performFetch:&error];

        NSArray *fetchedObjects = [fetchContr fetchedObjects];
        NSMutableArray *result = [[[NSMutableArray alloc] init] autorelease];

        for(int i = 0; i < [fetchedObjects count]; i++)
        {
            CDEmployee *cdEmp = [[fetchedObjects objectAtIndex:i] retain]; // just tried retaing

            if (cdEmp)
            {
                Employee *emp = [[Employee alloc] init];

                NSLog(@"Employee - %@", emp); // Shows tht is has object
                [cdEmp convertMyData:emp]; //-----> Crashing here

                [result addObject:emp];
                [emp release];
            }
        }
        [fetchContr release];
        return result;
}

コア データから結果を取得していますが、正しい結果が返されますが、コア データの結果をEmployee(NSObject)クラスに変換すると、[NSManagedObject convertMyData:]:認識されないセレクターがインスタンスに送信されます。

クラスに別のメソッドを追加してみ-(void)helloWorldましたが、同じクラッシュが発生しました。CDEmployee[cdEmp helloWorld];

問題を引き起こしている理由がわからない。メソッドを定義して適切な場所に実装しましたが、コンパイル時に警告さえ出ません。

4

3 に答える 3

0

別の方法で試して解決しましたhttp://www.raywenderlich.com/934/core-data-tutorial-for-ios-getting-started

于 2013-10-31T07:11:51.430 に答える
0

NSManagedObjectに変換するサンプルコードを次に示しますNSDictionary

NSDictionaryよりもデータの処理と操作がさらに簡単ですNSObject。他の同様の iOS ユーティリティ クラス メソッドについては、このGit ライブラリも参照してください。

+(NSDictionary *)convertManagedObjectToDictionary:(NSManagedObject *)managedObject{

    if (!managedObject){
        NSLog(@"Managed object is nil");
        return nil;
    }
    else{

        unsigned int objectsCount;
        objc_property_t *objectProperties = class_copyPropertyList([managedObject class], &objectsCount);

        NSMutableDictionary *dictionary = [[NSMutableDictionary alloc] init];
        for(int i = 0; i < objectsCount; i++) {
            objc_property_t property = objectProperties[i];
            NSString *name = [NSString stringWithCString:property_getName(property) encoding:NSUTF8StringEncoding];
            id object = [managedObject valueForKey:name];
            [dictionary setObject:((object == nil) ? [NSNull null] : object) forKey:name];
        }
        free(objectProperties);
        return dictionary;
    }
}
于 2013-10-30T08:25:56.247 に答える
-1

まず、非技術的な観点から何を達成したいのかを最初に考える必要があります。実際、それは何ですか?

2 つ目NSManagedObjectは、 のサブクラスです。NSObjectつまり、すでにNSObject. おめでとうございます。

また、コードで呼び出しますfetchMyDataが、それを定義する場所やコードがどのように見えるかを示しませんでした。たぶん、ここでNSManagedObject カテゴリが整うでしょうか?しかし、それでも、なぜこれをやりたいのかという疑問が生じます。NSDictionary他の回答で提案されているように、Foundationオブジェクトに変換したとしても、関係のモデリングにはまだ問題があります...

最後に、どの SDK を使用していますか? まだ ARC を使用していない場合は、深刻になることはできません。

于 2013-10-30T09:28:13.233 に答える