2011-06-09 69 views
0

我有一個使用XCode 4創建的核心數據模型,做一些奇怪的事情。我有一個名爲ProbeObj的實體,它與稱爲SmokeObj的第二個實體具有已定義的關係。在該圖中,我將ProbObj上的關係創建爲ProbeToSmoke和SmokeObj,我將該關係創建爲SmokeToProbe,並將其設置爲與ProbeObj上定義的關係相反的關係。我爲這兩個對象生成了.h &.m文件,並將它們包含在我創建的用於處理數據插入的類中。他們是:核心數據存儲鏈接到父記錄只存儲在最後一個孩子記錄

// 
// SmokeObj.h 
// Stoker Monitor 
// 
// Created by NCGrimbo on 6/3/11. 
// Copyright (c) 2011 __MyCompanyName__. All rights reserved. 
// 

#import <Foundation/Foundation.h> 
#import <CoreData/CoreData.h> 

@class BlowerObj, CurBlowerObj, CurProbeObj, ProbeObj, StokerObj; 

@interface SmokeObj : NSManagedObject { 
@private 
} 
@property (nonatomic, retain) NSDate * dtEnd; 
@property (nonatomic, retain) NSDate * dtStart; 
@property (nonatomic, retain) StokerObj * SmokeToStoker; 
@property (nonatomic, retain) ProbeObj * SmokeToProbe; 
@property (nonatomic, retain) CurProbeObj * SmokeToCurProbe; 
@property (nonatomic, retain) CurBlowerObj * SmokeToCurBlower; 
@property (nonatomic, retain) BlowerObj * SmokeToBlower; 

@end 

// 
// SmokeObj.m 
// Stoker Monitor 
// 
// Created by NCGrimbo on 6/3/11. 
// Copyright (c) 2011 __MyCompanyName__. All rights reserved. 
// 

#import "SmokeObj.h" 
#import "BlowerObj.h" 
#import "CurBlowerObj.h" 
#import "CurProbeObj.h" 
#import "ProbeObj.h" 


@implementation SmokeObj 
@dynamic dtEnd; 
@dynamic dtStart; 
@dynamic SmokeToStoker; 
@dynamic SmokeToProbe; 
@dynamic SmokeToCurProbe; 
@dynamic SmokeToCurBlower; 
@dynamic SmokeToBlower; 

@end 


// 
// ProbeObj.h 
// Stoker Monitor 
// 
// Created by NCGrimbo on 6/3/11. 
// Copyright (c) 2011 __MyCompanyName__. All rights reserved. 
// 

#import <Foundation/Foundation.h> 
#import <CoreData/CoreData.h> 

@class SmokeObj; 

@interface ProbeObj : NSManagedObject { 
@private 
} 
@property (nonatomic, retain) NSDate * dtDataRead; 
@property (nonatomic, retain) NSNumber * fCurTemp; 
@property (nonatomic, retain) NSNumber * fHighTemp; 
@property (nonatomic, retain) NSNumber * fLowTemp; 
@property (nonatomic, retain) NSNumber * fTargetTemp; 
@property (nonatomic, retain) NSNumber * nAlarmType; 
@property (nonatomic, retain) NSNumber * nCtrlAlrmType; 
@property (nonatomic, retain) NSString * sBlower; 
@property (nonatomic, retain) NSString * sID; 
@property (nonatomic, retain) NSString * sUserAssignedName; 
@property (nonatomic, retain) SmokeObj * ProbeToSmoke; 

@end 

// 
// ProbeObj.m 
// Stoker Monitor 
// 
// Created by NCGrimbo on 6/3/11. 
// Copyright (c) 2011 __MyCompanyName__. All rights reserved. 
// 

#import "ProbeObj.h" 


@implementation ProbeObj 
@dynamic dtDataRead; 
@dynamic fCurTemp; 
@dynamic fHighTemp; 
@dynamic fLowTemp; 
@dynamic fTargetTemp; 
@dynamic nAlarmType; 
@dynamic nCtrlAlrmType; 
@dynamic sBlower; 
@dynamic sID; 
@dynamic sUserAssignedName; 
@dynamic ProbeToSmoke; 

