2016-05-18 23 views
9

Tôi muốn tạo ứng dụng Android có thể chạy khi trực tuyến và ngoại tuyến. Có thể kết hợp Realm.io cho cơ sở dữ liệu ngoại tuyến và Firebase dưới dạng dịch vụ Trực tuyến.Kết hợp Realm.io và Firebase

Tôi đang cố gắng để làm cho ứng dụng đơn giản mà trực tiếp thêm đối tượng lĩnh vực để căn cứ hỏa lực, nhưng tôi nhận được ngoại lệ lỗi như thế này:

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

Object

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

Khi tôi không mở rộng Firebase RealmObject có thể chấp nhận nó, nhưng khi tôi chuyển đổi Siswa Object để mở rộng đối tượng realm, đó là lỗi gây ra.

Tôi muốn đối tượng của mình tương thích với firebase và lĩnh vực, bất kỳ sugestion? Cảm ơn.

Trả lời

9

Dường như bạn đang sử dụng Jackson Databind và đó là nguyên nhân gây ra sự cố. Có một mô tả của vấn đề và một công việc xung quanh đây: https://realm.io/docs/java/latest/#jackson-databind

Nhưng cũng có câu trả lời ở đây:

này có thể được cố định bởi một trong hai RxJava thêm vào dự án của bạn hoặc tạo một tập tin dummy trống trông giống như sau.

package rx; 

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

Trong trường hợp của tôi, RealmObject đã cố gắng cập nhật Firebase, nhưng tôi gặp lỗi khi đề cập đến Firebase không thể xử lý các đối tượng được tuần tự hóa. Những gì tôi đã làm thay vào đó là để sao chép các RealmObject, và theo cách đó nó đã có thể cập nhật từ Realm để Firebase.

Tôi đã bắt đầu một ứng dụng với Realm nhưng nhận ra rằng cần phải đồng bộ hóa dữ liệu. Vì vậy, đây là một giải pháp nhanh chóng

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 

Nếu bạn thấy ngoại lệ này ở bạn/dự án android java với căn cứ hỏa lực - giải pháp dễ dàng cho bạn:

lớp được nhập vào cơ sở dữ liệu phải được miễn phí (không kéo dài từ các lớp khác).

tôi làm việc với Realmcăn cứ hỏa lực trong dự án Android của tôi - và cho dữ liệu tải trên cả hai cơ sở tôi đã tạo hai lớp giống hệt nhau.

cho Realm:

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

cho căn cứ hỏa lực:

public class TodoDTO {/*fields*/} 

và bản sao từ Todo để TodoDTO và ngược lại.

Các vấn đề liên quan