GreenDAO:在另一个实体中存储实体列表

7
我正在尝试使用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个回答

9

我觉得你不需要知道SQL的语言,但是你必须要掌握基本的数据库知识并清楚你的ER模型,我认为你已经掌握了这些。

如果你使用greenDAO并实现了BookBookShelf之间的关系,你不需要在你的BookShelf实体中保留书籍列表。

在你的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
谢谢!我会把“被接受的答案”给你。正如我的编辑所述,我确实需要将书架的ID设置为书籍,然后就不需要书籍列表了。感谢您提供详细的示例。顺便说一句:天哪,我写成了“bookshelve”,而不是“bookshelf” :x - Boy

2
基本上,你不需要了解 SQL 就可以使用 GreenDao:
你只需定义你的实体(对象类)和它们之间的关系。
对于你的问题:
有两种可能性:
书架可以包含多本书,一本书只能在一个书架中:你的方法是正确的。
书架可以包含多本书,一本书可以在多个书架中:你应该定义一个存储这些对应关系的 bookshelve2book 实体。

谢谢你的快速明确的评论!关于SQL:我发现我还需要daoSession.insert(b1)(文档中没有找到)。否则getBook()将返回null。此外,QueryBuilder显然是SQL,但你无法出现拼写错误。我仍然认为这是最好的选择(当然我已经试过其他东西)。 - Boy
1
当然,你可以使用GreenDAO构建SQL查询,但并非必须。最重要的查询已经包含在GreenDAO中:例如getBooks()。 - AlexS

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接