代码之家  ›  专栏  ›  技术社区  ›  westsider

截断的核心数据对象

  •  1
  • westsider  · 技术社区  · 15 年前

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

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

    谢谢

    ]]

    从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 回复  |  直到 14 年前
        1
  •  0
  •   westsider    15 年前

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

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

    我怀疑,因为NSData指针没有变化(尽管其内容是变化的),所以核心数据没有意识到变化的程度。在NSManagedObjectContext上调用-hasChanged表明发生了更改,调用-UpdateObject甚至将数据对象列为已更改。但正在编写的实际数据似乎被截断(有时)。

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

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