2016-07-17 11 views
0

Ich habe gerade TinyDB entdeckt, was sehr nützlich erscheint, um Objektspeicher in den SharedPreferences zu behandeln.TinyDB - SharedPreferences - bekommen: vergessen, einen Typ Adapter zu registrieren?

Ich bin fast da, aber ich bekomme einen Fehler: Haben Sie vergessen, einen Typ Adapter zu registrieren? Beachten Sie, dass die GSON-Bibliothek von Google zusammen mit TinyDB verwendet wird.

Also, lassen Sie mich meinen Code mit Ihnen teilen. Jede Hilfe würde sehr geschätzt werden.

Hier ist die stacktrace ist

java.lang.UnsupportedOperationException: Attempted to serialize 
java.lang.Class: com.ilepez.weatherapp.data.model.CityArrayList. Forgot to register a type adapter? 
at com.google.gson.internal.bind.TypeAdapters$1.write(TypeAdapters.java:76) 
at com.google.gson.internal.bind.TypeAdapters$1.write(TypeAdapters.java:69) 
at com.google.gson.Gson.toJson(Gson.java:669) 
at com.google.gson.Gson.toJson(Gson.java:648) 
at com.google.gson.Gson.toJson(Gson.java:603) 
at com.google.gson.Gson.toJson(Gson.java:583) 
at com.ilepez.weatherapp.utils.TinyDB.putObject(TinyDB.java:462) 
at com.ilepez.weatherapp.activity.SearchActivity.onItemClick(SearchActivity.java:67) 
at android.widget.AutoCompleteTextView.performCompletion(AutoCompleteTextView.java:928) 
at android.widget.AutoCompleteTextView.access$500(AutoCompleteTextView.java:93) 
at android.widget.AutoCompleteTextView$DropDownItemClickListener.onItemClick(AutoCompleteTextView.java:1230) 
at android.widget.AdapterView.performItemClick(AdapterView.java:345) 
at android.widget.AbsListView.performItemClick(AbsListView.java:1547) 
at android.widget.AbsListView$PerformClick.run(AbsListView.java:3821) 
at android.widget.AbsListView$3.run(AbsListView.java:5841) 
at android.os.Handler.handleCallback(Handler.java:739) 
at android.os.Handler.dispatchMessage(Handler.java:95) 
at android.os.Looper.loop(Looper.java:158) 
at android.app.ActivityThread.main(ActivityThread.java:7229) 
at java.lang.reflect.Method.invoke(Native Method) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120) 
    07-17 10:55:26.283 15392-15392/com.ilepez.weatherapp E/libEGL: call to OpenGL ES API with no current context (logged once per thread) 

Also, lassen Sie mich mit Ihnen meinen Code teilen. Jede Hilfe würde sehr geschätzt werden.

So, hier ist der Moment, als ich TinyDB mein Objekt hinzufügen

City city = new City(description, itemLatitude, itemLongitude); 
       ArrayList<Object> savedCity = new ArrayList<>(); 
       savedCity.add(city); 
for (City oCity : CityArrayList.getInstance().getCityList()) { 
    savedCity.add(oCity); 
} 

TinyDB tinydb = new TinyDB(this); 
tinydb.putObject("city", CityArrayList.class); 

Hier mein Modell

public class CityArrayList { 

    public ArrayList<City> cityList; 

    private CityArrayList() { 
     cityList = new ArrayList<City>(); 
    } 

    public ArrayList<City> getCityList() { 
     return cityList; 
    } 

    private static CityArrayList instance; 

    public static CityArrayList getInstance() { 
     if (instance == null) instance = new CityArrayList(); 
     return instance; 
    } 
} 

ist und für die Stadt selbst

public class City { 

    private String cityName; 
    private double cityLat; 
    private double cityLong; 

    public City(String cityName, double cityLat, double cityLong) { 
     this.cityName = cityName; 
     this.cityLat = cityLat; 
     this.cityLong = cityLong; 
    } 

    public String getCityName() { 
     return cityName; 
    } 

    public void setCityName(String cityName) { 
     this.cityName = cityName; 
    } 

    public double getCityLat() { 
     return cityLat; 
    } 

    public void setCityLat(double cityLat) { 
     this.cityLat = cityLat; 
    } 

    public double getCityLong() { 
     return cityLong; 
    } 

    public void setCityLong(double cityLong) { 
     this.cityLong = cityLong; 
    } 

    @Override 
    public String toString() { 
     return "City{" + 
       "cityName='" + cityName + '\'' + 
       ", cityLat=" + cityLat + 
       ", cityLong=" + cityLong + 
       '}'; 
    } 
} 
+0

wahrscheinlich Realm verwenden sollten. sharedPrefences können vom Benutzer mit den App-Einstellungen gelöscht werden. – Shubhank

+0

Vielen Dank @Shubhank, ich werde mit Realm untersuchen. Traurig, keine Lösung gefunden zu haben ... – Isabelle

+0

'... Objektspeicher in SharedPreferences zu behandeln' ... das ist in der Tat ein [** Anti-Pattern **] (https://en.wikipedia.org/ Wiki/Anti-Muster). Lassen Sie mich dringend davon abraten, Objekte mithilfe von SharedPreferences zu speichern und zu laden. –

Antwort

3

Sie geben das Falsche ein. Die Methode putObject erfordert, dass Sie einen String-Schlüssel und ein bereits intantiiertes Objekt nicht eine Klassenart übergeben.

hier ist, was Ihr Code sollte ordnungsgemäß funktionieren sein:

City mCity = new City(description, itemLatitude, itemLongitude); 
tinydb.putObject("city", mCity);