2017-11-16 17 views
5

Odkryłem bibliotekę mapowania obiektów bazy danych Room i pomyślałem coś dziwnego.Dlaczego encje pokojowe nie działają z niezmiennymi właściwościami w Androidzie

Model danych encji nie może mieć właściwości niezmiennych, jak sugeruje odpowiedź this.

Ale sprawdziłem też, czy google's persistent example with kotlin, działa z niezmiennymi właściwościami. Sprawdź klasę danych this na przykładzie.

Jaki może być powód takiego zachowania?

Może to być dobra funkcja, jeśli możemy tworzyć niezmienne wartości (val właściwości), ponieważ ogranicza to programistów przed zmienianiem unikalnych identyfikatorów, takich jak identyfikatory po utworzeniu obiektu.

+0

Nie jestem ekspertem w pokoju specjalnie, ale wierzę, że jeśli chcesz używać 'val ', musisz podać wartości domyślne dla wszystkiego, ponieważ może opierać się na domyślnym konstruktorze lub czymś, o ile to się ostatnio nie zmieniło. Ponadto nie będzie można zmienić wartości po ich ustawieniu. –

+0

@JanVladimirMostert Dzięki za odpowiedź. Testowałem to z domyślnymi wartościami, nadal problem zdaje się występować –

Odpowiedz

1

To dziwne, bo mogę zrobić moja klasa jednostki przy użyciu val dla wszystkich moich polach bez problemu

@Entity(tableName = "repo") 
data class RepoEntity(
     @PrimaryKey @ColumnInfo(name = "id") @SerializedName("id") val id: Int, 
     @ColumnInfo(name = "name") @SerializedName("name") val name: String, 
     @ColumnInfo(name = "full_name") @SerializedName("full_name") val fullName: String, 
     @Embedded(prefix = "owner") @SerializedName("owner") val owner: RepoOwnerEntity, 
     @ColumnInfo(name = "html_url") @SerializedName("html_url") val htmlUrl: String, 
     @ColumnInfo(name = "description") @SerializedName("description") val description: String? 
) 

a dane nadal prawidłowo przechowywany w bazie danych. enter image description here

+0

Czy mógłbyś opublikować swoje pliki gradle? Zarówno poziom projektu, jak i poziom modułu? –

+0

Możesz sprawdzić cały kod w repozytorium github> https://github.com/RR12/KU-Android-Project-Setup wszystkie rzeczy związane z db powinny znajdować się w module 'data'. –

0

Uważam, że problem wynika z pewnych pól, które nie mogą być parametrami konstruktora. Z Javadoc z @Relation adnotacji:

Zauważ, że odnotowany Dziedzina @Relation nie może być parametrem konstruktora, to musi być publiczne lub mieć publiczny setter.

Jako obejście, miałem prywatną parametr konstruktora _myRelationProperty i pole publicznym:

val myRelationProperty: List<MyThings> get() = _myRelationProperty

Powiązane problemy