2015-03-20 1 views
0

Я работаю над переносом объекта Core Data в Realm. В объекте может быть более 2 миллионов записей, поэтому я стараюсь сделать это максимально эффективно.Удаление объекта основных данных в блоке транзакций записи в реальном времени?

Миграция идет в партиях 10000 записей или около того, и следующий код, который я буду использовать, чтобы сделать это:

/// We're in a loop 
/// Get the 10000 records out of Core Data 
[realm beginWriteTransaction]; 
// samples is an NSArray of NSManagedObjects 
NSInteger numberOfSamples = samples.count; 
for (NSInteger i = 0; i < numberOfSamples; i++) 
{ 
    // WeightSample is an NSManagedObject 
    WeightSample *sample = samples[i]; 

    //Diagnostic is an RLMObject 
    Diagnostic *weightSample = [Diagnostic new]; 

    /// 
    /// transfer data from WeightSample to Diagnostic 
    /// 

    [realm addObject:weightSample]; 

    // Remove the old sample from Core Data 
    [context deleteObject:sample]; 
} 
[realm commitWriteTransaction]; 

/// Start over at the top of the loop 
  • я буду работать в каких-либо проблем, делающих [context deleteObject:sample] в блок beginWriteTransaction-commitWriteTransaction?

Мое предположение: «Нет, но я буду блокировать дольше», исходя из моего загадочного tweet @Realm и их ответа.

  • Я могу разгрузить это в другую тему, не так ли?

ответ

1

Я сделал что-то подобное с Realm, но в моем случае я обнаружил, что просто удалил все базовые данные sqlite после завершения миграции, самый быстрый/самый эффективный. Я предполагаю, что вам не понадобится ваш основной хранилище данных после того, как миграция будет выполнена, так что вот как я это сделаю.

/// We're in a loop 
/// Get the 10000 records out of Core Data 
[realm beginWriteTransaction]; 
// samples is an NSArray of NSManagedObjects 
// WeightSample is an NSManagedObject 
for (WeightSample *sample in samples) 
{ 
    //Diagnostic is an RLMObject 
    Diagnostic *weightSample = [Diagnostic new]; 

    /// 
    /// transfer data from WeightSample to Diagnostic 
    /// 

    [realm addObject:weightSample]; 
} 
[realm commitWriteTransaction]; 

/// Start over at the top of the loop 

/// After all the data has been transferred to realm, delete all core-data sqlite files using NSFileManager API. 
+0

Спасибо за ответ. Я немного обеспокоен тем, что знаю, какие * записи были преобразованы. Пользователь может легко отключить приложение в любой момент, и я бы не захотел перезапускать миграцию каждый раз. – churowa

+0

Я полагаю, что я должен отслеживать, какие записи были преобразованы, когда я иду. Таким образом, если миграция будет убита, я могу избежать преобразования уже сделанных записей. – churowa

+0

Поскольку мы имеем дело с несколькими миллионами записей, миграция займет какое-то время. Я предполагаю, что вы покажете пользователю какой-то индикатор активности или контролер представлений, если это произойдет, может быть хорошей идеей информировать пользователя в предупреждении или в указанном контроллере представления данных, что убийство приложения вызовет миграция для перезагрузки? Если дубликаты - это то, о чем вы беспокоитесь, у меня были бы первичные ключи (которые однозначно идентифицировали записи) в области, и использовать методы createOrUpate, я нашел их довольно эффективными. –