[英]Combine Realm.io and Firebase
我想創建可以在線和離線運行的Android應用程序。 可以將Realm.io與離線數據庫和Firebase組合為在線服務。
我正在嘗試創建簡單的應用程序,直接將realm對象添加到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 Object轉換為擴展realm對象時,它會導致錯誤。
我希望我的對象與firebase和領域兼容,任何消化? 謝謝。
看起來你正在使用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.
}
在我的情況下,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() ) );
}
});
}
java.lang.NoClassDefFoundError: rx.Observable
如果您在使用Firebase的 java / android項目中看到此異常 - 為您提供簡單的解決方案:
導入firebase的類必須是免費的(不要從其他類擴展)。
我在我的android項目中使用Realm和Firebase - 對於兩個基礎上的加載數據,我創建了兩個相同的類。
對於領域:
public class Todo extends RealmObject {/*fields*/}
對於Firebase:
public class TodoDTO {/*fields*/}
並從Todo復制到TodoDTO並返回。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.