android - transaction - MĂșltiples tablas con el mismo tipo de objetos en la base de datos de habitaciones.
update firebase data (4)
¿Es esta la forma esperada de manejarlo?
No Es un enfoque equivocado. Debe eliminar la duplicación de datos por varias razones.
Le costará espacio de almacenamiento. A medida que aumenta el tamaño de la base de datos, esto comenzará a empeorar.
Hará que el sistema sea complicado. Si está actualizando un solo campo, es posible que deba realizar la misma acción en diferentes lugares. Si omite alguno de ellos, toda la información se volverá inconsistente. Es posible realizar tales operaciones como una sola transacción. Pero siempre es mejor mantener limpia la estructura de la base de datos.
Solución
Método 1: Presentar nuevas tablas
Puede almacenar los detalles de los libros en una sola tabla, por ejemplo, "Books"
. "Books_To_Read"
o cualquier otra tabla debe contener solo la referencia a la tabla "Books"
( utilizando la clave id / primary en la tabla "Books"
). Luego puede usar la palabra clave JOIN
para obtener el registro completo en una sola consulta.
Se prefiere este método si cada tipo (libros leídos y no leídos en este caso) tiene su propio conjunto de campos ( como la fecha de lectura, el tiempo de lectura para los libros de lectura y wish_to_read para los libros no leídos ).
Método 2: Introducir nuevo campo
Simplemente puede agregar un nuevo tipo que especifique el tipo. En este caso, solo hay dos tipos (leído y no leído), un campo booleano (algo como is_read
) estará bien.
Este sería el método más fácil. Pero esto solo funcionará si solo desea indicar a qué tipo pertenece la fila. Si necesita almacenar datos específicos del tipo e introduce campos adicionales para ese propósito, recuerde que esos campos también existen para otros tipos.
Estoy usando Room como la base de datos para la aplicación. Tengo un escenario en el que un Object
de un determinado tipo debe almacenarse en tablas separadas. Como ejemplo, tomemos el Object
llamado Book.java
Ahora, quiero tener dos tablas SQL:
- Libros leidos
- Libros para leer
ignore cualquier convención de nomenclatura para SQL DB, por favor, esto es solo un ejemplo
Problema
Normalmente, uno solo usaría @Entity(tableName = "Books_Read")
en la clase Book.java
y tendría una clase DAO
que usará ese nombre de tabla.
La cosa es; ¿Cómo podría entonces usar la misma clase Book.java
para almacenar en la tabla Books_To_Read
? Como ya @Entity(tableName = "Books_Read")
como parte de la clase Book.java
y no veo dónde definir la tabla Books_To_Read
para la clase Book.java
La única solución que pude encontrar, que parece un poco de piratería y falta de comprensión, fue crear una nueva clase: llamémosla BookToRead.java
que extiende Book.java
y defina @Entity(tableName = "Books_To_Read")
en el clase.
Pregunta
¿Hay una mejor manera de hacer esto o es la forma esperada de manejarlo?
Así es como eventualmente resolví este problema:
Agregué una identificación a la clase Book.java
que representa si se ha leído o no. Respaldado por un EnumType
que era book_read
o book_unread
y luego en mi DAO
para "BooksDataTable"
, solo uso una SQL query
para select
el ID
que deseo. Así que cambiando la consulta puedo obtener todos los books_read
o books_to_read
o all_books
. De esta manera, no hay duplicación de datos y todo está en una tabla, sin tener que usar las relaciones de OneToMany
o OneToMany
.
Estaba escribiendo una aplicación de muestra cuando Ahamad dio su respuesta.
Room proporciona una capa de abstracción sobre SQLite para permitir el acceso a la base de datos con fluidez mientras aprovecha todo el poder de SQLite.
La idea principal es la misma que la de almacenar los datos del Libro en una tabla y usar el ID del libro en otras tablas. echar un vistazo a mi project muestra
resultado de logcat
02-19 16:39:26.741 10520-10520/com.example.jingged.roomtest E/MainActivity: Book{id = 1 name = Book 0, author Author 0}
02-19 16:39:26.741 10520-10520/com.example.jingged.roomtest E/MainActivity: Book{id = 2 name = Book 1, author Author 1}
02-19 16:39:26.741 10520-10520/com.example.jingged.roomtest E/MainActivity: Book{id = 3 name = Book 2, author Author 2}
02-19 16:39:26.741 10520-10520/com.example.jingged.roomtest E/MainActivity: Book{id = 4 name = Book 3, author Author 3}
02-19 16:39:26.767 10520-10520/com.example.jingged.roomtest E/MainActivity: BookToRead Book{id = 3 name = Book 2, author Author 2}
02-19 16:39:26.767 10520-10520/com.example.jingged.roomtest E/MainActivity: BookToRead Book{id = 4 name = Book 3, author Author 3}
02-19 16:39:26.768 10520-10520/com.example.jingged.roomtest E/MainActivity: BooksRead Book{id = 1 name = Book 0, author Author 0}
02-19 16:39:26.768 10520-10520/com.example.jingged.roomtest E/MainActivity: BooksRead Book{id = 2 name = Book 1, author Author 1}
@OneToMany(mappedBy="book_id")
private Set<Book> book
Creo que esta es la mejor manera de conectar dos tablas. Pruébalo y déjame saber tu retroalimentación. Le daré otra solución