Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 截断的核心数据对象_Iphone_Sqlite_Core Data_Nsdata - Fatal编程技术网

Iphone 截断的核心数据对象

Iphone 截断的核心数据对象,iphone,sqlite,core-data,nsdata,Iphone,Sqlite,Core Data,Nsdata,我正在NSData*对象中保存双精度数组,该对象在核心数据SQLite数据模型中作为二进制属性持久化。我这样做是为了在iPhone应用程序中存储用于绘图的采样数据。有时,当二进制对象中有300多个双精度对象时,并不是所有的双精度对象都被保存到磁盘上。当我退出并重新启动我的应用程序时,可能会有多达25个数据点被保留,或者多达300个 将NSSQLitePragmasOption与synchronous=FULL一起使用,这可能会有所不同。这很难说,因为bug是间歇性的 鉴于使用synchronou

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

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

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

谢谢

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

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

从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
我试图让我的核心数据实体具有NSMutableData属性。为此,名为Data的NSManagedObject具有一个NSData属性和一个NSMutableData ivar。我的应用程序从传感器获取样本数据,并将每个数据点附加到数据集——这就是我需要这种设计的原因

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

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

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


注意:错误总是间歇性的,所以可能仍然存在,但更难表现出来。

Wow,如果这真的是框架中的错误,而不是您的代码,我希望您向Apple提交文件,因为这非常糟糕。您是否考虑过为数据模型创建适当的实体和关系,而不是尝试将数组存储在单个属性中?您是否确认数据已正确转换为二进制?我认为这个bug最有可能出现在转换代码中,正如St3fan所指出的,我们需要看到。在保存之前,尝试将其从二进制转换回双精度,并执行断言检查。如果错误确实存在于转换代码中,这将捕获该错误。gerry3-不确定您的意思。我有一些“实验”实体,它们与“运行”实体具有一对多的关系以进行包含,“运行”实体与“数据”实体具有一对一的关系,尽管大多数运行属性都存储在运行对象中。数据实体是测量数据的样本,它可以容纳数万个数据点。如果有更好的方法来表示这一点,而不是将其表示为一个BLOB,那么我洗耳恭听。St3fan-我已经为数据对象(NSManagedObject)添加了一些代码。当从测量(例如温度传感器)中采集数据时,将为每个数据点调用[data addDatum:]。采样完成后,调用[Data wrapup]。调用方还调用NSManagedObjectContext上的-save。有时—例如,当在应用程序执行期间对多个运行进行采样时,或者当已经保存了几个运行时—新运行及其数据的NSData属性会正确保存。但第一次实验往往会被截断。