Cannot figure out how to save this field into database. You can consider adding a type converter for

  • 一.场景:使用Room框架,报错,Cannot figure out how to save this field into database. You can consider adding a type converter for it。在ClassMomentInfo类中包含了两个成员变量,mMediaBeans和mClazzs,运行时候提示以上错误。错误代码如下:
@Entity(tableName = "classMomentInfo")
public class ClassMomentInfo {

    @PrimaryKey(autoGenerate=true)
    private long uid;
    
   //省略代码...

    //ROOM不支持直接存储集合
    //@TypeConverters(MediaBeanTypeConverter.class)                       
    private List<MediaBean> mMediaBeans;
    
    //@TypeConverters(StringTypeConverter.class)
    private List<String> mClazzs;

     //省略代码...
}
  • 二.原因,Room不支持直接存储列表的功能
  • 三.解决方案
  • 3.1.新建类XxxConverter,代码如下:
import android.arch.persistence.room.TypeConverter;

import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import java.lang.reflect.Type;
import java.util.Collections;
import java.util.List;

/**
 * describe:使用Room框架,room不支持对象中直接存储集合
 * https://stackoverflow.com/questions/53812636/android-error-cannot-figure-out-how-to-save-this-field-into-database-you-can
 */
public class StringTypeConverter {

    Gson gson = new Gson();

    @TypeConverter
    public List<String> stringToSomeObjectList(String data) {
        if (data == null) {
            return Collections.emptyList();
        }

        Type listType = new TypeToken<List<String>>() {}.getType();

        return gson.fromJson(data, listType);
    }

    @TypeConverter
    public String someObjectListToString(List<String> someObjects) {
        return gson.toJson(someObjects);
    }

}
  • 3.2.接着在ClassMomentInfo类中,在成员变量mClazzs上方添加"@TypeConverters(StringTypeConverter.class)";
  • 3.3.需要注意的是:在ClassMomentInfo类中,还有另外一个成员变量mMediaBeans,由于该成员变量存储的是MediaBean类型,所以需要单独创建类似StringTypeConverter的类,且需要在mMediaBeans上方加上“@TypeConverters(MediaBeanTypeConverter.class)”。此时,新建MediaBeanTypeConverter类,代码如下:
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import com.pj.teacherlocal.entity.work.MediaBean;
import java.lang.reflect.Type;
import java.util.Collections;
import java.util.List;

public class MediaBeanTypeConverter {

    Gson gson = new Gson();

    @TypeConverter
    public List<MediaBean> stringToSomeObjectList(String data) {
        if (data == null) {
            return Collections.emptyList();
        }

        Type listType = new TypeToken<List<MediaBean>>() {}.getType();

        return gson.fromJson(data, listType);
    }

    @TypeConverter
    public String someObjectListToString(List<MediaBean> someObjects) {
        return gson.toJson(someObjects);
    }

}
  • 3.4.综上,处理方案已经很明显了。
  • 四.为了避免有些小伙伴疑惑,我将类ClassMomentInfo和类MediaBean的完整代码贴出来。

ClassMomentInfo

import android.arch.persistence.room.Embedded;
import android.arch.persistence.room.Entity;
import android.arch.persistence.room.PrimaryKey;
import android.arch.persistence.room.TypeConverters;

import com.pj.teacherlocal.entity.CurrentTeacherInfo;
import com.pj.teacherlocal.utils.MediaBeanTypeConverter;
import com.pj.teacherlocal.utils.StringTypeConverter;

import java.util.List;

@Entity(tableName = "classMomentInfo")
public class ClassMomentInfo {

    @PrimaryKey(autoGenerate=true)
    private long uid;

    private String content;

    private String date;

    //ROOM不支持直接存储集合
    @TypeConverters(MediaBeanTypeConverter.class)                     
    private List<MediaBean> mMediaBeans;
    @TypeConverters(StringTypeConverter.class)
    private List<String> mClazzs;

    //关联另外一个对象
    @Embedded
    private CurrentTeacherInfo mCurrentTeacherInfo;

    public long getUid() {
        return uid;
    }

    public void setUid(long uid) {
        this.uid = uid;
    }

    public String getContent() {
        return content;
    }

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

    public String getDate() {
        return date;
    }

    public void setDate(String date) {
        this.date = date;
    }

    public List<MediaBean> getMediaBeans() {
        return mMediaBeans;
    }

    public void setMediaBeans(List<MediaBean> mediaBeans) {
        mMediaBeans = mediaBeans;
    }

    public List<String> getClazzs() {
        return mClazzs;
    }

    public void setClazzs(List<String> clazzs) {
        mClazzs = clazzs;
    }

    public CurrentTeacherInfo getCurrentTeacherInfo() {
        return mCurrentTeacherInfo;
    }

    public void setCurrentTeacherInfo(CurrentTeacherInfo currentTeacherInfo) {
        mCurrentTeacherInfo = currentTeacherInfo;
    }

    @Override
    public String toString() {
        return "ClassMomentInfo{" +
                "uid=" + uid +
                ", content='" + content + '\'' +
                ", date='" + date + '\'' +
                ", mMediaBeans=" + mMediaBeans +
                ", mClazzs=" + mClazzs +
                ", mCurrentTeacherInfo=" + mCurrentTeacherInfo +
                '}';
    }

}

MediaBean

public class MediaBean {

    private String url;

    public String getUrl() {
        return url;
    }

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

    @Override
    public String toString() {
        return "MediaBean{" +
                "url='" + url + '\'' +
                '}';
    }

}
  • 6
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值