2013-10-23 20 views
1

所以我用魔法記錄在我的項目,而我試圖做以下屬性:添加到創建實體使用神奇的記錄

- (void)persistNewReadingWithOneA:(NSString *)oneA oneB:(NSString *)oneB{ 

    NSManagedObjectContext *localContext = [NSManagedObjectContext MR_contextForCurrentThread]; 

    FinalRead *reading1A = [FinalRead MR_createInContext:localContext]; 

    reading1A.a1 = oneA; 
    reading1A.b1 = oneB; 


    [localContext MR_saveOnlySelfAndWait]; 


} 

正如你可以看到我已經有新的條目和堅持現在我需要通過添加屬性來更新相同的條目。我試着做以下事情:

- (void)updateReadingWithTwoA:(NSString *)twoA twoB:(NSString *)twoB{ 

    NSManagedObjectContext *localContext = [NSManagedObjectContext MR_contextForCurrentThread]; 

    FinalRead *reading2A = [FinalRead MR_createInContext:localContext]; 

    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"firstname ==[c] %@ AND lastname ==[c] %@"]; 
    FinalRead *finalRead = [FinalRead MR_findFirstWithPredicate:predicate inContext:localContext]; 

    reading2A.a2 = twoA; 
    reading2A.b2 = twoB; 


    [localContext MR_saveOnlySelfAndWait]; 


} 

任何想法?

編輯:

我從像這樣的JSON響應獲取數據:

- (void)fetchedData:(NSData *)responseData { 

    if (self.buttonPressed){ 

     //parse out the json data 
     NSError* error; 
     NSArray* json = [NSJSONSerialization 
           JSONObjectWithData:responseData 

           options:kNilOptions 
           error:&error]; 

     NSString *string = [NSString stringWithFormat:@"%@", [json objectAtIndex:0]]; 

     [self persistNewReadingWithOneA:string 
            oneB:nil]; 


    }else{ 

     //parse out the json data 
     NSError* error; 
     NSArray* json = [NSJSONSerialization 
           JSONObjectWithData:responseData 

           options:kNilOptions 
           error:&error]; 

     NSString *string = [NSString stringWithFormat:@"%@", [json objectAtIndex:0]]; 

     [self persistNewReadingWithOneA:nil 
            oneB:string]; 



    } 

} 

,然後存儲到新創建的對象,像這樣:

- (void)persistNewReadingWithOneA:(NSString *)oneA oneB:(NSString *)oneB{ 

    NSManagedObjectContext *localContext = [NSManagedObjectContext MR_contextForCurrentThread]; 

    FinalRead *reading1A = [FinalRead MR_createInContext:localContext]; 

    reading1A.a1 = oneA; 
    reading1A.b1 = oneB; 


    [localContext MR_saveOnlySelfAndWait]; 


} 

的視圖控制器然後推動到另一個提出另一個問題的地方,即再次解析和存儲更多的JSON,而是放入剛剛在前一個ViewController中創建的SAME對象。我有每個對象的下列屬性在NSManagedObject:

@interface FinalRead : NSManagedObject 

@property (nonatomic, retain) NSString *a1; 
@property (nonatomic, retain) NSString *b1; 
@property (nonatomic, retain) NSString *a2; 
@property (nonatomic, retain) NSString *b2; 
@property (nonatomic, retain) NSString *a3; 
@property (nonatomic, retain) NSString *b3; 
@property (nonatomic, retain) NSString *a4; 
@property (nonatomic, retain) NSString *b4; 

@end 

所以基本上,每次我換一個新的viewController我想時間,直到最後查看已被用於添加到同一個對象。

+0

有什麼問題? –

回答

1

你的更新方法還創建了一個新的對象:

FinalRead *reading2A = [FinalRead MR_createInContext:localContext]; 
// ... other stuff 
reading2A.a2 = twoA; 
reading2A.b2 = twoB; 

而獲取的對象位置:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"firstname ==[c] %@ AND lastname ==[c] %@"]; 
FinalRead *finalRead = [FinalRead MR_findFirstWithPredicate:predicate inContext:localContext]; 

完全未使用。事實上,我預計崩潰的提取請求,因爲 謂詞使用%@格式,其中沒有參數提供。

更新一個對象,你必須先取它。要獲取它,您需要一些 屬性,其中標識了要更新的對象。例如:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"firstname ==[c] %@ AND lastname ==[c] %@", 
     firstName, lastName]; 
FinalRead *finalRead = [FinalRead MR_findFirstWithPredicate:predicate inContext:localContext]; 
if (finalRead) { 
    finalRead.a2 = twoA; 
    finalRead.b2 = twoB; 
    // ... save context ... 
} else { 
    // no matching object found 
} 

更新:你的情況的解決方案可能是從一個 視圖控制器傳遞finalRead對象到下一個,而不是重新獲取在每個視圖控制器它。

+0

好的,我明白了。那麼名字和姓氏是我在一個例子中發現的東西。我不確定如何在我的核心數據模型中真正搜索新創建的對象。 –

+0

我不太熟悉如何正確使用NSPredicate。 –

+0

@JohnSmith:數據庫中是否有多個FinalRead對象?你想更新哪個對象? –

相關問題