Autore Topic: GreenDao mi mostra i dati ma a DB non li vedo  (Letto 301 volte)

Offline MarKco

  • Nuovo arrivato
  • *
  • Post: 4
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy ACE GT-S5830
  • Sistema operativo:
    Mac OS X 10.6
GreenDao mi mostra i dati ma a DB non li vedo
« il: 12 Aprile 2015, 14:05:17 CEST »
0
Ciao a tutti,
sto sviluppando un progetto di prenotazioni alberghiere e uso GreenDAO come ORM.
Ho bisogno di creare un'entità Hotel e quindi ho inserito questa sezione nel mio MyGreenDaoGenerator

Codice: [Seleziona]
//  Hotels
private Entity createHotels() {

    Entity hotels = createEntity("Hotel", "hotels");

    hotels.addStringProperty("hotel_id").notNull().primaryKey().unique();
    hotels.addStringProperty("name").notNull();
    hotels.addStringProperty("country").notNull();
    hotels.addStringProperty("city").notNull();
    hotels.addStringProperty("address").notNull();
    hotels.addStringProperty("lt");
    hotels.addStringProperty("lg");
    hotels.addStringProperty("location");
    hotels.addIntProperty("stars").notNull();
    hotels.addFloatProperty("vote").notNull();
    hotels.addBooleanProperty("viewed").notNull();
    hotels.addBooleanProperty("favorite").notNull();
    hotels.addLongProperty("timestamp");

    return hotels;
}
Gli hotel però hanno delle foto ad essi associate quindi ho creato anche un'entità Pictures e la relativa sezione, nella quale definisco la relazione uno-molti con l'hotel:

Codice: [Seleziona]
//  Pictures
private Entity createPictures() {

    Entity pictures = createEntity("HotelPicture", "hotel_pictures");

    pictures.addStringProperty("image_url").notNull().primaryKey();
    pictures.addStringProperty("image_type").notNull();
    pictures.addStringProperty("image_path");

    //  PK

    Entity hotels = getEntity("Hotel");
    ToMany hotelToPictures = hotels.addToMany(pictures, pictures.addStringProperty("hotel_id").notNull().getProperty());
    hotelToPictures.setName("pictures");

    return pictures;
}
A questo punto il MyGreenDaoGenerator genera correttamente il codice relativo alle entità. Nel caso dell'hotel viene creata la corrispondente proprietà mediante l'attributo private List<HotelPicture> pictures;

Avvio l'app e tramite un webservice ottengo la lista degli hotel e delle foto per ciascuno di essi. Ad esempio

Codice: [Seleziona]
"pictures":[
      {
        "image_type":"medie",
        "image_url":"url_to_the_picture"
      }
    ],
Nel file generato HotelDao.java non vedo metodi relativi all'inserimento delle immagini ma solamente quelli per il recupero delle stesse.

Codice: [Seleziona]
public List<HotelPicture> getPictures() {
    if (pictures == null) {
        if (daoSession == null) {
            throw new DaoException("Entity is detached from DAO context");
        }
        HotelPictureDao targetDao = daoSession.getHotelPictureDao();
        List<HotelPicture> picturesNew = targetDao._queryHotel_Pictures(hotel_id);
        synchronized (this) {
            if(pictures == null) {
                pictures = picturesNew;
            }
        }
    }
    return pictures;
}

public synchronized void resetPictures() {
    pictures = null;
}

A questo punto mi aspetto che accada uno dei seguenti casi:
  • GreenDao è furbo, capisce che c'è un nodo Pictures e lo mappa correttamente, salvandolo a DB
  • GreenDao non è così furbo, dovrò inserire da qualche parte un metodo che mappi correttamente

Cosa accade? Quando arrivo all'activity nella quale dovrei visualizzare le immagini... le vedo! :-) E le vedo facendo questo:

Codice: [Seleziona]
hotelsList = (ArrayList) daoSession.getHotelDao().queryRaw(", hotel_agreements A WHERE A.HOTEL_ID = T.HOTEL_ID AND A.AGREEMENT_ID bla bla bla... no mention of HotelPictures here");

hotel.getPictures()
Quest'ultimo è il metodo che ho incollato più su. Viene fatto il controllo if (pictures == null) e pictures non è affatto null! Contiene l'oggetto pictures che viene di conseguenza visualizzato. Bellissimo.

Peccato solo per un piccolo particolare: a DB non vedo salvati questi dati. Gli hotel ci sono, ma gli hotel non hanno un campo pictures. Sono le pictures che, essendo in una relazione uno-a-molti, hanno il riferimento all'hotel al quale afferiscono. Ma se non ho record nella tabella hotel_pictures com'è possibile che il queryRaw sulla tabella hotels mi ritorni elegantemente gli oggetti HotelPictureS? Dove vanno a finire questi dati? Allego una foto di una vista nel DB dell'app nella quale si nota bene come non ci siano record nella tabella hotel_pictures.

Sto impazzendo su questa cosa da diverse ore perché mette in crisi il mio concetto di ORM. Forse non tutti gli oggetti vengono realmente salvati a DB? Forse c'è una cache?

Qualcuno ha qualche idea del perché ottenga questo risultato apparentemente incoerente? Vi è mai capitato?

Grazie in anticipo a chiunque si dimostrerà interessato.