1

I have a problem when I try to add a new object to RealmList in Realm database Android. Always I'm getting NullPointer error at:

Global.USER_LOGGED.getProductsGrid().add(pFinal);

This is my models:

    @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

    /*GETTERS & SETTERS*/
    ... 
}


    @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 RealmList<AttributeRealm> attributeItems;
        private RealmList<ProductRealm>   children;  

    /* GETTERS & SETTERS */
    ... 
}

This is the code:

public static void parseProducts(String result){
        Logs.MessageLogs("parseProducts", result, "v", Global.SHOW_LOGS);
        Object product = null;
        JSONObject json = null;
        ProductRealm pFinal, p = new ProductRealm();

        try {
            json = new JSONObject(result);

            if(Global.USER_LOGGED.getProductsGrid().size() > 0)
                _CRUDDatabase.clearProductsGrid(Global.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));
                    Global.REALM.beginTransaction();
                    pFinal = Global.REALM.createObject(ProductRealm.class);

                    pFinal = _CRUDDatabase.createNewProduct(Global.PREVIOUS_CATEGORY.getId(), product);
                    Global.USER_LOGGED.getProductsGrid().add(pFinal); 
                    Global.REALM.commitTransaction();
                }
            }

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

Global.USSER_LOGGED is a Singleton with the currently user logged:

public static UserRealm USER_LOGGED;

Stack trace:

06-23 15:16:32.619 17555-17555/com.singularfactory.ecommerceapp.ecommerceappW/System.err? java.lang.NullPointerException 
06-23 15:16:32.619 17555-17555/com.singularfactory.ecommerceapp.ecommerceappW/System.err? at io.realm.RealmList.add(RealmList.java:122) 
06-23 15:16:32.619 17555-17555/com.singularfactory.ecommerceapp.ecommerceappW/System.err? at com.singularfactory.ecommerceapp.utility.UtilityDB.parseProducts(UtilityDB.java:283)
06-23 15:16:32.619 17555-17555/com.singularfactory.ecommerceapp.ecommerceappW/System.err? at com.singularfactory.ecommerceapp.fragment.ShopViewPagerFragment.OAuthResponse(ShopViewPagerFragment.java:148)
06-23 15:16:32.623 17555-17555/com.singularfactory.ecommerceapp.ecommerceappW/System.err? at com.singularfactory.ecommerceapp.utility.WebService$getProductsByCategoryIdWithOAuth10a.onPostExecute(WebService.java:239)
06-23 15:16:32.623 17555-17555/com.singularfactory.ecommerceapp.ecommerceappW/System.err? at com.singularfactory.ecommerceapp.utility.WebService$getProductsByCategoryIdWithOAuth10a.onPostExecute(WebService.java:187)
06-23 15:16:32.623 17555-17555/com.singularfactory.ecommerceapp.ecommerceappW/System.err? at android.os.AsyncTask.finish(AsyncTask.java:632) 
06-23 15:16:32.639 17555-17555/com.singularfactory.ecommerceapp.ecommerceappW/System.err? at android.os.AsyncTask.access$600(AsyncTask.java:177)
06-23 15:16:32.639 17555-17555/com.singularfactory.ecommerceapp.ecommerceappW/System.err? at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:645)
06-23 15:16:32.639 17555-17555/com.singularfactory.ecommerceapp.ecommerceappW/System.err? at android.os.Handler.dispatchMessage(Handler.java:102)
06-23 15:16:32.643 17555-17555/com.singularfactory.ecommerceapp.ecommerceappW/System.err? at android.os.Looper.loop(Looper.java:136) 
06-23 15:16:32.643 17555-17555/com.singularfactory.ecommerceapp.ecommerceappW/System.err? at android.app.ActivityThread.main(ActivityThread.java:5001) 
06-23 15:16:32.643 17555-17555/com.singularfactory.ecommerceapp.ecommerceappW/System.err? at java.lang.reflect.Method.invokeNative(Native Method)
06-23 15:16:32.643 17555-17555/com.singularfactory.ecommerceapp.ecommerceappW/System.err? at java.lang.reflect.Method.invoke(Method.java:515)
06-23 15:16:32.643 17555-17555/com.singularfactory.ecommerceapp.ecommerceappW/System.err? at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785)
06-23 15:16:32.643 17555-17555/com.singularfactory.ecommerceapp.ecommerceappW/System.err? at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601) 
06-23 15:16:32.643 17555-17555/com.singularfactory.ecommerceapp.ecommerceappW/System.err? at dalvik.system.NativeStart.main(Native Method)

I'm reading Realm doc's and I see that there are two modes to create RealmList: managed and non-managed. I'm trying to create both but I have always same error.

How can I create an object and assign to RealmList in database? What's wrong in my code?

Thanks in advance :)

UPDATE:

My Singleton class:

public class Global {
    private static Global instance = null;
...
//Realm
    public static Realm REALM;              //Database Realm
    public static String DATABASE_NAME;     //Name of Realm database
    public static UserRealm USER_LOGGED;            //Object of the user logged

...
private Global() {
//Realm
        REALM   = null;
        DATABASE_NAME = "keymarket.realm";
        USER_LOGGED = null;
...
}

public static Global getInstance(){
        if(instance == null){
            instance = new Global();
        }
        return instance;
    }
Selvin
  • 6,598
  • 3
  • 37
  • 43
Adae Rodríguez
  • 183
  • 1
  • 18

1 Answers1

2

You need to add the object to the realm before adding it to a list because internally Realm will call getId (or whatever method to get it's primary key) in order to add the object to the list. Since it uses proxy methods and the object was not added to the realm you will get a null pointer exception..

Pedro Oliveira
  • 20,442
  • 8
  • 55
  • 82