2014-01-19 3 views
7

Я играю с GreenDAO, и мне кажется, мне нравится, как это работает. Я не люблю писать код SQL, поэтому это поможет мне избежать этого;)GreenDAO: список объектов в другом объекте

Но все же, я думаю, что это действительно «основанное на 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() 

, чтобы получить их? Или есть лучший способ?

Я думаю, что так должно быть сделано, но я еще не полностью убежден.

пс: может быть опечатка В коде выше, я написал здесь, не скомпилирован :)

Edit: Это произошло после того как я дал «ответ» проверить:

так, чтобы добавить книги на полку, мне нужно:

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

правильно?

ответ

9

Я думаю, что вам не обязательно знать SQL, но вам нужно знать базовые знания в базе данных и быть ясными для вашей модели E-R, которая, как я думаю, у вас уже есть.

Если вы используете greenDAO и осуществлять связь между Книга и 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

Спасибо! Предоставление вам «принятого ответа». Как и в моем редактировании, действительно, мне нужно установить идентификатор книжной полки в книгу, а затем мне не нужен список книг. Спасибо за подробный пример. btw: OMG, я написал «книжную полку» вместо «книжной полки»: x – Boy

2

В основном вам не нужно знать SQL для greendao:

Вы просто определить свои объекты (объектные классы) и отношения между ними.

На ваш вопрос:

Есть две возможности:

  • Bookshelve может содержать много книг и одна книга может быть только в одном bookshelve: Ваш подход является правильным.
  • книжная полка может содержать много книг, а одна книга может быть во многих книжных полках: вы должны определить emtity bookshelve2book, в котором хранятся пары.
+0

Спасибо за ваш быстрый и ясный комментарий! О SQL: я узнал, что мне также нужно daoSession.insert (b1) (не нашел это в документации). В противном случае getBook() вернет null. Также QueryBuilder явно SQL, но так, что вы не можете делать опечатки. Все еще думайте, что это лучшая вещь там (я, конечно, конечно) – Boy

+1

Конечно, вы можете создавать sql-запросы с greendao, но вам это не нужно. Наиболее важные запросы уже включены в greendao: getBooks(), например. – AlexS

Смежные вопросы