Ich verwende Room als Datenbank für die App. Ich habe ein Szenario, in dem ein Object
eines bestimmten Typs in separaten Tabellen gespeichert werden muss. Nehmen wir als Beispiel das Object
namens Book.java
Nun möchte ich zwei SQL-Tabellen haben:
ignorieren Sie bitte alle Namenskonventionen für SQL DB - dies ist nur ein Beispiel
Problem
Normalerweise würde man einfach @Entity(tableName = "Books_Read")
in der Klasse Book.java
verwenden und eine Klasse DAO
, die diesen Tabellennamen verwendet.
Das Ding ist; Wie könnte ich dann dieselbe Book.java
-Klasse zum Speichern in der Tabelle Books_To_Read
verwenden? Da ich @Entity(tableName = "Books_Read")
bereits als Teil der Klasse Book.java
definiert habe, sehe ich keinen Ort, an dem die Tabelle Books_To_Read
für die Klasse Book.java
Die einzige Lösung, die ich mir einfallen lassen konnte, war eine neue Klasse - nennen wir sie BookToRead.java
, die Book.java
erweitert und @Entity(tableName = "Books_To_Read")
in der Klasse definiert.
Frage
Gibt es einen besseren Weg, dies zu tun, oder ist dies der erwartete Weg, damit umzugehen?
Ihre Herangehensweise an das Problem ist falsch. Wenn Sie ein einzelnes Feld eines Datensatzes in nur einer Tabelle aktualisieren, z. B. "Author_name"
, werden die Daten in der anderen Tabelle ungenau.
Sie sollten doppelte Daten vermeiden, um sie konsistent zu machen. In einfachen Worten sollten Sie Details zu Büchern in nur einer Tabelle speichern, zB "Books"
. "Books_To_Read"
oder eine andere Tabelle sollte nur den Verweis auf die Tabelle "Books"
enthalten (unter Verwendung des ID / Primärschlüssels in "Books"
table). Sie können dann das Schlüsselwort JOIN
verwenden, um den gesamten Datensatz bei einer einzigen Abfrage abzurufen.
Ich schrieb eine Beispiel-App, als Ahamad seine Antwort gab.
Raum bietet eine Abstraktionsschicht über SQLite, die fließend ist Datenbankzugriff unter gleichzeitiger Nutzung der vollen Leistungsfähigkeit von SQLite.
Die Hauptidee ist dieselbe wie die, um Buchdaten in einer Tabelle zu speichern und die ID des Buchs in anderen Tabellen zu verwenden. Sehen Sie sich mein Projekt
anErgebnis von logcat
%Vor%So habe ich dieses Problem schließlich gelöst:
Ich habe der Klasse Book.java
eine ID hinzugefügt, die angibt, ob sie gelesen wurde oder nicht. Unterstützt von einem EnumType
, das entweder book_read
oder book_unread
war und dann in meinem DAO
für "BooksDataTable"
verwende ich dann einfach ein SQL query
zu select
das ID
Ich möchte. Wenn ich die Abfrage ändere, kann ich entweder alle books_read
oder books_to_read
oder all_books
erhalten. Auf diese Weise werden keine Daten dupliziert und alles befindet sich in einer Tabelle, ohne die Beziehungen JOIN
oder OneToMany
verwenden zu müssen.
Ich schlage vor, Sie fügen eine Flag-Spalte in der Buch-Tabelle hinzu, um anzuzeigen, ob dieses Buch gelesen oder gelesen wird.
Der beste Weg, dies wie angegeben zu erreichen, ist die Verwendung mehrerer Klassen, ja. (Sie können auch mehrere "Persistenzeinheiten" verwenden, aber das kompliziert alles).
Siehe
Wie die anderen Antworten zeigen, werden Sie besser Ihre Datenbank normalisieren und nur eine einzige "Bücher" -Tabelle haben und Ihre "books_to_read" ändern, um Verweise auf Bücher in der "Bücher" -Tabelle nach ID zu speichern.
Tags und Links java android mysql android-room