GreenDao获取了我无法在数据库中看到的数据

时间:2015-04-12 11:21:21

标签: java android android-sqlite greendao greendao-generator

我正在开发一个酒店预订应用程序,我使用greenDao。

我创建了一个酒店实体。这是MyGreenDaoGenerator中的条目:

//  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;
}

如您所见,没有“图片”节点。但我知道酒店有图片,所以我创建了一个图片实体并将其与酒店联系起来

//  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;
}

易。

在greenDAO生成的“Hotel.java”中,现在我得到了一个合适的房产:

protected List<HotelPicture> pictures;

现在我运行我的应用程序并从网络服务获得一些酒店。酒店包括带图片的图片节点。

 "pictures":[
      {
        "image_type":"medie",
        "image_url":"url_to_the_picture"
      }
    ],

现在, 在自生成的Hotel.java和HotelDao.java中,我看不到任何关于设置图片的方法。我刚才有这些:

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

我期望的是以下之一:

  • GreenDAO足够聪明,可以看到我的酒店对象中有一个图片节点并将其保存在数据库中
  • GreenDAO不够聪明。图片不会保存在DB中,应该手动执行

当我切换到show-me-the-data活动时,我看到了图片。我在此之后做了:

  1. 我从DB获得酒店

    hotelsList =(ArrayList)daoSession.getHotelDao()。queryRaw(“,hotel_agreements A WHERE A.HOTEL_ID = T.HOTEL_ID AND A.AGREEMENT_ID bla bla bla ...此处未提及HotelPictures”);

  2. 显示图片

    hotel.getPictures()

  3. 这导致前面提到的方法,其中评估条件“if(pictures == null)”并且图片根本不为空!它包含我的HotelPicture对象!

    这似乎证实了我的第一个想法:greenDAO很聪明,看到了图片节点并将其保存在数据库中。

    太糟糕了,如果我检查数据库,我会看到酒店但看不到任何图片记录

    Inspecting my SQLite DB, Hotels is full while HotelPictures is empty

    那么,如果GreenDAO没有保存在数据库中,它们如何访问这些数据?我变得疯狂,因为在我看来,我失去了DAO的全部意义,这对我来说意味着映射到Java对象的对象和关系,而不是映射到某些的Java对象 - 到数据库和一些-无论

    有人可以帮我理解我失败的地方吗?

    谢谢

0 个答案:

没有答案