@end 

我的代碼從網站收集數據,解析它,然後將記錄添加到ProbObj表。 SmokeObj的數據被傳遞到程序的這部分並以self.SmokeForThisRun存儲。下面是代碼處理這與無關部分刪除:

- (void)connectionDidFinishLoading:(NSURLConnection *)connection 
{ 

    NSString *responseString = [[NSString alloc] initWithData:responseData encoding:NSUTF8StringEncoding]; 

    NSError *error; 
    NSArray *chunks = [responseString componentsSeparatedByString: @"{"]; 
    [responseString release]; 
    NSArray *details; 
    NSArray *arrTheData; 
    Boolean bIsSensor = false; 
    Boolean bIsBlower = false; 
    Boolean bStokerFound = false; 
    NSRange textRange; 


    for (int i = 0; i < [chunks count]; i++){ 

     if(!bStokerFound){ 
     } 
     else{ 
      if ((!bIsBlower) && (!bIsSensor)){ 
      } 
      else{ 
       if (bIsSensor){ 
        //Set the probe data that is fixed 
        ProbeObj *newProbe = [NSEntityDescription insertNewObjectForEntityForName:@"ProbeObj" inManagedObjectContext:[Common managedObjectContext]]; 
        newProbe.dtDataRead = [NSDate date]; 
        //newProbe.nSmokeID = [NSNumber numberWithInt: 0]; 
        NSLog(@"Setting ProbeToSmoke = %@", self.SmokeForThisRun); 
        newProbe.ProbeToSmoke = self.SmokeForThisRun; 

        //Parse the sensor information then save the data {Parse code removed.} 

        //Save the Probe Record 
        if (![[Common managedObjectContext] save:&error]) { 
         NSLog(@"Whoops, couldn't save: %@", [error localizedDescription]); 
         UIAlertView *saveError = [[UIAlertView alloc]initWithTitle:@"Error Saving the Probe Data." message:[error localizedDescription] delegate:self cancelButtonTitle:@"OK" otherButtonTitles: nil]; 
         [saveError show]; 
         [saveError release]; 
        } 
        else{ 
         NSLog(@"Data saved for %@", newProbe); 
        } 
       } 
      } 
     } 
    } 
} 

此代碼被調用每1分鐘從網站獲取最新信息。

我遇到的問題是,當我通過代碼或SQLLite數據庫查看器應用程序查看數據時,具有SmokeObj集的唯一記錄是最後一條記錄。例如,如果SmokeObj = 1並且我收集ProbeObj數據3次,則只有最後一個ProbeObj的SmokeObj = 1。其他兩個SmokeObj的值將爲空。如果我只收集1個ProbeObj,則它將具有正確的SmokeObj值。無論我收集數據1次還是100次都會發生問題。只有最後收集的記錄有正確的SmokeObj。

任何幫助將不勝感激。

-NCGrimbo

回答

0

SmokeObj.SmokeToProbe關係建立一個對一個。這意味着任何單個的SmokeObj實例都只能與ProbeObj的其他單個實例有關係。

因此,當你經過循環,你先在self.SmokeForThisRun分配SmokeObjnewProb引用的第一個創建ProbObj。然後在下一次循環中,您將關係更改爲現在由newProb等持有的第二個實例。只有newProb引用的最後創建的實例實際上以關係集的值結束。

解決的方法是將SmokeObj.SmokeToProbe更改爲多對多關係,以便同一個SmokeObjobj可以與多個「ProbeObj」關聯。

(順便說一句,你應該遵循實體/類和屬性的命名約定。實體和類名稱的第一個字母capitialized但屬性不。如SmokeObj.SmokeToProbe應該SmokeObj.smokeToProbe。它使你的代碼更容易給別人看的。 )

+0

你100%正確。我忘了在桌子上設置多對多的關係。另外,感謝有關命名約定的信息。我是蘋果開發的新手,我不知道這個慣例。 – NCGrimbo 2011-06-10 01:41:47