Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/200.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Android Sugar ORM-带列表的类模型_Java_Android_List_Sqlite_Sugarorm - Fatal编程技术网

Java Android Sugar ORM-带列表的类模型

Java Android Sugar ORM-带列表的类模型,java,android,list,sqlite,sugarorm,Java,Android,List,Sqlite,Sugarorm,我正在尝试将我的android项目与SQLite数据库集成,但是我对这个数据库非常陌生,所以我用它来帮助我完成项目的数据库方面的工作 问题在于我的一个类模型包含以下列表: public class MyObject extends SugarRecord implements Parcelable { public String myString; public List<String> myStringList; public MyObject () {

我正在尝试将我的android项目与SQLite数据库集成,但是我对这个数据库非常陌生,所以我用它来帮助我完成项目的数据库方面的工作

问题在于我的一个类模型包含以下列表:

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);
    }
}
公共类MyObject扩展了SugarRecord实现了可包裹{
公共字符串myString;
公共列表myStringList;
公共MyObject(){}
私有MyObject(地块中){
myString=in.readString();
myStringList=newarraylist();
in.readList(myStringList,String.class.getClassLoader());
}
公共静态最终创建者=新创建者(){
public MyObject CreateFromParcel(Parcel in){返回新的MyObject(in);}
公共MyObject[]新数组(整数大小){返回新MyObject[size];}
};
@凌驾
public int descripbecontents(){return 0;}
@凌驾
公共无效写入包裹(包裹目的地,内部标志){
目的写入字符串(myString);
目的写作者(myStringList);
}
}
当我尝试读取数据库时,出现以下错误:

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

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

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

该行:

myStringList= new ArrayList<>();
myStringList=newarraylist();
应该是:

myStringList= new ArrayList<String>();
myStringList=newarraylist();

Sugar ORM不管理1到N个关系(通常使用列表解决的关系)。请检查以下内容:
SugarORM不支持存储
数组
列表
您可以使用一些策略来支持这一点,但需要引入依赖关系

基本思想是将数据列表转换为
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());
    }
}
import com.google.gson.gson;
公共类MyObject扩展了SugarRecord实现了Parcelable{
公共字符串myString;
@Ignore//Sugar将忽略此字段。
私有列表myStringList;//更改为私有(通过getter/setter方法访问)
私有字符串myStringListStore;//以JSON格式存储列表。
公共MyObject(){}
私有MyObject(地块中){
this.myString=in.readString();
this.myStringList=newarraylist();
in.readList(myStringList,String.class.getClassLoader());
}
公共静态最终创建者=新创建者(){
public MyObject CreateFromParcel(Parcel in){返回新的MyObject(in);}
公共MyObject[]新数组(整数大小){返回新MyObject[size];}
};
公共列表getMyStringList(){
//从JSON字符串转换为列表
myStringList=new Gson().fromJson(this.myStringListStore,new TypeToken(){}.getType());
返回myStringList;
}
公共设置mystringlist(列表stringList){
this.myStringList=stringList;
}
//覆盖保存以确保在保存前将列表转换为JSON。
@凌驾
公共长存盘(){
this.myStringListStore=new Gson().toJson(stringList);
返回super.save();
}
@凌驾
public int descripbecontents(){return 0;}
@凌驾
公共无效写入包裹(包裹目的地,内部标志){
目的写入字符串(myString);
dest.writeList(getMyStringList());
}
}

类似于@Seth Kigen所做的,但我没有重写save()方法,而是使用setter/getter将myStringList存储为字符串:

@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测试过了),对于更复杂的列表,您可能需要将myStringList转换为JsonObject,并根据需要更新setter/getter。
希望这有帮助。

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

public class Book extends SugarRecord {
    @Override
    public String toString() {
        return App.getGson().toJson(this);
    }
}
实用,快速,工作完美

public class Book extends SugarRecord {
    @Override
    public String toString() {
        return App.getGson().toJson(this);
    }
}