tutorial - room database developer android



Android Persistence Room: "Kann nicht herausfinden, wie dieses Feld von einem Cursor gelesen wird" (1)

https://developer.android.com/reference/android/arch/persistence/room/Relation.html ist wirklich verwirrend. Versuchen Sie es mit nur unter Klassen:

1) Benutzerentität:

@Entity
public class User {
    @PrimaryKey
    public int id; // User id
}

2) Haustier:

@Entity
public class Pet {
    @PrimaryKey
    public int id;     // Pet id
    public int userId; // User id
    public String name;
}

3) UserWithPets POJO:

// Note: No annotation required at this class definition.
public class UserWithPets {
   @Embedded
   public User user;

   @Relation(parentColumn = "id", entityColumn = "userId", entity = Pet.class)
   public List<Pet> pets; // or use simply 'List pets;'


   /* Alternatively you can use projection to fetch a specific column (i.e. only name of the pets) from related Pet table. You can uncomment and try below;

   @Relation(parentColumn = "id", entityColumn = "userId", entity = Pet.class, projection = "name")
   public List<String> pets; 
   */
}
  • parentColumn bezieht sich auf die id Spalte der Embedded User Tabelle.
  • entityColumn bezieht sich auf die userId ( User - Pet relation) -Spalte der Pet Tabelle.
  • entity bezieht sich auf die Tabelle ( Pet ), die in Beziehung zur User .

4) UserDao Dao:

@Dao
public interface UserDao {
    @Query("SELECT * FROM User")
    public List<UserWithPets> loadUsersWithPets();
}

loadUsersWithPets() jetzt loadUsersWithPets() , das die Benutzer mit ihrer Liste der Haustiere zurückgibt.

Bearbeiten: Siehe meine andere Antwort für viele oder viele Beziehung.

Ich versuche, mit der neuen Android Persistence Room Library eine Beziehung zwischen zwei Datenbanktabellen herzustellen. Ich habe mir die Dokumentation angesehen und versucht, das Beispiel zu implementieren, das sich unter https://developer.android.com/reference/android/arch/persistence/room/Relation.html :

 @Entity
 public class User {
 @PrimaryKey
     int id;
 }

 @Entity
 public class Pet {
     @PrimaryKey
     int id;
     int userId;
     String name;

 }

 @Dao
 public interface UserDao {
     @Query("SELECT * from User")
     public List<User> loadUser();
 }

 @Dao
 public interface PetDao {
     @Query("SELECT * from Pet")
     public List<Pet> loadUserAndPets();
 }


 public class UserAllPets {
     @Embedded
     public User user;
     @Relation(parentColumn = "user.id", entityColumn = "userId", entity = Pet.class)
     public List pets;
 }

 @Dao
 public interface UserPetDao {
     @Query("SELECT * from User")
     public List<UserAllPets> loadUserAndPets();
 }

Ich erhalte den folgenden Fehler

    ...error: Cannot figure out how to read this field from a cursor.

im Verhältnis zu:

 private java.util.List<?> pets;

Ich möchte darauf hinweisen, dass ich einige Dinge in ihren Dokumenten wirklich verwirrend fand. Zum Beispiel das Fehlen von @PrimaryKey und die Tatsache, dass in der User Klasse die Annotation @Entity fehlt, obwohl sie eine Entität sein soll (so wie ich es sehe). Ist jemand auf dasselbe Problem gestoßen? vielen Dank im Voraus