Android Sugar ORM - 带列表的类模型

时间:2017-01-23 17:12:12

标签: java android list sqlite sugarorm

我正在尝试将我的android项目与SQLite数据库集成,但我对这个数据库的东西很新,所以我使用Sugar ORM来帮助我完成项目的数据库方面。

问题是我的班级模型之一包含列表:

public class MyObject extends SugarRecord implements Parcelable {

    public String myString;
    public List<String> myStringList;

    public MyObject () { }

    private MyObject (Parcel in) {
        myString= in.readString();
        myStringList= new ArrayList<>(); 
        in.readList(myStringList, String.class.getClassLoader());
    }

    public static final Creator<MyObject> CREATOR = new Creator<MyObject>() {
        public MyObjectcreateFromParcel(Parcel in) { return new MyObject(in); }
        public MyObject[] newArray(int size) { return new MyObject[size]; }
    };

    @Override
    public int describeContents() { return 0; }

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeString(myString);
        dest.writeList(myStringList);
    }
}

当我尝试读取我的数据库时,我收到此错误:

  

无法从Sqlite3数据库中读取类。请检查字段myStringList(java.util.List)

的类型

我想在我的数据库不支持列表上创建列的方式。这有什么解决方法吗?我该怎么办?

5 个答案:

答案 0 :(得分:3)

SugarORM不支持存储ArrayLists 有一些策略可用于支持此功能,但需要引入依赖项。

基本思路是将数据列表转换为JSON,然后将其存储为String

import com.google.gson.Gson;

public class MyObject extends SugarRecord implements Parcelable {
    public String myString;
    @Ignore //Sugar will ignore this field. 
    private List<String> myStringList;  //Change to private (accessed via getter/setter method)
    private String myStringListStore; //to store the list in JSON format. 

    public MyObject () { }

    private MyObject (Parcel in) {
        this.myString= in.readString();
        this.myStringList= new ArrayList<>(); 
        in.readList(myStringList, String.class.getClassLoader());
    }

    public static final Creator<MyObject> CREATOR = new Creator<MyObject>(){
        public MyObjectcreateFromParcel(Parcel in) { return new MyObject(in); }
        public MyObject[] newArray(int size) { return new MyObject[size]; }
    };

    public List<String> getMyStringList(){
        //Convert from JSON string to List
       myStringList =  new Gson().fromJson(this.myStringListStore,new TypeToken<List<String>>(){}.getType());
       return myStringList;
    }

    public setMyStringList(List<String> stringList){
        this.myStringList = stringList;
    }

    //Override save to ensure the list is converted into JSON before saving. 
    @Override
    public long save(){
        this.myStringListStore = new Gson().toJson(stringList); 
        return super.save();
    }

    @Override
    public int describeContents() { return 0; }

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeString(myString);
        dest.writeList(getMyStringList());
    }
}

答案 1 :(得分:0)

  

无法从Sqlite3数据库中读取类。请检查类型   字段myStringList(java.util.List)

该行:

myStringList= new ArrayList<>();

应该是:

myStringList= new ArrayList<String>();

答案 2 :(得分:0)

Sugar ORM不管理1到N个关系(通常用List解决的关系类型)。请检查一下: https://stackoverflow.com/a/44879733/3891283

答案 3 :(得分:0)

与@Seth Kigen类似,但不是覆盖save()方法,而是使用setter / getter将myStringList存储为String:

@CompileStatic
class MyObject  extends SugarRecord {

    @Ignore
    private List<String> myStringList

    // do not use this field
    String myStringListStore

    List<String> getMyStringList() {
        return myStringListStore.split(',').toList()
    }

    void setMyStringList(List<String> a) {
        this.myStringListStore = a.toString()
    }
}

这是Groovy代码,但java代码不会有很大不同,用法:

    MyObject b1 = new MyObject()
    b1.myStringList = ['Lars Vogella','Subramanian']
    if (b1.save()){
        Log.d('DEBUG', "'${b1}' Saved.")
    }

这应该用于简单的用法(我已经使用Groovy进行了测试),对于更复杂的List,您可能需要将myStringList转换为JsonObject并根据需要更新setter / getter。 希望这会有所帮助。

答案 4 :(得分:0)

以上所有选项均有效。但更好的方法是覆盖列出的对象上的toString方法并返回json字符串:

 2282   1525345797494   4   0   0   35  338 333 664 245 244 245 0   0   0   0   0   0   0   0   0   1243    -92 12  -18 2018-03-05 16:39:00

实用,快速,完美。