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

标签 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);

对吗?

最佳答案

我认为您不必了解 SQL,但您必须了解基本的数据库知识并清楚您的 E-R 模型,我认为您已经掌握了这些知识。

如果您使用 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());
        }

关于android - GreenDAO:存储其他实体中的实体列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21215668/

相关文章:

android - 由于错误 -24,无法分配大小为 2097152 的 CursorWindow '/pos-db'

android - Android中的 Activity 和 Intent 有什么区别?

java - 运行应用程序时出现 IllegalArgumentException。 (安卓)

android - 在 BroadcastReceiver 中启动一个新线程是否安全?

android - JNI编码和使用JNI连接到java的c/c编码之间的区别

android - GreenDao queryBuilder().list() 返回删除的实体

android - GreenDAO:实体与 DAO 上下文分离

sqlite - Greendao,创建一个非增量(用户定义的)主键

android - 如何使用 greenDao 获得递归的多对多关系

android - 从 XML 导入时如何使命名导入成为默认行为?