Hej, mam problem z odczytaniem obiektu z bazy Realm. Pobieram dane z serwera REST za pomocą retrofit'a. Parsuje to wszystko gson'em i dodaję do bazy Realm. Do tego momentu jest wszystko ok. Lecz kiedy chcę pobrać dane już z bazy aby np. wyświetlić je na ekran to niestety mam problem. Każdy obiekt jaki pobiorę ma wszystkie pola z wartością null. Co ciekawe tyczy się to tylko jednej klasy gdzie mam kolekcje z innej klasy plus pola które też reprezentują inne klasy. Co ciekawe w polu columnInfo
są przetrzymywane interesujące mnie dane w postaci Stringa
. Zakładam że jest jakiś problem z parsowaniem getterów przez Realm'a. Informacja jakie znalazłem to jest to że kolekcje obiektów z Realm'a powinny być zwracane do RealmResult
lecz zastosowanie tego nic nie dało. Poniżej umieszczam kod związany z daną klasą jak i zdjęcie jak wygląda pobrany obiekt oraz link do github'a jakby ktoś chciał zobaczyć całość kodu.
Klasa order będąca modelem.
public class Order extends RealmObject {
@PrimaryKey
@SerializedName("Id")
private int id;
@SerializedName("Contractor")
private Contractor contractor;
@SerializedName("ItemAmounts")
private RealmList<ItemAmount> itemsAmounts = new RealmList<>();
@SerializedName("ModificationDate")
private Date modificationDate;
@SerializedName("ExportDate")
private Date exportDate;
@SerializedName("Export")
private boolean exportStatus;
@SerializedName("User")
private User user;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public Contractor getContractor() {
return contractor;
}
public void setContractor(Contractor contractor) {
this.contractor = contractor;
}
public RealmList<ItemAmount> getItemsAmounts() {
return itemsAmounts;
}
public void addItemAmount (ItemAmount itemAmount){
itemsAmounts.add(itemAmount);
}
public void setItemsAmounts(RealmList<ItemAmount> itemsAmounts) {
this.itemsAmounts = itemsAmounts;
}
public Date getModificationDate() {
return modificationDate;
}
public void setModificationDate(Date modificationDate) {
this.modificationDate = modificationDate;
}
public Date getExportDate() {
return exportDate;
}
public void setExportDate(Date exportDate) {
this.exportDate = exportDate;
}
public boolean isExportStatus() {
return exportStatus;
}
public void setExportStatus(boolean exportStatus) {
this.exportStatus = exportStatus;
}
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
Klasa OrderDAO która jest odpowiedzialna za obsługę Realm'a
public class OrderDAO {
private Realm realm = Realm.getDefaultInstance();
private Order orderRealm;
public Order getOrderById(int id) {
orderRealm = realm.where(Order.class).equalTo("id", id).findFirst();
return orderRealm;
}
public List<Order> getOrdersbyContractor(Contractor contractor) {
List<Order> ordersList = new ArrayList<>();
RealmResults<Order> ordersRealmResults = realm.where(Order.class).findAll();
for (Order order : ordersRealmResults) {
if (order.getContractor().getNip().equals(contractor.getNip())) {
ordersList.add(order);
}
}
return ordersList;
}
public List<Order> getAllOrders() {
List<Order> ordersList = new ArrayList<>();
RealmResults<Order> orderRealmResults = realm.where(Order.class).findAll();
for(Order order : orderRealmResults){
ordersList.add(order);
}
return ordersList;
}
public void insertNewOrder(Order order) {
realm.beginTransaction();
order.setId(generateId());
orderRealm = realm.createObject(Order.class, order.getId());
orderRealm.setContractor(order.getContractor());
orderRealm.setUser(order.getUser());
realm.commitTransaction();
}
//Dla testów do usunięcia
public void insertOrUpdate(Order order) {
Order orderToCompare = realm.where(Order.class)
.equalTo("id", order.getId()).findFirst();
realm.beginTransaction();
if (orderToCompare == null) {
realm.copyToRealmOrUpdate(order);
} else if (!orderToCompare.equals(order)) {
realm.insertOrUpdate(order);
}
realm.commitTransaction();
}
private int generateId() {
if (realm.where(Order.class).max("id") == null)
return 1;
else
return realm.where(Order.class).max("id").intValue() + 1;
}
Metoda w której pobieram dane z REST api oraz dodaje je do Realm'a:
Call<OrderResponse> orderResponseCall = apiService.getOrdersList();
orderResponseCall.enqueue(new Callback<OrderResponse>() {
@Override
public void onResponse(Call<OrderResponse> call, Response<OrderResponse> response) {
orderList = response.body().getOrdersList();
orderDAO = new OrderDAO();
for (Order order : orderList) {
try {
orderDAO.insertNewOrder(order);
} catch (Exception e) {
Log.d("REST", "Error");
e.printStackTrace();
}
}
}
@Override
public void onFailure(Call<OrderResponse> call, Throwable t) {
Log.e(TAG, t.toString());
}
});
}
Funkcja którą pobieram dane z Realm'a:
private void prepareOrderData() {
OrderDAO orderDAO = new OrderDAO();
for (Order order : orderDAO.getAllOrders()) {
ordersList.add(order);
}
orderAdapter.notifyDataSetChanged();
}
Link do repo: https://github.com/666Angelus666/MobileDealer
Oraz zdjęcie obiektu jaki pobieram:
- screenshot-20170917231857.png (94 KB) - ściągnięć: 125