2017-04-18 36 views
1

我正在創建一個簡單的圖書館應用程序,可以添加書籍並查看書籍列表。Firebase無法將java.lang.String類型的對象轉換爲

這裏是我的書類

public class Book { 

private int _id; 
private String _bookTitle; 
private String _bookAuthor; 
private int _bookISBN; 

private Map<String, Object> mp; 

public Book() { 

} 

public Book(String _bookTitle, String _bookAuthor, int _bookISBN) { 
    this._id = _id; 
    this._bookTitle = _bookTitle; 
    this._bookAuthor = _bookAuthor; 
    this._bookISBN = _bookISBN; 

} 

public int get_id() { 
    return _id; 
} 

public void set_id(int _id) { 
    this._id = _id; 
} 

public String get_bookTitle() { 
    return _bookTitle; 
} 

public void set_bookTitle(String _bookTitle) { 
    this._bookTitle = _bookTitle; 
} 

public String get_bookAuthor() { 
    return _bookAuthor; 
} 

public void set_bookAuthor(String _bookAuthor) { 
    this._bookAuthor = _bookAuthor; 
} 

public int get_bookISBN() { 
    return _bookISBN; 
} 

public void set_bookISBN(int _bookISBN) { 
    this._bookISBN = _bookISBN; 
} 


public Map<String, Object> toMap() { 
    mp = new HashMap<>(); 
    mp.put("bookTitle", this._bookTitle); 
    mp.put("bookAuthor", this._bookAuthor); 
    mp.put("bookISBN", this._bookISBN); 


    return mp; 
} } 

和這裏就是我想從已經寫入火力

snapshot of firebase

public class ViewBook extends AppCompatActivity { 


ArrayList<String> myArrayList = new ArrayList<>(); 

final FirebaseDatabase database = FirebaseDatabase.getInstance(); 
DatabaseReference ref = database.getReference(); 
// DatabaseReference mPostReference = ref.child("books"); 
DatabaseReference temp = ref.child("books"); 

ArrayAdapter<String> adapter; 

@Override 
public void onStart(){ 
    super.onStart(); 


    ValueEventListener postListener = new ValueEventListener() { 
     @Override 
     public void onDataChange(DataSnapshot dataSnapshot) { 
      for (DataSnapshot postSnapshot : dataSnapshot.getChildren()) { 
       Book book = postSnapshot.getValue(Book.class); 

       myArrayList.add(book.get_bookTitle() + "\n" + book.get_bookAuthor() + "\n" + book.get_bookISBN()); 


      } 

      ListView lv = (ListView)findViewById(R.id.list); 
      adapter = new ArrayAdapter<String>(ViewBook.this, android.R.layout.simple_list_item_1, myArrayList); 
      lv.setAdapter(adapter); 
     } 


     @Override 
     public void onCancelled(DatabaseError databaseError) { 
      //Getting Post failed, log a message 
      Log.w("VIEWBOOKS", "loadPost:onCancelled", databaseError.toException()); 

     } 
    }; 
    temp.addValueEventListener(postListener); 
} 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_view_book); 
}} 

我是錯誤的價值觀閱讀得到是

E/AndroidRuntime: FATAL EXCEPTION: main 
       Process: com.example.taylorcampos.androidfirebasedatabase, PID: 25339 
       com.google.firebase.database.DatabaseException: Can't convert object of type java.lang.String to type com.example.taylorcampos.androidfirebasedatabase.Book 
        at com.google.android.gms.internal.zzbtg.zze(Unknown Source) 
        at com.google.android.gms.internal.zzbtg.zzb(Unknown Source) 
        at com.google.android.gms.internal.zzbtg.zza(Unknown Source) 
        at com.google.firebase.database.DataSnapshot.getValue(Unknown Source) 
        at com.example.taylorcampos.androidfirebasedatabase.ViewBook$1.onDataChange(ViewBook.java:38) 
        at com.google.android.gms.internal.zzbpx.zza(Unknown Source) 
        at com.google.android.gms.internal.zzbqx.zzZT(Unknown Source) 
        at com.google.android.gms.internal.zzbra$1.run(Unknown Source) 
        at android.os.Handler.handleCallback(Handler.java:751) 
        at android.os.Handler.dispatchMessage(Handler.java:95) 
        at android.os.Looper.loop(Looper.java:154) 
        at android.app.ActivityThread.main(ActivityThread.java:6119) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776) 

請解釋爲什麼會發生這種情況,以及如何獲取列表視圖以列出已放入Firebase的這些書籍。

+0

你的「書」實際上是一個單一的「書」。當您嘗試將'bookAuthor'(它是String)轉換爲'Book'(它不是字符串並且不能從字符串讀取時),您的代碼就會失敗。您的'books'應該包含一個JsonObjects數組以供您的代碼使用。 –

回答

1

dataSnapshot.getChildren()將返回給您一本書的屬性列表,而不是Book對象本身。其中之一是字符串,因此錯誤

您需要數據庫中另一級別的數據,或者如果您要存儲的只是書籍列表,請刪除child("books")並使用生成的唯一密鑰而不是字符串"books"

此外,Firebase將嘗試使用camelCase方法和變量(如數據庫中的方法和變量)設置字段,而不是像Java類中的那些下劃線。換句話說,他們應該匹配

相關問題