我正在NSData *对象中保存双精度数组,该对象在Core Data(SQLite)数据模型中作为二进制属性保留。我这样做是为了在iPhone应用程序中存储用于绘图的采样数据。有时当二进制对象中有超过300个双打时,并非所有双打都被保存到磁盘。当我退出并重新启动我的应用程序时,可能只有25个数据点持续存在或多达300个。
使用同步= FULL的NSSQLitePragmasOption,这可能会产生影响。很难说,因为错误是间歇性的。
鉴于使用synchronous = FULL导致的性能问题警告,我正在寻求建议和指示。
感谢。
[[编辑:此处为代码。]]
-addToCache的(尚未实现的)意图是将每个新数据添加到缓存中,但只是定期刷新(fault?)Data对象。
来自Data.m
@dynamic dataSet; // NSData * attribute of Data entity - (void) addDatum:(double_t)datum { DLog(@"-[Data addDatum:%f]", datum); [self addToCache:datum]; } - (void) addToCache:(double_t)datum { if (cache == nil) { cache = [NSMutableData dataWithData:[self dataSet]]; [cache retain]; } [cache appendBytes:&datum length:sizeof(double_t)]; DLog(@"-[Data addToCache:%f] ... [cache length] = %d; cache = %p", datum, [cache length], cache); [self flushCache]; } - (void) wrapup { DLog(@"-[Data wrapup]"); [self flushCache]; [cache release]; cache = nil; DLog(@"[self isFault] = %@", [self isFault] ? @"YES" : @"NO"); // [self isFault] is always NO. } - (void) flushCache { DLog(@"flushing cache to store"); [self setDataSet:cache]; DLog(@"-[Data flushCache:] [[self dataSet] length] = %d", [[self dataSet] length]); } - (double*) bytes { return (double*)[[self dataSet] bytes]; } - (NSInteger) count { return [[self dataSet] length]/sizeof(double); } - (void) dump { ALog(@"Dump Data"); NSInteger numDataPoints = [self count]; double *data = (double*)[self bytes]; ALog(@"numDataPoints = %d", numDataPoints); for (int i = 0; i
答案 0 :(得分:0)
我试图获得行为,好像我的Core Data实体可能具有NSMutableData属性。为此,我的NSManagedObject(称为Data)具有NSData属性和 NSMutableData ivar。我的应用程序从传感器获取样本数据并将每个数据点附加到数据集 - 这就是我需要这种设计的原因。
在每个新数据点上附加到NSMutableData,然后将NSData属性设置为NSMutableData。
我怀疑因为NSData指针没有改变(虽然它的内容是),但Core Data并没有意识到改变的数量。在NSManagedObjectContext上调用-hasChanged显示已经发生了更改,并且调用-updatedObjects甚至将Data对象列为已更改。但是正在编写的实际数据似乎已被截断(有时)。
为了解决这个问题,我稍微改变了一些事情。新数据点仍附加到NSMutableData ,但 NSData属性仅在采样完成时设置。这意味着崩溃有可能导致截断数据 - 但在大多数情况下,这种解决方案似乎已经解决了问题。
警告:这个bug总是间歇性的,因此有可能仍然存在 - 但更难以表现出来。