2017-04-11 16 views
1

ここに私の言いたいことがあります。レルムの移行中に、多対1の移行を行うにはどうすればよいですか?

多くのデータがあり、それぞれに日付があるとします。

a: 2017/04/20 
b: 2017/04/23 
c: 2017/04/29 
d: 2017/05/02 
e: 2017/05/04 

今後の私たちの目標は、データをこのように保存を停止することで、我々は唯一の月額集約されたデータを保存したいです。そこで、04月にこの例で& b & cのデータを集計し、05月に集計データd & eを集計するとします。

最後に2つのデータが必要です。

マイグレーションでこれを行うことは妥当ですか、それとも本当に場所ではないのでしょうか、それとも可能ではないでしょうか?

本来、[migration enumerateObjects:Data.className block:^(RLMObject *oldObject, RLMObject *newObject) {に入ると、データの月を把握し、合計を維持する必要があります。現時点では、特定のデータを移行しないようにするためのコマンドが必要です(集約が完了するまでは不要です)。しかし、私たちが知る唯一の方法は、cからd、または04月から05に移動することです。その時点で、実行中の集計データがあることがわかります。私はそれが遅すぎると推測しています今すぐ移行します。

このようなことがあれば誰でも知っていますか?私は推測していない、それは本当に意味をなさない...しかし、おそらくそこに誰かが確かに動作しないか、それを行う方法があることを知っている。

答えて

0

はい、移行で実行できるはずです。

レルムファイル内のオブジェクトのすべてを複数回繰り返すことができ、それが単に、すべてのオブジェクトを反復処理各月の値を集計して、リストAを反復処理の問題であるべき2回目に新しい値を適用します。

id migrationBlock = ^(RLMMigration *migration, uint64_t oldSchemaVersion) { 

    // Use a dictionary to store the aggregate values. 
    // Dictionary keys must be unique, so they can be used to aggregate multiple values for a month. 
    NSMutableDictionary *months = [[NSMutableSet alloc] init]; 

    //Loop through each object to extract and aggregate the data for each month 
    [migration enumerateObjects:Data.className block:^(RLMObject *oldObject, RLMObject *newObject) { 

     // Extract the month value from the date in this object 
     NSDate *date = newObject["date"]; // Properties can be retrieved from RLMObject via KVC 
     NSInteger month = date.month.intValue; // Extract the month from that date 

     // Track if this was the first entry for this specific month 
     BOOL firstTime = ([months.allKeys indexOfObject:@(month)] == NSNotFound); 

     // Aggregate the value of month with the value stored in the dictionary 
     NSInteger aggregateValue = months[@(month)].intValue; 
     aggregateValue += date; // Add the month's information to the aggregate 
     months[@(month)] = @(aggregateValue); 

     // If this isn't the first object, we don't need it in Realm anymore, so delete it 
     if (!firstTime) { 
      [migration deleteObject:newObject]; 
     } 
    }]; 

    // At this point, `months` will contain our aggregate values, and the Realm database 
    // only has one object per month now. 

    // Loop through all the objects again so we can add in the aggregate values 
    [migration enumerateObjects:Data.className block:^(RLMObject *oldObject, RLMObject *newObject) { 
     NSDate *date = newObject["date"]; 
     NSInteger month = date.month.intValue; 

     // Copy in the aggregate value 
     newObject["date"] = months[@(month)]; 
    }]; 
} 

言われ、移行は、データベースの変更の際に実際のスキーマのために設計されていること:あなたも月ごとに1つだけのオブジェクトが残っていることを確認できたので、あなたはまた、移行ブロック内のオブジェクトを削除することができます。この場合、スキーマは変更されていないように見えますが、保存したいデータの細かさだけです。

これが当てはまる場合は、アプリの開始時に実行される独自のヘルパー関数を作成し、データがまだ集約されているかどうかを確認し、それが検出された場合は集計を実行するそうではありません。

関連する問題