0

奇妙なことをしているXCode4を使用して作成されたコアデータモデルがあります。SmokeObjという2番目のエンティティとの関係が定義されているProbeObjというエンティティがあります。この図では、ProbObjでProbeToSmokeとして関係を作成し、SmokeObjで関係をSmokeToProbeとして作成し、ProbeObjで定義されたものとは逆の関係として設定しました。これら2つのオブジェクトの.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

私のコードは、Webサイトからデータを収集し、それを解析してから、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);
                    }
                }
            }
        }
    }
}

このコードは、Webサイトから最新情報を取得するために1分ごとに呼び出されます。

私が抱えている問題は、コードまたはSQLLiteデータベースビューアアプリを介してデータを表示するときに、SmokeObjが設定されている唯一のレコードが最後のレコードであるということです。たとえば、SmokeObj = 1でProbeObjデータを3回収集した場合、最後のProbeObjのみがSmokeObj = 1になります。他の2つは、SmokeObjの値が空白になります。1つのProbeObjのみを収集すると、正しいSmokeObj値になります。データを1回収集しても100回収集しても、問題が発生します。収集された最後のレコードのみが正しいSmokeObjを持っています。

どんな助けでも大歓迎です。

-NCGrimbo

4

1 に答える 1

0

あなたのSmokeObj.SmokeToProbe関係は1対1に設定されています。これは、の任意の単一インスタンスがSmokeObj、の1つの他の単一インスタンスとのみ関係を持つことができることを意味しますProbeObj

したがって、ループを通過するときに、最初に、によって参照される最初に作成されたSmokeObjにinを割り当てます。次にループを通過するときに、関係を現在保持されている2番目のインスタンスに変更します。によって参照される最後に作成されたインスタンスのみが、実際にはリレーションシップセットの値になります。self.SmokeForThisRunProbObjnewProbnewProbnewProb

解決策は、同じobjが複数の'ProbeObj`に関連付けられるSmokeObj.SmokeToProbeように、to-many関係を変更することです。SmokeObj

(ところで、エンティティ/クラスとプロパティの命名規則に従う必要があります。エンティティとクラス名の最初の文字は大文字になりますが、プロパティは大文字になりません。たとえば、そうSmokeObj.SmokeToProbeする必要がありますSmokeObj.smokeToProbe。他の人がコードを読みやすくします。)

于 2011-06-09T20:26:13.937 に答える