2016-12-05 31 views
0

我是一個核心的Java人,有點新的android。我想遵循與我的Java應用程序中所做的相同的舊類設計模式:採用firebase異步的類設計onDataChanged

考慮到標準crud。 A基礎DAO將在數據庫的單一實例(FirebaseDatabase)創建:

FirebaseDatabase database = FirebaseDatabase.getInstance(); 

一個EntityDAO延伸BaseDAO從BaseDAO使用數據庫,得到基準說Product

DatabaseReference productRef = database.getRef("products"); 
productRef.addValueEventListener(...) 

將有一個服務調用DAO訪問產品數據的類。

如何修改此模式以處理async onDataChanged

示例代碼:

//ProductDAO.java

public class ProductDAO { 
    private FirebaseDatabase fb; 
    private DatabaseReference productRef; 
    private Product product; 
     public ProductDAO(){  
     fb = FirebaseDatabase.getInstance(); //Already linked in the firebase console 
     productRef = fb.getDatabaseReference("product"); 
     productRef.addValueEventListener(new ValueEventListener(){ 
     onDataChange(..){ 
       Log.i("AZ", dataSnapshot.getValue().toString()); 
     } 

     }); 

     } 

    public ProductDAO getInstance(){ 
     return new ProductDAO(); 
    } 

    public Product getProduct(){ 
     return Product; //This will be null because the listener is not  completed when the getInstance loads; 
    } 
} 

//ProductService.java

public class ProductService{ 
    private ProductDAO productDAO = ProductDAO.getInstance(); 

    public Product getProducts(){ 
     return productDAO.getProducts(); //This will always return null 
    } 
} 
+0

我很難理解你的問題,因爲它主要是關於你似乎很熟悉的模型,但我不知道。你能分享[重現問題的最小代碼](http://stackoverflow.com/help/mcve)嗎? –

+0

但是,如果你想抽象的事實,數據異步加載,你可能想閱讀我的答案在這裏:http://stackoverflow.com/questions/33203379/setting-singleton-property-value-in-firebase -listener –

+0

@FrankvanPuffelen。感謝您的評論。公然試圖在這裏做一個MVC類型的設計。但這裏唯一的問題是,與傳統的數據庫查詢來檢索db項目列表不同,firebase總是工作異步。當我說DAO的getInstance()。道還沒準備好。它會一直返回空值。 – madhairsilence

回答

0

在嘗試一個同步模型鞋拔子異步模型是爲配方未來的痛苦。

Firebase不只是得到數據,它同步服務器和應用程序之間的變化。這就是所謂的反應式編程模型:您的應用程序應該準備好在數據發生變化時顯示數據。

在Firebase的模型中,最初可用的數據或稍後更改的數據幾乎沒有區別。這些觸發器都會觸發您附加的數據偵聽器中的方法。

+0

完全同意你的觀點,甚至我明白了。我的問題就是要知道什麼是解決方案。我不想在每個其他類中添加onDataChange,並且每次都傳遞對象以達到其他類。我們有任何模式可以遵循 – madhairsilence

+0

該模式是遵循Firebase文檔和示例並實現監聽器。不想這樣做不是一種選擇。 –