【问题标题】:Combine Realm.io and Firebase结合 Realm.io 和 Firebase
【发布时间】:2016-05-18 15:43:40
【问题描述】:

我想创建可以在线和离线运行的 Android 应用程序。可以将 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;
    }
}

当我不扩展 RealmObject 时,firebase 可以接受它,但是当我将 Siswa 对象转换为扩展领域对象时,它会导致错误。

我希望我的对象与 firebase 和 realm 兼容,有什么建议吗?谢谢。

【问题讨论】:

    标签: java android firebase realm


    【解决方案1】:

    看起来您正在使用 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.
    }
    

    【讨论】:

      【解决方案2】:

      在我的例子中,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() ) );
          }
      });
      

      }

      【讨论】:

        【解决方案3】:
        java.lang.NoClassDefFoundError: rx.Observable
        

        如果您在使用 Firebase 的 java/android 项目中看到此异常 - 为您提供简单的解决方案:

        您导入到 firebase 的类必须是免费的(不要从 其他类)。

        我在我的 android 项目中使用 RealmFirebase - 为了在这两个基础上加载数据,我创建了两个相同的类。

        对于领域:

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

        对于 Firebase:

        public class TodoDTO {/*fields*/}
        

        从 Todo 复制到 TodoDTO 并返回。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-01-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-02-17
          • 2016-02-09
          相关资源
          最近更新 更多