2017-01-23 1 views
0

내 안드로이드 프로젝트를 SQLite 데이터베이스와 통합하려고하는데이 데이터베이스 물건에 익숙하지 않아서 Sugar ORM을 사용하여 프로젝트의 데이터베이스 측면을 도와주었습니다.안드로이드 설탕 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 이를 지원하기 위해 사용할 수 있지만 종속성을 도입 할 필요 전략이있다.

기본적인 아이디어는 @Seth Kigen는, 대신에() 메소드 저장 재정의하는 일, 내가 세터를 사용하고 유사 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

로 다음 JSON에 데이터의 목록을 변환 저장하는 것입니다/String로서 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() 
    } 
} 

이것은 그루비 코드,하지만 자바 코드는 매우 다른되지 않습니다, 사용 :

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

간단한 사용법 (Groovy로 테스트), 복잡한 목록의 경우 myStringList를 JsonObject로 변환하고 원하는대로 setter/getter를 업데이트해야 할 수도 있습니다. 희망이 도움이됩니다.