2016-12-05 37 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文档和示例并实现监听器。不想这样做不是一种选择。 –