Mehrere Tabellen mit demselben Objekttyp in der Raumdatenbank

9

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:

  • Bücher_Lesen
  • Books_To_Read

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

definiert werden kann

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?

    
Tander 16.01.2018, 10:50
quelle

6 Antworten

6

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.

    
Ahamad Anees 19.02.2018 10:44
quelle
0
%Vor%

Ich denke, das ist der beste Weg, um zwei Tabellen zu verbinden. Probieren Sie es aus und lassen Sie mich Ihr wissen    Feedback. Ich werde eine andere Lösung geben.

    
Muthu 17.02.2018 14:30
quelle
0

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

an

Ergebnis von logcat

%Vor%     
Sahil Manchanda 19.02.2018 11:30
quelle
0

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.

    
Tander 20.02.2018 06:10
quelle
0

Ich schlage vor, Sie fügen eine Flag-Spalte in der Buch-Tabelle hinzu, um anzuzeigen, ob dieses Buch gelesen oder gelesen wird.

    
sotondolphin 20.02.2018 07:28
quelle
-2

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.

    
Rich 13.02.2018 15:10
quelle

Tags und Links