I am trying to send Bible object to an activity using intent. I wrap bible object with Parcelable. I am getting an error on the line(Bible bible = snapshot.getValue(Bible.class); I am using firebase database matching the data from database with Bible.java. I am getting this error. Any help would be appreciated. Thank you in advance.
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.donghyun.catholicbibleverse, PID: 5390
com.google.firebase.database.DatabaseException: Class com.donghyun.catholicbibleverse.Bible does not
define a no-argument constructor. If you are using ProGuard, make sure these constructors are not
stripped.
at
com.google.firebase.database.core.utilities.encoding.
CustomClassMapper$BeanMapper.deserialize(com.google.firebase:firebase-database@@19.2.1:569)
at
com.google.firebase.database.core.utilities.encoding
.CustomClassMapper$BeanMapper.deserialize(com.google.firebase:firebase-database@@19.2.1:562)
at
com.google.firebase.database.core.utilities.encoding.
CustomClassMapper.convertBean(com.google.firebase:firebase-database@@19.2.1:432)
at com.google.firebase.database.core.utilities.encoding.CustomClassMapper.
deserializeToClass(com.google.firebase:firebase-database@@19.2.1:231)
at
com.google.firebase.database.core.utilities.encoding.
CustomClassMapper.convertToCustomClass(com.google.firebase:firebase-database@@19.2.1:79)
at com.google.firebase.database.DataSnapshot.getValue(com.google.firebase:firebase-
database@@19.2.1:203)
at com.donghyun.catholicbibleverse.Fragment1$1.onDataChange(Fragment1.java:62)
at com.google.firebase.database.Query$1.onDataChange(com.google.firebase:firebase-
database@@19.2.1:179)
at
com.google.firebase.database.core.ValueEventRegistration.fireEvent(com.google.firebase:firebase-
database@@19.2.1:75)
at com.google.firebase.database.core.view.DataEvent.fire(com.google.firebase:firebase-
database@@19.2.1:63)
at com.google.firebase.database.core.view.EventRaiser$1.run(com.google.firebase:firebase-
database@@19.2.1:55)
at android.os.Handler.handleCallback(Handler.java:883)
at android.os.Handler.dispatchMessage(Handler.java:100)
at android.os.Looper.loop(Looper.java:214)
at android.app.ActivityThread.main(ActivityThread.java:7356)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:930)
I/Process: Sending signal. PID: 5390 SIG: 9
Here is the code.
public class Fragment1 extends Fragment {
private RecyclerView recyclerView;
private BibleAdapter adapter;
private RecyclerView.LayoutManager layoutManager;
private ArrayList<Bible> arrayList;
private FirebaseDatabase database;
private DatabaseReference databaseReference;
public static final String VERSE_DATA="data";
public static final int REQUEST_CODE=101;
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle
savedInstanceState) {
ViewGroup rootView = (ViewGroup) inflater.inflate(R.layout.fragment1, container, false);
recyclerView = rootView.findViewById(R.id.recyclerView);
recyclerView.setHasFixedSize(true);
//GridLayoutManager layoutManager = new GridLayoutManager(getContext(), 2);
layoutManager = new LinearLayoutManager(getContext(), LinearLayoutManager.VERTICAL, false);
recyclerView.setLayoutManager(layoutManager);
arrayList = new ArrayList<>();
database = FirebaseDatabase.getInstance();
databaseReference = database.getReference("Bible");
adapter = new BibleAdapter(arrayList, getContext());
recyclerView.setAdapter(adapter);
databaseReference.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
arrayList.clear();
for(DataSnapshot snapshot: dataSnapshot.getChildren()){
Bible bible = snapshot.getValue(Bible.class);
arrayList.add(bible);
}
adapter.notifyDataSetChanged();
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
Log.e("fragment1", String.valueOf(databaseError.toException()));//에러문 출력
}
});
adapter.setOnItemClickListener(new OnVerseItemClickListener() {
@Override
public void onItemClick(BibleAdapter.BibleViewHolder holder, View view, int position) {
// Toast.makeText(getContext(), "num"+adapter.getItemCount(), Toast.LENGTH_LONG).show();
Intent intent = new Intent(getContext(), Verse.class);
Bible verse = new Bible(arrayList.get(position).getImage(), arrayList.get(position).getBibleType(),
arrayList.get(position).getVerse(), arrayList.get(position).getContent(), arrayList.get(position).getKeysentance());
intent.putExtra(VERSE_DATA, verse);
startActivityForResult(intent, REQUEST_CODE);
}
});
return rootView;
}
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
}
}
public class Bible implements Parcelable {
String image;
String bibleType;
String verse;
String content;
String keysentance;
public Bible(Parcel src){
image = src.readString();
bibleType = src.readString();
verse = src.readString();
content = src.readString();
keysentance = src.readString();
}
public Bible(String image, String bibleType, String verse, String content, String keysentance) {
this.image = image;
this.bibleType = bibleType;
this.verse = verse;
this.content = content;
this.keysentance = keysentance;
}
@Override
public int describeContents() {
return 0;
}
public static final Parcelable.Creator CREATOR = new Parcelable.Creator(){
@Override
public Object createFromParcel(Parcel source) {
return new Bible(source);
}
@Override
public Object[] newArray(int size) {
return new Bible[size];
}
};
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(image);
dest.writeString(bibleType);
dest.writeString(verse);
dest.writeString(content);
dest.writeString(keysentance);
}
public String getImage() {
return image;
}
public void setImage(String image) {
this.image = image;
}
public String getBibleType() {
return bibleType;
}
public void setBibleType(String bibleType) {
this.bibleType = bibleType;
}
public String getVerse() {
return verse;
}
public void setVerse(String verse) {
this.verse = verse;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
public String getKeysentance() {
return keysentance;
}
public void setKeysentance(String keysentance) {
this.keysentance = keysentance;
}
}
public class Verse extends AppCompatActivity {
ImageView imageView;
TextView bibleType;
TextView verse;
TextView content;
public static final String VERSE_DATA="data";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_verse);
bibleType = findViewById(R.id.bibleType);
verse = findViewById(R.id.verse);
content = findViewById(R.id.content);
imageView = findViewById(R.id.imageView);
Intent intent = getIntent();
processIntent(intent);
}
private void processIntent(Intent intent){
if(intent!= null){
Bundle bundle = intent.getExtras();
Bible data = bundle.getParcelable(VERSE_DATA);
bibleType.setText(data.getBibleType().toString());
verse.setText(data.getVerse().toString());
content.setText(data.getContent().toString());
}
}
}