2016-05-18 21 views
9

Voglio creare un'applicazione Android che può essere eseguita mentre online e offline. È possibile combinare Realm.io per il database offline e Firebase come servizio online.Combina Realm.io e Firebase

Sto cercando di rendere semplice applicazione che aggiunge direttamente oggetto regno di Firebase, ma io ottenere un'eccezione errore come questo:

java.lang.NoClassDefFoundError: rx.Observable 
at libcore.reflect.InternalNames.getClass(InternalNames.java:55) 
at java.lang.Class.getDexCacheType(Class.java:476) 
at java.lang.reflect.Method.getReturnType(Method.java:183) 
at java.lang.Class.getDeclaredMethods(Class.java:672) 
at com.fasterxml.jackson.databind.introspect.AnnotatedClass._addMemberMethods(AnnotatedClass.java:593) 
at com.fasterxml.jackson.databind.introspect.AnnotatedClass.resolveMemberMethods(AnnotatedClass.java:421) 
at com.fasterxml.jackson.databind.introspect.AnnotatedClass.memberMethods(AnnotatedClass.java:243) 
at com.fasterxml.jackson.databind.introspect.POJOPropertiesCollector._addMethods(POJOPropertiesCollector.java:457) 
at com.fasterxml.jackson.databind.introspect.POJOPropertiesCollector.collect(POJOPropertiesCollector.java:233) 
at com.fasterxml.jackson.databind.introspect.BasicClassIntrospector.collectProperties(BasicClassIntrospector.java:142) 
at com.fasterxml.jackson.databind.introspect.BasicClassIntrospector.forSerialization(BasicClassIntrospector.java:68) 
at com.fasterxml.jackson.databind.introspect.BasicClassIntrospector.forSerialization(BasicClassIntrospector.java:11) 
at com.fasterxml.jackson.databind.SerializationConfig.introspect(SerializationConfig.java:490) 
at com.fasterxml.jackson.databind.ser.BeanSerializerFactory.createSerializer(BeanSerializerFactory.java:133) 
at com.fasterxml.jackson.databind.SerializerProvider._createUntypedSerializer(SerializerProvider.java:873) 
at com.fasterxml.jackson.databind.SerializerProvider._createAndCacheUntypedSerializer(SerializerProvider.java:833) 
at com.fasterxml.jackson.databind.SerializerProvider.findValueSerializer(SerializerProvider.java:387) 
at com.fasterxml.jackson.databind.SerializerProvider.findTypedValueSerializer(SerializerProvider.java:478) 
at com.fasterxml.jackson.databind.ser.DefaultSerializerProvider.serializeValue(DefaultSerializerProvider.java:97) 
at com.fasterxml.jackson.databind.ObjectMapper._convert(ObjectMapper.java:2593) 
at com.fasterxml.jackson.databind.ObjectMapper.convertValue(ObjectMapper.java:2542) 
at com.firebase.client.Firebase.setValueInternal(Firebase.java:336) 
at com.firebase.client.Firebase.setValue(Firebase.java:298) 
at com.pringstudio.firebaserealm.MainActivity$1.onClick(MainActivity.java:56) 
at android.view.View.performClick(View.java:5198) 
at android.view.View$PerformClick.run(View.java:21147) 
at android.os.Handler.handleCallback(Handler.java:739) 
at android.os.Handler.dispatchMessage(Handler.java:95) 
at android.os.Looper.loop(Looper.java:148) 
at android.app.ActivityThread.main(ActivityThread.java:5417) 
at java.lang.reflect.Method.invoke(Native Method) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 
                       Caused by: java.lang.ClassNotFoundException: Didn't find class "rx.Observable" on path: DexPathList[[dex file "/data/data/com.pringstudio.firebaserealm/files/instant-run/dex/slice-tubesock-0.0.12_19946b0113470caa2e5e499f498247824b9e76d9-classes.dex", dex file "/data/data/com.pringstudio.firebaserealm/files/instant-run/dex/slice-support-annotations-23.3.0_ce4b168a6a58bc3fcd41c2a9e083ac97b17599a0-classes.dex", dex file "/data/data/com.pringstudio.firebaserealm/files/instant-run/dex/slice-slice_9-classes.dex", dex file "/data/data/com.pringstudio.firebaserealm/files/instant-run/dex/slice-slice_8-classes.dex", dex file "/data/data/com.pringstudio.firebaserealm/files/instant-run/dex/slice-slice_7-classes.dex", dex file "/data/data/com.pringstudio.firebaserealm/files/instant-run/dex/slice-slice_6-classes.dex", dex file "/data/data/com.pringstudio.firebaserealm/files/instant-run/dex/slice-slice_5-classes.dex", dex file "/data/data/com.pringstudio.firebaserealm/files/instant-run/dex/slice-slice_4-classes.dex", dex file "/data/data/com.pringstudio.firebaserealm/files/instant-run/dex/slice-slice_3-classes.dex", dex file "/data/data/com.pringstudio. 

