2016-05-18 96 views
9

我想創建可以在線和離線運行的Android應用程序。可以將Realm.io用於脫機數據庫和Firebase作爲聯機服務。Combine Realm.io和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; 
    } 
} 

當我不擴展RealmObject的Firebase可以接受它,但是當我將Siswa對象轉換爲擴展領域對象,這是導致錯誤。

我想讓我的對象與firebase和realm兼容,任何消su?謝謝。

回答

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/Android項目與火力地堡 - 爲您簡單的解決方案:

您的導入到firebase的類必須是免費的(不要從 其他類擴展)。

境界火力地堡在我的Android項目上工作 - 和兩個基地的負載數據,我創建兩個相同的類。

的境界:

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

的火力地堡:

public class TodoDTO {/*fields*/} 

,並複製從藤到TodoDTO和背部。