繁体   English   中英

如何在 android 工作室的房间数据库中存储 arraylist 数据

[英]How to store an arraylist data in room database in android studio

我是 android 工作室的初学者,想在房间数据库中存储语言的数组列表。 有人可以建议我怎么做吗?

您可以创建一个带有@Entity注释的 class ,因此您将拥有一个语言表。 例如

@Entity
class Language {
    @PrimaryKey
    Long id = null;
    String language;
}

然后,使用 @Database 注释的 class 将在实体列表中定义语言 class 作为@Database 注释的一部分。

然后,您将通过使用它的 id 列值来引用一种语言。 如果使用该语言的任何内容都具有单一语言(一个(语言)-多个(该语言的用户)关系),那么您将有一列引用(映射/关联/关联)所使用的语言,例如

@Entity(
        // Optional but enforces referential integrity
        foreignKeys = {
                @ForeignKey(
                        entity = Language.class,
                        parentColumns = {"languageId"},
                        childColumns = {"languageReference"},
                        // Optional within Foreign Key  manage deletion of parent by automatically deleting children
                        // i.e. deletions are cascaded to the children
                        onDelete = CASCADE,
                        // Optional  within Foreign Key manage update of parent column/columns that are referenced
                        onUpdate = CASCADE
                )
        }
)
class ObjectThatUsesALanguage {
    @PrimaryKey
    Long ObjectThatUsesALanguageId = null;
    @ColumnInfo(index = true) // optional but recommended index
    long languageReference; //<<<<< The single language used
}
  • 在这种情况下,将有一个 ObjectThatUsesALanguage 表。

如果无论使用什么语言,都可以有多种语言,那么对于多对多关系,您可以有一个关联/引用/映射表,其中至少有两列,一列用于引用该语言,另一列用于引用该语言的用户。 该语言的用户将是一个相对简单的表格,没有参考。 所以你可以: -

@Entity
class ObjectThatUsesManyLanguages {
    @PrimaryKey
    Long ObjectThatUsesManyLanguagesId = null;
}

@Entity(
        primaryKeys = {"ObjectThatUsesManyLanguagesReference","LanguageReference"},
        foreignKeys = {
                @ForeignKey(
                        entity = ObjectThatUsesManyLanguages.class,
                        parentColumns = {"ObjectThatUsesManyLanguagesId"},
                        childColumns = {"ObjectThatUsesManyLanguagesReference"},
                        onDelete = CASCADE,
                        onUpdate = CASCADE
                ),
                @ForeignKey(
                        entity = Language.class,
                        parentColumns = {"languageId"},
                        childColumns = {"LanguageReference"}
                )
        }
)
class ObjectThatUsesManyLanguagesToLanguageReference {
    long ObjectThatUsesManyLanguagesReference;
    @ColumnInfo(index = true)
    long LanguageReference;
}

但是,对于多对多关系,您需要一个 POJO(或 POJO)来检索语言用户以及语言(和/或反之亦然)

例如

class ObjectThatUsesManyLanguagesWithLanguages {
    @Embedded
    ObjectThatUsesManyLanguages objectThatUsesManyLanguages;
    @Relation(
            entity = ObjectThatUsesManyLanguages.class,
            parentColumn = "ObjectThatUsesManyLanguagesId",
            entityColumn = "languageId",
            associateBy = @Junction(
                     value = ObjectThatUsesManyLanguagesToLanguageReference.class,
                     parentColumn = "ObjectThatUsesManyLanguagesReference",
                     entityColumn = "LanguageReference"
            )
    )
    List<Language> languageList;
}

说许多人倾向于忽略正确/推荐的数据库使用(规范化),而只是想要一个对象列表作为一列。

例如(不能使用)之类的东西:-

@Entity
class ObjectThatUsesAListOfManyLanguages {
    @PrimaryKey
    long id;
    List<Language> languageList; 
}

如上所述不能使用,列不能是列表/数组

但是,可以通过使用“持有人” class 来克服它,例如

class LanguageHolder {
    List<Language> languageList;
}
  • 注意 如果没有其他属性,语言可能是字符串。

和这个结合:-

@Entity
class ObjectThatUsesAListOfManyLanguages {
    @PrimaryKey
    long id;
    LanguageHolder languages; 
}

BUT TypeConverters 然后需要将语言对象列表转换为可以存储的列类型。 通常这将是列表的 JSON 字符串表示形式。

使用这种技术,不需要/使用 Language 表,因此如果使用 Language 对象/类,则不需要(不应该)用 @Entity 注释。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM