1

Core Data (SQLite) データ モデルでバイナリ プロパティとして永続化される NSData* オブジェクトに double の配列を保存しています。iPhoneアプリでグラフ化するためにサンプリングされたデータを保存するためにこれを行っています。バイナリ オブジェクトに 300 を超える double がある場合、すべての double がディスクに保存されないことがあります。アプリを終了して再起動すると、わずか 25 個のデータ ポイントが保持されるか、最大 300 個のデータ ポイントが保持される場合があります。

同期 = FULL で NSSQLitePragmasOption を使用すると、違いが生じる可能性があります。バグは断続的であるため、見分けるのは困難です。

synchronous = FULL を使用した結果としてのパフォーマンスの問題に関する警告を考慮して、アドバイスとポインタを求めています。

ありがとう。

[[編集: これがコードです。]]

-addToCache: の (まだ実現されていない) 意図は、新しい各データをキャッシュに追加することですが、Data オブジェクトを定期的にフラッシュ (障害?) するだけです。

Data.m から

@動的データセット; // NSData * データエンティティの属性

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

- (無効) addToCache:(double_t)datum
    {
    if (キャッシュ == nil)
        {
        cache = [NSMutableData dataWithData:[self dataSet]];
        [キャッシュ保持];
        }
    [キャッシュ appendBytes:&datum 長さ:sizeof(double_t)];
    DLog(@"-[Data addToCache:%f] ... [キャッシュの長さ] = %d; キャッシュ = %p", datum, [キャッシュの長さ], cache);
    [セルフフラッシュキャッシュ];
    }

- (無効) まとめ
    {
    DLog(@"-[データまとめ]");
    [セルフフラッシュキャッシュ];
    [キャッシュ解放];
    キャッシュ = ゼロ;
    DLog(@"[self isFault] = %@", [self isFault] ? @"YES" : @"NO"); // [self isFault] は常に NO です。
    }

- (void) フラッシュキャッシュ
    {
    DLog(@"ストアへのキャッシュのフラッシュ");
    [self setDataSet:キャッシュ];
    DLog(@"-[Data flushCache:] [[self dataSet] length] = %d", [[self dataSet] length]);
    }

- (ダブル*) バイト
    {
    return (double*)[[self dataSet] バイト];
    }

- (NSInteger) カウント
    {
    return [[self dataSet] length]/sizeof(double);
    }

- (無効) ダンプ
    {
    ALog(@"ダンプデータ");
    NSInteger numDataPoints = [自己カウント];
    double *data = (double*)[self バイト];
    ALog(@"numDataPoints = %d", numDataPoints);
    for (int i = 0; i
4

1 に答える 1

0

Core Data エンティティに NSMutableData 属性があるかのように動作させようとしていました。これを行うために、私の NSManagedObject (Data と呼ばれる) には NSData 属性NSMutableData ivar がありました。私のアプリはセンサーからサンプル データを取得し、各データ ポイントをデータ セットに追加します。これが、この設計が必要な理由です。

新しいデータ ポイントごとに NSMutableData に追加され、NSData 属性が NSMutableData に設定されました。

NSData ポインターが (内容は変更されていたにもかかわらず) 変更されていなかったため、Core Data は変更の量を認識していなかったと思われます。NSManagedObjectContext で -hasChanged を呼び出すと、変更があったことが示され、 -updatedObjects を呼び出すと、Data オブジェクトが変更されたものとしてリストされました。しかし、書き込まれた実際のデータは (時々) 切り捨てられたようです。

これを回避するために、私は物事を少し変更しました。新しいデータ ポイントは引き続き NSMutableData に追加されますが、 NSData 属性はサンプリングが完了したときにのみ設定されます。これは、クラッシュによってデータが切り捨てられる可能性があることを意味しますが、ほとんどの場合、この回避策で問題が解決したようです。

emptor の警告: バグは常に断続的であったため、まだ存在している可能性がありますが、明らかにするのが難しいだけです。

于 2010-02-01T17:19:46.023 に答える