截断的核心数据NSData对象

时间:2010-01-27 01:41:41

标签: iphone sqlite core-data nsdata

我正在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 

1 个答案:

答案 0 :(得分:0)

我试图获得行为,好像我的Core Data实体可能具有NSMutableData属性。为此,我的NSManagedObject(称为Data)具有NSData属性 NSMutableData ivar。我的应用程序从传感器获取样本数据并将每个数据点附加到数据集 - 这就是我需要这种设计的原因。

在每个新数据点上附加到NSMutableData,然后将NSData属性设置为NSMutableData。

我怀疑因为NSData指针没有改变(虽然它的内容是),但Core Data并没有意识到改变的数量。在NSManagedObjectContext上调用-hasChanged显示已经发生了更改,并且调用-updatedObjects甚至将Data对象列为已更改。但是正在编写的实际数据似乎已被截断(有时)。

为了解决这个问题,我稍微改变了一些事情。新数据点仍附加到NSMutableData ,但 NSData属性仅在采样完成时设置。这意味着崩溃有可能导致截断数据 - 但在大多数情况下,这种解决方案似乎已经解决了问题。

警告:这个bug总是间歇性的,因此有可能仍然存在 - 但更难以表现出来。