领域在Android

时间:2018-04-11 06:25:14

标签: java android realm

我正在使用Realm 5.0.0,我想在一个表中插入对象列表,并且还想从另一个表中删除相同的对象列表。我尝试过使用ThreadAsyncTask,但只有一个任务完成,如果我先删除并稍后插入它只执行插入,如果我反转它只会执行删除。

public static void removeSKUList(final ArrayList<SKUItem> skuItems) {
    final Thread insertThread = new Thread(new Runnable() {
        @Override
        public void run() {
            Realm realm = Realm.getDefaultInstance();
            try {
                realm.beginTransaction();
                realm.insertOrUpdate(new Memo(String.valueOf(UUID.randomUUID()),
                        false, System.currentTimeMillis(), skuItems));
                realm.commitTransaction();
                } finally {
                realm.close();
                Log.e(TAG, "run: thread2 finished");

            }
        }
    });

    Thread deleteThread = new Thread(new Runnable() {
        @Override
        public void run() {
            Realm realm = Realm.getDefaultInstance();
            try {
                RealmQuery<SKUItem> query = realm.where(SKUItem.class);
                int i = 0;
                for (SKUItem id : skuItems) {
                    if (i++ > 0) {
                        query = query.or();
                    }
                    query = query.equalTo("sku_number", id.getSku_number());
                }
                realm.beginTransaction();
                RealmResults<SKUItem> skuItems1 = query.findAll();
                skuItems1.deleteAllFromRealm();
                realm.commitTransaction();
                realm.refresh();
            } finally {
                realm.close();
                insertThread.start();
            }
        }
    });
    deleteThread.start();


}

输出:

E / RealmManager:run:thread finished

E / RealmManager:运行:thread2完成

但是最后只更新了一张桌子......

更新

final Realm realm = Realm.getDefaultInstance();                                                                        
try {                                                                                                                  
    final RealmResults<SKUItem> students = realm.where(SKUItem.class).findAll();                                       
    Memo memo = new Memo(String.valueOf(UUID.randomUUID()),                                                            
            false, System.currentTimeMillis(), temStockItems);                                                         
    realm.beginTransaction();                                                                                          
    realm.insertOrUpdate(memo);                                                                                        
    realm.commitTransaction();                                                                                         
    for (SKUItem temStockItem : temStockItems) {                                                                       
        SKUItem skuItem = students.where().equalTo("sku_number", temStockItem.getSku_number()).findFirst();            
        if (skuItem != null) {                                                                                         
            realm.beginTransaction();                                                                                  
            skuItem.deleteFromRealm();                                                                                 
            realm.commitTransaction();                                                                                 
        }                                                                                                              
    }                                                                                                                  
} finally {                                                                                                            
    realm.close();                                                                                                     
}  

1 个答案:

答案 0 :(得分:0)

try(Realm r = Realm.getDefaultInstance()) {
    r.executeTransaction((realm) -> {
        RealmQuery<SKUItem> query = realm.where(SKUItem.class);
        int i = 0;
        for (SKUItem id : skuItems) {
            if (i++ > 0) {
                query = query.or();
            }
            query = query.equalTo("sku_number", id.getSku_number());
        }
        query.findAll().deleteAllFromRealm();
        realm.insertOrUpdate(new Memo(String.valueOf(UUID.randomUUID()),
                false, System.currentTimeMillis(), skuItems));
    });
}