尝试使用 Android 中的 Realm 复制不同列表中的对象

Trying to copy object in different list with Realm in Android

我在使用 Realm 的 Android 应用程序中工作,当我尝试管理不同列表(购物车和产品网格)中的对象时遇到问题。 在 Products Grid 中,我显示从服务器解析的产品,然后将这些产品拖放到购物车上以创建要购买的产品列表。

当我对一个对象使用方法 "copyToRealm" 并尝试在其中一个列表中修改它时,两个列表中的对象也被修改了。

我尝试在添加到两个列表之前复制,但对象似乎总是相同的。

我的部分代码:

1.从服务器解析产品的方法:

/**
     * Parse products got from server
     * @param result
     */
    public static void parseProducts(Realm realm, String result){
        Logs.MessageLogs("parseProducts", result, "v", Global.SHOW_LOGS);
        Object product = null;
        JSONObject json = null;
        ProductRealm pRealm, pObject;

        try {
            json = new JSONObject(result);

            if(Global.USER_LOGGED.getProductsGrid().size() > 0)
                _CRUDDatabase.clearProductsGrid(realm);

            for (Iterator<?> iterator = json.keys(); iterator.hasNext(); ) {
                String key = (String) iterator.next();
                if (json.get(key) instanceof JSONObject) {    //Category with children
                    product = ((JSONObject) json.get(key));

                    realm.beginTransaction();
                    pObject = realm.createObject(ProductRealm.class);
                    pRealm  = _CRUDDatabase.createNewProduct(Global.PREVIOUS_CATEGORY.getId(), product);
                    pObject = realm.copyToRealm(pRealm);                 //copy value to Realm
                    Global.USER_LOGGED.getProductsGrid().add(pObject);   //add value to RealmList
                    realm.commitTransaction();
                }
            }

        } catch (JSONException e) {
            e.printStackTrace();
        } catch (Exception ex){
            ex.printStackTrace();
        }
    }

2。在产品网格中显示产品的方法:

private void initializeGridView(View view){
//        int width = Utility.getScreenDimension((Activity) getActivity(), "WIDTH");

        mGridView = (RecyclerView) view.findViewById(R.id.RecyclerView);
        mGridView.setHasFixedSize(true);
        mShopGridViewAdapter = new ShopGridViewAdapter(getActivity(), productList);
        mShopGridViewAdapter.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Log.i("Item", "Clicked on item: " + mGridView.getChildAdapterPosition(v));

                ProductRealm pRealm = productList.get(mGridView.getChildAdapterPosition(v));
                UtilityDB.resetValuesToDefault(Global.REALM, pRealm);
                openProductDetailFragment(fm, pRealm);
            }
        });

        mGridView.setAdapter(mShopGridViewAdapter);
        mGridView.setLayoutManager(new GridLayoutManager(getActivity(), 2, GridLayoutManager.HORIZONTAL, false));

        //Item Decoration
        mGridView.setItemAnimator(new DefaultItemAnimator());
}

3。在购物车上捕获拖放的侦听器:

public class ShoppingCartDragListener implements View.OnDragListener {
...

    private void checkTypeOfDraggedProduct(ProductRealm pRealm) {
            ShopGridViewFragment sgv;

            if(pRealm.getTypeId().equals(TAG_CONFIGURABLE)){ //Configurable product
                sgv = new ShopGridViewFragment();
                sgv.openProductDetailFragment(fm, pRealm);

            } else {    //Simple product
                pRealm.setQuantity(1);   //Only increment 1 unit when drag to shopping cart
                int pos = _CRUDDatabase.addNewProductToCart(Global.REALM, pRealm);
                shoppingCartAdapter.notifyItemInserted(pos);
                ShoppingCartFragment.updateStatusCart();
            }
        }
...
}

4.将新产品添加到购物车的方法:

/**
     * Add new product to Shopping Cart from single productItem
     * @param realm
     * @param pObject
     * @return
     */
    public static int addNewProductToCart(Realm realm, ProductRealm pObject) {
        int pos = -1;
        ProductRealm pRealmDatabase = readProductFromDatabase(realm, pObject.getEntityId());


        realm.beginTransaction();
        if(pRealmDatabase != null){     //Update product in shopping cart
            pos = UtilityDB.getProductPositionIntoCart(pObject);
            if(pos != -1) {
                Global.USER_LOGGED.getCart().getProducts().get(pos).setQuantity(pObject.getQuantity() + pRealmDatabase.getQuantity());
                Global.USER_LOGGED.getCart().getProducts().get(pos).setQuantityWeight(pObject.getQuantityWeight() + pRealmDatabase.getQuantityWeight());
            }

        } else {    //Add new product to cart
            //ProductRealm pRealm = realm.copyToRealm(pObject);
            pObject.setIsIntoShoppingCart(true);
            Global.USER_LOGGED.getCart().getProducts().add(pObject);
        }
        Global.USER_LOGGED.getCart().setLastUpdate(Utility.getCurrentDateTime());
        realm.commitTransaction();

        return pos;
    }

5.这是我的模型:

@RealmClass
public class UserRealm extends RealmObject implements Serializable {

    private String    email;
    private String    password;
    private String    tokenId;
    private String    tokenSecret;
    private String    creationDate;
    private RealmList<ProductRealm> productsGrid;   //Temp table to load category products
    private CartRealm cart;        //One-to-one relationship
...
}

@RealmClass
public class CartRealm extends RealmObject implements Serializable {

    private String creationDate;
    private String lastUpdate;
    private int    totalDinitos;
    private float  totalPrice;
    private RealmList<ProductRealm> products;
...
}

@RealmClass
public class ProductRealm extends RealmObject implements Serializable {

    private String  catId;   //Only one category per product. In generic case many category per product
    private String  entityId;
    private String  parentId;
    private String  typeId;
    private String  sku;
    private String  canaryProduct;
    private String  premium;
    private String  brand;
    private String  dinitosQty;
    private String  name;
    private String  ean;
    private String  description;
    private String  shortDescription;
    private String  attributeSet;
    private String  weight;
    private String  isSaleable;
    private String  imageUrl;
    private String  unit;
    private String  unitFresh;
    private String  childrenSelected;
    private float   price;
    private float   minWeight;
    private float   quantityWeight;
    private int     quantity;
    private int     stock;
    private int     typeOfAttribute;    //0: Per units | 1: Per weight
    private boolean isIntoShoppingCart; //Flag to indicate if the product is into the Shopping Cart
    private RealmList<AttributeRealm> attributeItems;
    private RealmList<ProductRealm>   children;
...
}

问题是,当我在购物车中删除一个产品时,我也在产品网格中删除了这个对象:( 我想在两个列表中使用不同的实例。

copyToRealm 方法究竟是如何工作的?我是否真的在使用对象的副本?

我希望你能帮助我:) 提前致谢

我解决了我的问题。当我将产品从产品网格添加到购物车时,我需要先 "createObject" 添加它。

ProductRealm pRealm = Global.REALM.createObject(ProductRealm.class);

我的失败:)