Android Sugar ORM - Class 带有列表的模型
Android Sugar ORM - Class model with list
我正在尝试将我的 android 项目与 SQLite 数据库集成,但我对这个数据库很陌生,所以我使用 Sugar ORM 来帮助我处理项目的数据库方面.
问题是我的 class 模型之一包含列表:
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);
}
}
当我尝试读取我的数据库时出现此错误:
Class cannot be read from Sqlite3 database. Please check the type of field myStringList(java.util.List)
我想在我的数据库中创建列的方式不支持列表。有什么解决方法吗?我该如何处理?
Class cannot be read from Sqlite3 database. Please check the type of
field myStringList(java.util.List)
行:
myStringList= new ArrayList<>();
应该是:
myStringList= new ArrayList<String>();
Sugar ORM 不管理 1 对 N 的关系(您通常使用 List 解决的那种关系)。请检查这个:
SugarORM 不支持存储 Array
或 Lists
您可以使用一些策略来支持这一点,但需要您引入依赖项。
基本思路是将数据列表转换为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());
}
}
与@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代码,但java代码不会有太大区别,用法:
MyObject b1 = new MyObject()
b1.myStringList = ['Lars Vogella','Subramanian']
if (b1.save()){
Log.d('DEBUG', "'${b1}' Saved.")
}
这应该适用于简单的用法(我已经用 Groovy 对其进行了测试),对于更复杂的列表,您可能需要将 myStringList 转换为 JsonObject 并根据需要更新 setter/getter。
希望这有帮助。
以上所有选项均有效。但是更好的方法是覆盖正在列出的对象上的 toString 方法和 return json 字符串:
public class Book extends SugarRecord {
@Override
public String toString() {
return App.getGson().toJson(this);
}
}
实用、快速、完美。
我正在尝试将我的 android 项目与 SQLite 数据库集成,但我对这个数据库很陌生,所以我使用 Sugar ORM 来帮助我处理项目的数据库方面.
问题是我的 class 模型之一包含列表:
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);
}
}
当我尝试读取我的数据库时出现此错误:
Class cannot be read from Sqlite3 database. Please check the type of field myStringList(java.util.List)
我想在我的数据库中创建列的方式不支持列表。有什么解决方法吗?我该如何处理?
Class cannot be read from Sqlite3 database. Please check the type of field
myStringList(java.util.List)
行:
myStringList= new ArrayList<>();
应该是:
myStringList= new ArrayList<String>();
Sugar ORM 不管理 1 对 N 的关系(您通常使用 List 解决的那种关系)。请检查这个:
SugarORM 不支持存储 Array
或 Lists
您可以使用一些策略来支持这一点,但需要您引入依赖项。
基本思路是将数据列表转换为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());
}
}
与@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代码,但java代码不会有太大区别,用法:
MyObject b1 = new MyObject()
b1.myStringList = ['Lars Vogella','Subramanian']
if (b1.save()){
Log.d('DEBUG', "'${b1}' Saved.")
}
这应该适用于简单的用法(我已经用 Groovy 对其进行了测试),对于更复杂的列表,您可能需要将 myStringList 转换为 JsonObject 并根据需要更新 setter/getter。 希望这有帮助。
以上所有选项均有效。但是更好的方法是覆盖正在列出的对象上的 toString 方法和 return json 字符串:
public class Book extends SugarRecord {
@Override
public String toString() {
return App.getGson().toJson(this);
}
}
实用、快速、完美。