1

我将双精度数组保存在 NSData* 对象中,该对象作为二进制属性保存在核心数据(SQLite)数据模型中。我这样做是为了在 iPhone 应用程序中存储用于绘图的采样数据。有时,当二进制对象中有超过 300 个双精度时,并非所有双精度都保存到磁盘中。当我退出并重新启动我的应用程序时,可能只有 25 个数据点保持不变或多达 300 个。

将 NSSQLitePragmasOption 与 synchronous = FULL 一起使用,这可能会有所作为。很难说,因为错误是间歇性的。

鉴于使用 synchronous = FULL 导致的性能问题警告,我正在寻求建议和指点。

谢谢。

[[编辑:这里是代码。]]

-addToCache: 的(尚未实现的)意图是将每个新数据添加到缓存中,但仅定期刷新(错误?)数据对象。

来自 Data.m

@动态数据集;// NSData * Data 实体的属性

 - (void) addDatum:(double_t)datum
    {
    DLog(@"-[Data addDatum:%f]", datum);
    [self addToCache:datum];
    }

- (void) addToCache:(double_t)datum
    {
    如果(缓存 == 零)
        {
        缓存 = [NSMutableData dataWithData:[self dataSet]];
        [缓存保留];
        }
    [缓存 appendBytes:&数据长度:sizeof(double_t)];
    DLog(@"-[Data addToCache:%f] ... [缓存长度] = %d; 缓存 = %p", datum, [缓存长度], 缓存);
    [自刷新缓存];
    }

-(无效)总结
    {
    DLog(@"-[数据总结]");
    [自刷新缓存];
    [缓存释放];
    缓存=零;
    DLog(@"[self isFault] = %@", [self isFault] ?@"YES" : @"NO"); // [self isFault] 始终为 NO。
    }

-(无效)flushCache
    {
    DLog(@"刷新缓存到存储");
    [自我设置数据集:缓存];
    DLog(@"-[Data flushCache:] [[self dataSet] length] = %d", [[self dataSet] length]);
    }

-(双*)字节
    {
    return (double*)[[self dataSet] bytes];
    }

- (NSInteger) 计数
    {
    return [[self dataSet] 长度]/sizeof(double);
    }

-(无效)转储
    {
    ALog(@"转储数据");
    NSInteger numDataPoints = [自我计数];
    双*数据=(双*)[自字节];
    ALog(@"numDataPoints = %d", numDataPoints);
    对于 (int i = 0; 我
4

1 回答 1

0

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

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

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

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

警告购买者:错误总是间歇性的,所以它可能仍然存在 - 但更难表现出来。

于 2010-02-01T17:19:46.023 回答