2011-06-09 68 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