Codice

// Firebase Root 
Firebase firebase = new Firebase("firebae_url"); 

Siswa siswa = new Siswa(
Integer.valueOf(editText.getText().toString()), 
editTextNama.getText().toString() 
); 

Firebase refSiswa = firebase.child("siswa").child(String.valueOf(siswa.getId())); 
refSiswa.setValue(siswa, new Firebase.CompletionListener() { 
@Override 
public void onComplete(FirebaseError firebaseError, Firebase firebase) { 
    if (firebaseError != null) { 
    Log.e("Firebase Add", "Error: " + firebaseError.getMessage()); 
    Toast.makeText(getApplicationContext(), "Gagal\n" + firebaseError.getMessage(), Toast.LENGTH_SHORT).show(); 
    } else { 
    Toast.makeText(getApplicationContext(), "Data tersimpan", Toast.LENGTH_SHORT).show(); 
    } 
} 
}); 

oggetto

package com.pringstudio.firebaserealm.model; 

import io.realm.RealmObject; 

/** 
* Created by sucipto on 5/18/16. 
*/ 
public class Siswa extends RealmObject{ 

    private String nama; 
    private int id; 

    public Siswa(){}; 

    public Siswa(int id, String nama){ 
     this.id = id; 
     this.nama = nama; 
    } 

    public int getId() { 
     return id; 
    } 

    public void setId(int id) { 
     this.id = id; 
    } 

    public String getNama() { 
     return nama; 
    } 

    public void setNama(String nama) { 
     this.nama = nama; 
    } 
} 

Quando non lo si estende, il firebase di RealmObject può accettarlo, ma quando converto Siswa Object si estende oggetto realm, è causa di errore.

Desidero che il mio oggetto sia compatibile con Firebase e Realm, qualsiasi suggerimento? Grazie.

risposta

9

Sembra che tu stia utilizzando Jackson Databind, e questo è ciò che sta causando il problema. V'è una descrizione del problema e un work-around qui: https://realm.io/docs/java/latest/#jackson-databind

Ma per avere anche la risposta qui:

Questo può essere risolto da una delle RxJava aggiungendo al progetto o creare un file fittizio vuoto che sembra il seguente

package rx; 

public class Observable { 
    // Dummy class required for Jackson-Databind support if 
    // RxJava is not a project dependency. 
} 
0

Nel mio caso RealmObject è tentato di aggiornare Firebase, ma ho ottenuto un errore di nota Firebase non poteva gestire oggetti serializzati. Quello che ho fatto invece è stato quello di clonare il RealmObject, e in questo modo è stato in grado di aggiornare da Realm a Firebase.

Ho avviato un'applicazione con Realm ma ho realizzato la necessità di sincronizzare i dati. Così qui è una soluzione rapida

public void syncWithFirebase(){ 

DatabaseReference addresses = mRef.getDB().child(TESTABLE_ADDRESSES); 
long numOfAddresses = mProvider.countAddresses(); 
ShortAddress address; 

for(int i = 1; i <= numOfAddresses; i++){ 
    address = mProvider.getAddress(i); 

    //we get a serialized error, so right now address is copied 
    addresses 
     .child(Long.toString(address.getAddressId())) 
     .setValue(AddressUtils.cloneAddress(address)); 
} 

}

public void syncWithRealm(Response<Boolean> response){ 
DatabaseReference addresses = mRef.getDB().child(TESTABLE_ADDRESSES); 


addresses.addListenerForSingleValueEvent(new ValueEventListener() { 
    @Override 
    public void onDataChange(DataSnapshot dataSnapshot) { 

     for(DataSnapshot snapshot: dataSnapshot.getChildren()){ 
      ShortAddress address = snapshot.getValue(ShortAddress.class); 
      mProvider.updateAddress(address); 
     } 

     response.onResult(true); 
    } 

    @Override 
    public void onCancelled(DatabaseError databaseError) { 
     response.onError(new Exception(databaseError.getMessage())); 
    } 
}); 

}

0
java.lang.NoClassDefFoundError: rx.Observable 

Se vedete questa eccezione in voi java/progetto Android con Firebase - facile soluzione per voi:

Il tuo la classe importata al firebase deve essere gratuita (non si estende dalle classi ).

Io lavoro con Realm e Firebase nel mio progetto Android - e per i dati di carico su entrambe le basi ho creato due classi identiche.

per Realm:

public class Todo extends RealmObject {/*fields*/} 

per Firebase:

public class TodoDTO {/*fields*/} 

e copie da Todo a TodoDTO e ritorno.