2017-01-23 4 views
0

Я пытаюсь интегрировать свой проект андроида с базой данных SQLite, но я довольно новичок в этой базе данных, поэтому я использую Sugar ORM, чтобы помочь мне с базой данных в проекте.Android 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); 
    } 
} 

Когда я пытаюсь прочитать мою базу данных я получаю эту ошибку:

Class cannot be read from Sqlite3 database. Please check the type of field myStringList(java.util.List)

Я полагаю, как столбцы создаются на моя база данных не поддерживает списки. Есть ли обходной путь для этого? Как я должен это подходить?

ответ

2

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()); 
    } 
} 
0

Class cannot be read from Sqlite3 database. Please check the type of field myStringList(java.util.List)

Линия:

myStringList= new ArrayList<>(); 

должно быть:

myStringList= new ArrayList<String>(); 
0

Аналогично, что @Seth Kigen делает, но вместо того, чтобы переопределение сохранить() метод, я использую сеттер/добытчика для хранения 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 и обновить сеттер/получатель по вашему желанию. Надеюсь, это поможет.

Смежные вопросы