2016-03-27 5 views
-1

Я использую Firebase в качестве backend для своего приложения. Но я не могу сериализовать PolylineOptions от Firebase до типа PolylineOptions. Если я попытаюсь преобразовать его обратно с dataSnapshot.getValue (PolylineOptions.class);, я следующее сообщение об ошибке:Firebase Serialize PolylineOptions

com.firebase.client.FirebaseException: Failed to bounce to type 
.... 
Caused by: com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: 
Unrecognized field "width" (class com.google.android.gms.maps.model.PolylineOptions), not marked as ignorable (one known property: "points"]) 
.... 
at com.fasterxml.jackson.databind.DeserializationContext.reportUnknownProperty(DeserializationContext.java:555) 

Как я могу исправить эту проблему?

Вот код, который демонстрирует проблему:

import android.location.Location; 
import android.os.Bundle; 
import android.support.v4.content.ContextCompat; 
import android.support.v7.app.AppCompatActivity; 
import android.util.Log; 
import com.firebase.client.Query; 
import com.google.android.gms.maps.model.PolylineOptions; 
import com.google.android.gms.maps.model.LatLng; 
import com.firebase.client.DataSnapshot; 
import com.firebase.client.Firebase; 
import com.firebase.client.FirebaseError; 
import com.firebase.client.ValueEventListener; 


public class MainActivity extends AppCompatActivity{ 

    PolylineOptions mPolylineOptions; 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     mPolylineOptions = new PolylineOptions(); 

     Location targetLocation = new Location("name"); 
     targetLocation.setLatitude(1.0d); 
     targetLocation.setLongitude(2.0d); 

     mPolylineOptions.add(new LatLng(targetLocation.getLatitude(), targetLocation.getLongitude())); 
     mPolylineOptions.color(ContextCompat.getColor(this, R.color.colorPrimary)); 

     Firebase.setAndroidContext(this); 
     Firebase ref = new Firebase("https://xxxxxxx"); 
     Firebase testRef = ref.child("test"); 

     final Query queryRef = testRef.orderByKey(); 
     queryRef.addValueEventListener(new ValueEventListener() { 

      @Override 
      public void onDataChange(DataSnapshot dataSnapshot) { 
       Log.d("Test", "data change"); 
       PolylineOptions activity1 = dataSnapshot.getValue(PolylineOptions.class); 
      } 

      @Override 
      public void onCancelled(FirebaseError firebaseError) { 
       System.out.println("The read failed: " + firebaseError.getMessage()); 
      } 
     }); 
     testRef.setValue(mPolylineOptions); 
    } 
} 

Вот является JSON из Firebase:

Вот в JSON из Firebase:

{ 
    "test" : { 
    "clickable" : false, 
    "color" : -12627531, 
    "geodesic" : false, 
    "points" : [ { 
     "latitude" : 50.68468468468468, 
     "longitude" : 8.190167190445726 
    } ], 
    "visible" : true, 
    "width" : 10.0, 
    "zindex" : 0.0 
    } 
} 
+0

Как говорится в сообщении об ошибке: ваш объект Java имеет поле, в то время как ваш JSON имеет «точки». Здесь мы больше ничего не можем сказать, не видя более полезной информации. Добавьте фрагмент вашего JSON в виде текста (без скриншота), который вы можете легко получить с помощью кнопки «Экспорт» в панели мониторинга Firebase. Затем также добавьте код, который вы используете для чтения этого JSON из базы данных. См. [MCVE] (http://stackoverflow.com/help/mcve). –

+0

Выложите пример с полным кодом в верхний пост. Также я опубликовал форму JSON Firebase ... –

+0

Обратите внимание, что M в MCVE означает ** минимальный **. Я сомневаюсь, что сама обработка местоположений имеет отношение к исключению. Поэтому, если вы удалите это из вопроса (при сохранении кода и воспроизведении проблемы), вы избавляете нас от понимания того, что он делает. Чем проще вы сделаете это для нас, чтобы помочь вам, тем более вероятно, что кто-то поможет. –

ответ

1

Минимальные классы, необходимые для читать ваши JSON:

public static class LatLon { 
    public double latitude; 
    public double longitude; 
} 
public static class Test { 
    public boolean clickable; 
    public long color; 
    public boolean geodesic; 
    public LatLon[] points; 
    public boolean visible; 
    public double width; 
    public double zindex; 
} 

Я бы не стал называть их лучшей практикой, поскольку они больше похожи на C struct s, чем классы. Для того, чтобы сделать их немного чище:

  • сделать все поля private вместо если public
  • добавить геттер для каждого поля (так getLatitude() и getLongitude() для class LatLon)
0

Я закодировал liitle бит и вот мои работоспособные модели:

public class PolylineOptions { 
    public boolean clickable; 
    public long color; 
    public boolean geodesic; 
    public LatLng[] points = new LatLng[1];; 
    public boolean visible; 
    public double width; 
    public double zindex; 

    public PolylineOptions(){ 

    } 

    public void add(LatLng point){ 
     points[0] = point; 
    } 
} 


public class LatLng { 
    public double latitude; 
    public double longitude; 

    public LatLng(double latitude, double longitude) { 
     this.latitude = latitude; 
     this.longitude = longitude; 
    } 

    public LatLng(){ 

    } 
} 

Но очень часто я получаю мансарду о.э.р. подобное:

Error:(32, 32) error: incompatible types: app.firebasetest.PolylineOptions cannot be converted to com.google.android.gms.maps.model.PolylineOptions 

на линии, как:

GoogleMaps mGoogleMap.addPolyline(mPolylineOptions); 

Я не нужны объекты GoogleMaps в Firebase так мне не нужно, чтобы написать модель для этого типа тоже. Как я могу убедить мое приложение взять мою модель?