GreenDAO: almacena la lista de entidades en otra entidad
Estoy jugando con GreenDAO y creo que me gusta la forma en que funciona. No me gusta escribir código SQL, por lo que esto me ayudará a evitarlo;)
Pero aún así, creo que realmente es muy 'sql' basado en el pensamiento de cómo configurarlo. No estoy seguro de si esto es una cosa mala (para saber cómo funcionan las cosas), pero prefiero decir: aquí está mi objeto! ¡Guárdalo! Pero aún no he encontrado nada para esto …
- Android No se puede cifrar la base de datos utilizando sqlcipher usando greendao
- ¿Cómo realizar la siguiente consulta con Greendao?
- GreenDAO groupby cláusula
- GreenDAO - clave primaria en varias columnas
- GreenDAO crea una propiedad de ID automática
Pero bueno, lo que estoy haciendo es una especie de lo siguiente: Tengo un objeto, digamos una estantería. Puse algunos libros en la estantería.
Esto sería algo así como:
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);
Ok, ahora quiero almacenar esto usando GreenDAO. ¿Necesito usar 'addToMany' para esto? Asi que:
Property bookDataProperty = bookData.addLongProperty("bookShelve").getProperty(); ToMany books = BookShelve.addToMany(bookData, bookDataProperty); books.setName("Books");
Y luego hacer un:
bs.getBooks()
¿para conseguirlos? ¿O hay un mejor camino?
Creo que debería hacerse así, pero todavía no estoy completamente convencido.
Ps: puede haber typo en el código de arriba, sólo lo escribí aquí, no lo han compilado 🙂
Edit: Esto surgió después de que le di el 'respuesta' comprobar:
Así que, para agregar libros a una estantería, necesito:
b1.setBookShelve(bs.getId()); daoSession.insert(b1);
¿derecho?
- ¿Cómo construyo una consulta de GreenDao que carga todos los artículos especificados a través de una lista de identificadores?
- No se pudo asignar CursorWindow '/ pos-db' de tamaño 2097152 debido a error -24
- Android: ¿Cómo usar greenDao para los datos de carga asíncrona?
- GreenDAO se unió a la izquierda
- Muchos-a-Muchos compilan error usando greendao para android
- Cómo usar LoaderManager con Green-DAO
- GreenDao getter para entidades relacionadas devuelve lista vacía
- Comprender la eliminación y eliminación de relaciones en greenDao
Creo que no tienes que saber SQL, pero tendrás que conocer el conocimiento básico de la base de datos y ser claro para tu modelo ER, que creo que ya tienes.
Si utiliza greenDAO e implementa la relación entre Book y BookShelf , no necesita conservar la lista de libros de su biblioteca BookShelf.
En su DaoGenerator.java, simplemente declara el esquema
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);
Una vez que genere el código. Úsalos en tu código de 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()); }
Básicamente no necesita saber sql para greendao:
Simplemente defina sus entidades (clases de objetos) y las relaciones entre ellas.
A su pregunta:
Hay dos posibilidades:
- Bookshelve puede contener muchos libros y un libro sólo puede estar en una estantería: Su enfoque es correcto.
- Estantería puede contener muchos libros y un libro puede estar en muchas estanterías: Debe definir una emtity bookshelve2book que almacena las parejas.