2016-05-18 3 views
9

Я хочу создать приложение для Android, которое может работать в режиме онлайн и офлайн. Можно комбинировать Realm.io для автономной базы данных и Firebase как онлайн-сервис.Combine Realm.io и Firebase

Я пытаюсь сделать простое приложение, которое непосредственно добавить объект в области действия firebase, но я получаю исключение ошибки вроде этого:

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. 

код

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

Объект

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; 
    } 
} 

Когда я не расширяю, Firebase RealmObject может принять его, но когда я конвертирую объект Siswa в extends объект realm, это причина ошибки.

Я хочу, чтобы мой объект совместим с firebase и realm, любым sugestion? Благодарю.

ответ

9

Похоже, вы используете Jackson Databind, и именно это вызывает проблему. Существует описание проблемы и обходные здесь: https://realm.io/docs/java/latest/#jackson-databind

Но также есть ответ здесь:

Это может быть фиксированной, либо добавив RxJava в свой проект или создать пустой фиктивный файл выглядит следующим образом.

package rx; 

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

В моем случае RealmObject был попыткой обновить Firebase, но я получил сообщение об ошибке, когда Firebase не смог обработать сериализованные объекты. Вместо этого я должен был клонировать RealmObject, и таким образом он мог обновляться с Realm до Firebase.

Я начал приложение с Realm, но осознал необходимость синхронизации данных. Так вот это быстрое решение

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 

Если вы видите это исключение в вас Java/андроида проекта с Firebase - простое решение для Вас:

Ваш класс, импортированный в firebase, должен быть бесплатным (не распространяется от других классов).

Я работаю с Realm и Firebase в моем андроида проекте - и для загрузки данных на обеих базах я создал два идентичных классов.

для Realm:

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

для Firebase:

public class TodoDTO {/*fields*/} 

и копии с Todo в TodoDTO и обратно.