2015-11-30 24 views
0

在它们具有以下的境界代码的例子之一,效率的反复添加到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的原则之一是零拷贝,所以一旦被Realm支持,它们就不会被复制。 – geisshirt

+0

这实际上就是我正在寻找的答案......如果您将其作为答案与其他任何技术细节进行公布,那么我将以接受的答案为准。 –

回答

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

使用你的方法怎么样,但是如果过程中断,整个数据集不会丢失,那么可能每100个条目执行一次realm.commitTransaction() –

+0

我也意识到这意味着创建数千个猫对象......使用SQLite可能会更好地解决我所想的问题。 –