GreenDAO:存储其他实体中的实体列表

时间:2014-01-19 10:38:32

标签: android greendao

我正在玩GreenDAO,我想我喜欢它的工作方式。我不喜欢编写SQL代码,所以这将帮助我避免它;)

但是,我认为它确实是基于'sql'的思考你如何设置它。不确定这是不是坏事(知道事情是如何运作的),但我只想说:这是我的对象!存放吧!但我还没找到任何东西......

但是好吧,我正在做的是以下几点:我有一个对象,让我们说一个书架。我在书架上放了一些书。

这看起来像是:

class BookShelve {
    List<Book> books;

    void add(Book b) {
        books.add(b);
    }
}


BookShelve bs = new BookShelve();
Book b1 = new Book();
Book b2 = new Book();
Book b3 = new Book();
bs.add(b1);
bs.add(b2);
bs.add(b3);
好的,现在我想用GreenDAO存储它。我需要使用'addToMany'吗?所以:

Property bookDataProperty = bookData.addLongProperty("bookShelve").getProperty();
ToMany books = BookShelve.addToMany(bookData, bookDataProperty); 
books.setName("Books");

然后做一个:

bs.getBooks()

得到它们?或者有更好的方法吗?

我认为应该这样做,但我还没有完全相信。

ps:上面的代码中可能有拼写错误,我只是在这里写的,没有编译它:)

修改 在我给出“回答”检查后,这个问题出现了:

所以,要将书籍添加到书架,我需要:

b1.setBookShelve(bs.getId());
daoSession.insert(b1);

正确?

2 个答案:

答案 0 :(得分:9)

我认为您不必了解SQL,但您必须了解基本的数据库知识并明确您的E-R模型,我认为您已经拥有。

如果您使用greenDA并实施预订 BookShelf 之间的关系,则无需在BookShelf enity中保留图书清单。

在DaoGenerator.java中,您只需声明架构

    Entity bookShelf = schema.addEntity("BookShelf");
    bookShelf.addIdProperty();

    Entity book = schema.addEntity("Book");
    book.addIdProperty();
    book.addStringProperty("name");
    Property bookFKShelves = book.addLongProperty("bookShelf_id").notNull().getProperty();

    book.addToOne(bookShelf, bookFKShelves);
    bookShelf.addToMany(book, bookFKShelves);

生成代码后。在Android代码中使用它们:

        DevOpenHelper helper = new DaoMaster.DevOpenHelper(this.getActivity(),
                "BookStore", null);
        db = helper.getWritableDatabase();
        mDaoMaster = new DaoMaster(db);
        mDaoSession = mDaoMaster.newSession();
        BookDao mBookDao = mDaoSession.getBookDao();
        BookShelfDao mBookShelfDao = mDaoSession.getBookShelfDao();

        // Insert
        BookShelf bs = new BookShelf();
        Book b1 = new Book();   b1.setName("B1");   b1.setBookShelf(bs);
        Book b2 = new Book();   b2.setName("B2");   b2.setBookShelf(bs);
        Book b3 = new Book();   b3.setName("B3");   b3.setBookShelf(bs);

        mBookDao.insert(b1);
        mBookDao.insert(b2);
        mBookDao.insert(b3);
        mBookShelfDao.insert(bs);

        // Select
        for(BookShelf bss :mBookShelfDao.loadAll()){
            for (Book b :bss.getBookList())
                Lod.d(TAG,"Book Name: "+b.getName());
        }

答案 1 :(得分:2)

基本上你不需要知道greendao的sql:

您只需定义实体(对象类)以及它们之间的关系。

问题:

有两种可能性:

  • Bookshelve可以包含很多书,一本书只能放在一个书架上:你的方法是正确的。
  • 书架可以包含许多书籍,一本书可以放在许多书架中:你应该定义一个存储这些书的emtity bookshelve2book。