【问题标题】:error: Cannot figure out how to save this field into database in my model class错误:无法弄清楚如何在我的模型类中将此字段保存到数据库中
【发布时间】:2019-05-19 10:34:13
【问题描述】:

我正在开发一个新应用程序,但我的代码中出现以下错误:

无法弄清楚如何将此字段保存到数据库中。你可以 考虑为它添加一个类型转换器。

我已经尝试了 stackoverflow 中所有可能的解决方案,但没有奏效。

在我的 Article.java 模型类下面

@Entity(
        tableName = "article",
        foreignKeys = @ForeignKey(
                entity = Source.class,
                parentColumns = "id",
                childColumns = "source"
        ))

public class Article {
    @PrimaryKey
    @SerializedName("source")
    @NonNull
    @Expose

    @ColumnInfo(name ="source")
    private Source source;

    public Source getSource() {
        return source;
    }

    public void setSource(Source source) {
        this.source = source;
    }

    @SerializedName("author")
    @Expose
    @ColumnInfo(name = "author")
    private String author;
    @SerializedName("title")
    @Expose
    @ColumnInfo(name = "title")
    private String title;
    @SerializedName("description")
    @Expose
    @ColumnInfo(name = "description")
    private String description;
    @SerializedName("url")
    @Expose
    @ColumnInfo(name = "url")
    private String url;
    @SerializedName("urlToImage")
    @Expose
    @ColumnInfo(name = "urlToImage")
    private String urlToImage;

    @SerializedName("publishedAt")
    @Expose
    @ColumnInfo(name = "publishedAt")
    private String publishedAt;
    @SerializedName("content")
    @Expose
    @ColumnInfo(name = "content")
    private String content;





    public String getAuthor() {
        return author;
    }

    public void setAuthor(String author) {
        this.author = author;
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public String getDescription() {
        return description;
    }

    public void setDescription(String description) {
        this.description = description;
    }

    public String getUrl() {
        return url;
    }

    public void setUrl(String url) {
        this.url = url;
    }

    public String getUrlToImage() {
        return urlToImage;
    }

    public void setUrlToImage(String urlToImage) {
        this.urlToImage = urlToImage;
    }

    public String getPublishedAt() {
        return publishedAt;
    }

    public void setPublishedAt(String publishedAt) {
        this.publishedAt = publishedAt;
    }

    public String getContent() {
        return content;
    }

    public void setContent(String content) {
        this.content = content;
    }

}

在Source.java下面

道类以下

@Dao
public interface SportNewsDao {

    @Query("SELECT * FROM article")
    List<Article> getArticles();

    @Insert
    void insertAll(Article... article);
    @Delete
    void delete(Article article);

    @Update
    void update(Article article);

}

低于数据库类

@Database(entities = {Article.class,Source.class}, version = 1, exportSchema = false)
public  abstract class SportNewsDatabase extends RoomDatabase {
  public  abstract SportNewsDao sportNewsDao();
}

below SourceTypeConverter.java
public class  SourceTypeConverter {

    @TypeConverter
    public static Source ConvertSource(Source source){
        return source ==   null ? null : new Source(source);
    }

}

【问题讨论】:

    标签: java android-room


    【解决方案1】:

    为了使用您的SourceTypeCoverter,您需要将以下注释添加到您的SportNewsDatabase 类中

    @TypeConverters(SourceTypeConverter.class)
    

    此外,您的 SourceTypeConverter 可能缺少方法。您需要一种方法来将您的对象转换为某种形式的原语,然后从原语转换回您的对象。像这样的

    public class  SourceTypeConverter {
        @TypeConverter
        public static String ConvertSource(Source source){
            return source == null ? null : source.toString();
        }
    
        @TypeConverter
        public static Source ConvertSource(String source){
            return source == null ? null : new Source(source);
        }
    }
    
    

    您可以在此处阅读更多相关信息,Referencing Complex data using room

    请记住,使用 toString() 很可能无法解决此问题。您可能需要使用 Gson 之类的东西将您的对象转换为字符串并返回。


    如果这不起作用,您可以随时尝试@embeddedAndroid Room Embedded

    【讨论】:

      【解决方案2】:

      要让 Room 找到 SourceTypeConverter,您必须通过注释您的数据库、Dao 或实体来注册它:

      @TypeConverters(SourceTypeConverter.class)
      

      【讨论】:

        猜你喜欢
        • 2019-10-04
        • 2018-11-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多