У меня есть базовая модель данных, созданная с использованием 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);
}
}
}
}
}
}
Этот код вызывается каждую минуту для получения последней информации с веб-сайта.
Проблема, с которой я сталкиваюсь, заключается в том, что когда я просматриваю данные с помощью кода или приложения просмотра базы данных SQLLite, единственной записью, для которой установлен SmokeObj, является последняя запись. Например, если SmokeObj = 1 и я собираю данные ProbeObj 3 раза, только последний ProbeObj будет иметь SmokeObj = 1. Два других будут иметь пустое значение для SmokeObj. Если я соберу только 1 ProbeObj, он будет иметь правильное значение SmokeObj. Проблемы возникают, собираю ли я данные 1 раз или 100 раз. Только последняя собранная запись имеет правильный SmokeObj.
Любая помощь будет принята с благодарностью.
-NCGrimbo