2015-06-23 6 views
1

У меня проблема при попытке добавить новый объект в RealmList в базе данных Realm Android. Всегда я получаю ошибку NullPointer по адресу:Получение NullPointer добавления объекта в RealmList

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

Это мои модели:

@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 */ 
    ... 
} 

Это код:

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 одноэлементно с вошедшего в данный момент пользователя:

public static UserRealm USER_LOGGED;

Стек след:

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) 

Я читаю Realm документ, и я вижу, что есть два режима для создания RealmList: управляемые и не управляемые. Я пытаюсь создать оба, но у меня всегда такая же ошибка.

Как создать объект и назначить RealmList в базе данных? Что не так в моем коде?

Заранее спасибо :)

UPDATE:

Мой Singleton класс:

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; 
    } 
+0

Не могли бы вы предоставить остальную трассировку стека? –

+0

ОК. Я обновлю свой пост :) –

+0

Кажется, вы обращаетесь к объекту из потока. Обратите внимание на это из документации: «Кроме того, асинхронные запросы в настоящее время не поддерживаются». –

ответ

2

Вы должны добавить объект в области, прежде чем добавить его в список, потому что внутренне Realm вызовет getId (или любой другой метод, чтобы получить его первичный ключ), чтобы добавить объект в список. Поскольку он использует прокси-методы, и объект не был добавлен в область, вы получите исключение с нулевым указателем.

+0

Я не могу проголосовать, но это сработало !!. Ты трещина! –

+0

Вы не можете повышать, но можете пометить как ответ, насколько я знаю. Это поможет столько же, сколько и голосование. –

+0

Сделано !! Благодаря :) –

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