2015-11-30 5 views
0

В одном из примеров Realm кода они имеют,Эффективность неоднократно добавляя к RealmList

for (int j = 0; j < i; j++) { 
    Cat cat = realm.createObject(Cat.class); 
    cat.setName("Cat_" + j); 
    person.getCats().add(cat); 
} 

Что произойдет, если i бывает очень большим, так как в более чем 1k или выше? Это означало бы, что person.getCats() захватывает длинный список только для добавления одного значения. Является ли это эффективным? Если нет, то какой будет лучший подход?

+0

'getCats()' будет только захватывать ссылку на список, поэтому даже длинный список не должен быть проблемой. Один из принципов Царства - это нуль-копия, поэтому, когда они поддерживаются Realm, они не копируются. – geisshirt

+0

Это на самом деле тот ответ, который я искал ... Если вы опубликуете его как ответ с любыми другими техническими подробностями, которые вы знаете, я получу его как принятый ответ. –

ответ

0

getCats() только захватить ссылку на список, так что даже длинный список не должно быть проблемой.

Один из принципов Царства - это нуль-копия, поэтому, когда они поддерживаются Королевством, они не копируются - см. http://www.slideshare.net/ChristianMelchior/realm-building-a-mobile-database.

1

Вы правы. Это не самый лучший вариант, вы получите список в каждом ряду:

  1. Использование транзакции у вас есть партии работы. Все будет exectued сразу (все вместе)
  2. петля добавить,
  3. фиксации транзакции каждый COMMITSIZE

    long added=0; 
    long COMMITSIZE =100; 
    
    //open transaction 
    realm.beginTransaction(); 
    pCats = person.getCats(); 
    
    for (int j = 0; j < i; j++) { 
        Cat cat = realm.createObject(Cat.class); 
        cat.setName("Cat_" + j); 
        pCats.add(cat); 
    
    
        if(added%COMMITSIZE == 0){ 
         realm.commitTransaction(); 
         //reopen transaction 
         realm.beginTransaction(); 
        } 
    
    
    } 
    
    //commit transaction 
    realm.commitTransaction(); 
    
+0

как использовать ваш подход, но, возможно, сделать realm.commitTransaction() каждые 100 записей или так, если процесс прерывается, весь набор данных не будет потерян? –

+0

Я также понял, что это означает создание тысяч объектов для кошек тоже ... Придерживание SQLite может быть лучшим решением для того, что я думаю. –

Смежные вопросы