2017-05-15 154 views
0

我的查询返回FirebaseObjects列表:在Xamarin火力地堡查询失败

IReadOnlyCollection<Firebase.Xamarin.Database.FirebaseObject<object>> items = await firebase.Child("product").OnceAsync<object>(); 

但我想这样做:

Product product = await firebase.Child("product").OnceAsync<Product>(); 

我可以改变我的查询,使其工作,或者是这个它是如何工作的? 我的意思是,我将总是找回列表,还是可以直接反序列化到我的Product对象?

JSON的完整结构

{ 
    "product1": { 
    "pname": "Peppermint Kiss", 
    "teaType": "Black Tea", 
    "company": "PersnickeTea", 
    "packSize": { 
     "teabag": [ 
     { 
      "qty": 1, 
      "price": 1.5, 
      "tImage": "singleCup.jpg" 
     }, 
     { 
      "qty": 5, 
      "tinPrice": 6.95, 
      "tImage": "blackTeaTin.jpg" 
     }, 
     { 
      "qty": 8, 
      "price": 10, 
      "tImage": "blackTeabox.jpg" 
     }, 
     { 
      "qty": 12, 
      "boxPrice": 14.95, 
      "tImage": "trayBox.jpg" 
     } 
     ], 
     "looseLeaf": [ 
     { 
      "qty": 46, 
      "price": 7.95, 
      "tImage": "mintKissPak.jpg" 
     } 
     ] 
    }, 
    "ingredients": [ 
     "black tea", 
     "peppermint leaves", 
     "candy pieces", 
     "organic peppermint oil", 
     "natural creme flavor", 
     "raspberry leaves", 
     "red clover", 
     "anise seed" 
    ], 
    "prepMethod": [ 
     "infuser", 
     "teabags", 
     "strainer", 
     "iced" 
    ] 
    }, 
    "product2": { 
    "pname": "Spearmint Kiss", 
    "teaType": "Black Tea", 
    "company": "PersnickeTea", 
    "packSize": { 
     "teabag": [ 
     { 
      "qty": 1, 
      "price": 1.5, 
      "tImage": "singleCup.jpg" 
     }, 
     { 
      "qty": 5, 
      "tinPrice": 6.95, 
      "tImage": "blackTeaTin.jpg" 
     }, 
     { 
      "qty": 8, 
      "price": 10, 
      "tImage": "blackTeabox.jpg" 
     }, 
     { 
      "qty": 12, 
      "boxPrice": 14.95, 
      "tImage": "trayBox.jpg" 
     } 
     ], 
     "looseLeaf": [ 
     { 
      "qty": 46, 
      "price": 7.95, 
      "tImage": "mintKissPak.jpg" 
     } 
     ] 
    }, 
    "ingredients": [ 
     "black tea", 
     "peppermint leaves", 
     "candy pieces", 
     "organic peppermint oil", 
     "natural creme flavor", 
     "raspberry leaves", 
     "red clover", 
     "anise seed" 
    ], 
    "prepMethod": [ 
     "infuser", 
     "teabags", 
     "strainer", 
     "iced" 
    ] 
    }, 
    "product3": { 
    "pname": "Mintymint Kiss", 
    "teaType": "Black Tea", 
    "company": "PersnickeTea", 
    "packSize": { 
     "teabag": [ 
     { 
      "qty": 1, 
      "price": 1.5, 
      "tImage": "singleCup.jpg" 
     }, 
     { 
      "qty": 5, 
      "tinPrice": 6.95, 
      "tImage": "blackTeaTin.jpg" 
     }, 
     { 
      "qty": 8, 
      "price": 10, 
      "tImage": "blackTeabox.jpg" 
     }, 
     { 
      "qty": 12, 
      "boxPrice": 14.95, 
      "tImage": "trayBox.jpg" 
     } 
     ], 
     "looseLeaf": [ 
     { 
      "qty": 46, 
      "price": 7.95, 
      "tImage": "mintKissPak.jpg" 
     } 
     ] 
    }, 
    "ingredients": [ 
     "black tea", 
     "peppermint leaves", 
     "candy pieces", 
     "organic peppermint oil", 
     "natural creme flavor", 
     "raspberry leaves", 
     "red clover", 
     "anise seed" 
    ], 
    "prepMethod": [ 
     "infuser", 
     "teabags", 
     "strainer", 
     "iced" 
    ] 
    } 
} 

回答

0

我能找到适合我的解决方案。

var items = await firebase.Child("products").OnceAsync<object>(); 
foreach(var item in items) { 
    product = Newtonsoft.Json.JsonConvert.DeserializeObject<Product>.(item.Object.ToString()); 
} 

但我碰上了apineda的解决方案。查询起作用,但在尝试使用产品时引发异常。

var product = await firebase 
      .Child("products") 
      .Child("product1") 
      .OnceAsync<Product>(); 

但我想我会需要做X#火力呼吁让所有,而我的解决方案得到所有产品的一个电话。

1

你的查询,因为您所查询的主节点,不添加任何过滤器返回的对象的列表。这与“说话相同”

SELECT * FROM PRODUCT; 

在相关数据库中。

你不能这样做

Product product = await firebase.Child("product").OnceAsync<Product>(); 

当你的产品从正在添加的请求的列表。如果你只想选择一个,那么你需要按键,按键或按值过滤。

但是你可以做,虽然:

var products = await firebase.Child("product").OnceAsync<Product>(); 

,你将有产品的集合,已经反序列化的为您服务。

使用此:

var product = await firebase 
      .Child("product") 
      .Child("your-product-id") 
      .OnceAsync<Product>(); 

为了得到一个单一的产品,如果你确定你的productId是你节点的关键。

将结构移动到原始帖子....

+0

与关系数据库的比较是有道理的,我显然没有意识到这是Firebase的。然而,var products =等待firebase.Child(“product”)。OnceAsync (); “我无法投射或从System.String转换为LayoutTutorial.model.Product” – ezaspi

+0

不,Firebase是一个非关系数据库,我只是做了比较,以便您能够理解您的查询发生了什么。您是否可以更新显示您在Firebase中的产品表结构的原始帖子? – apineda

+0

我加了json。有3个产品,产品1,产品2和产品3。我可以像这样获取每个产品:var items = await firebase.Child(“product1”)。OnceAsync ();但我想要一个更有效的方法。 – ezaspi