update transaction realtime node listas leer escribir ejemplo datos data borrar android sql database database-design android-room

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