gpt4 book ai didi

json - 使用 Swift 在 Firebase 中保存现有的 JSON 文件?

转载 作者:行者123 更新时间:2023-11-28 12:14:17 24 4
gpt4 key购买 nike

我有一个 JSON 文件,保存在我的项目本地。现在我很好奇将它保存在 Firebase 中。我知道 Firebase 以 NoSQL 格式(作为 JSON)保存数据。我看过几个关于将文件添加到 Firebase 的教程(经过一些操作,比如在示例 iOS 应用程序中点击按钮)。但是是否有可能在 firebase 中保存整个 JSON 文件本身(而不仅仅是它的 block ),最初(不是在点击某个按钮之后),然后加载该文件,因为在我的项目中用户不能自己添加文件?该应用程序应从 JSON 文件加载数据。我是 Firebase 的新手,所以我几乎没有使用它的经验。如果您有任何建议或知道如何执行此操作,我将不胜感激。

已编辑好吧,澄清一下我在问什么。我有一个项目,其中包含一个文本文件,其中包含一个 JSON 数据。最初,我将它添加到我的项目中,因为我没有使用 Firebase、AWS 等的经验。我只需要看看应用程序如何对数据使用react。将来数据会显着增长,所以显然我不会将其保存在项目中。问题是,我只想将 JSON 数据保存在 Firebase 中。而且我不知道这样做的正确方法:只需导入 JSON 或从头开始编写(以编程方式或在控制台中)。另外,我想知道这通常是不是个好主意,因为这是我第一次使用在线数据库,很多人说 Firebase 是最好的入门数据库。我对所有这些东西都很陌生,这就是为什么我要问这些问题。

EDITED_2

{
"list": {
"restaurants": [{
"id": "231311234342bn123",
"name": "Grand Royal",
"suggested": true,
"address": {
"longitude": "30.31527",
"latitude": "59.93688",
"formatted": ["Nevskiy prospekt 10, Saint Petersburg",
"Russian Federation"
]
},
"tags": ["fish",
"Italian",
"Friends"
],
"category": "$$$$",
"description": "Lorem ipsum dolor sit er elit lamet, consectetaur cillium adipisicing pecu, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Nam liber te conscient to factor tum poen legum odioque civiuda.",
"shortDescription": "an",
"collectionName": "Relaxing with friends",
"distance": "1324",
"country": "Russian Federation",
"Region": "North-West region",
"city": "Saint Petersburg"
},

{
"id": "123234344t5213",
"name": "N",
"image": "A",
"suggested": true,
"address": {
"longitude": "30.31821",
"latitude": "59.93605",
"formatted": ["Nevskiy prospekt 15, Saint Petersburg",
"Russian Federation"
]
},
"tags": ["fish",
"french",
"family"
],
"category": "$$$$",
"description": "Lorem ipsum dolor sit er elit lamet, consectetaur cillium adipisicing pecu, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Nam liber te conscient to factor tum poen legum odioque civiuda. ",
"shortDescription": "ab",
"collectionName": "Evening with a family",
"distance": "556",
"country": "Russian Federation",
"Region": "North-West region",
"city": "Saint Petersburg"
}]}}

这是我的初始 JSON 数据的一个片段(它还没有完成,例如,此时只有一个图像字符串)。数据在整个应用程序中使用(在表格 View 、单独 View 等中)。例如,我用它来填充 TableView ,在 mapView 和其他 UIViewController 子类中使用它。此外,我需要能够对其进行过滤和搜索。目前,我通过解码整个 JSON 并将其添加到一个数组,然后过滤该数组来做到这一点。但我想,当你有大量带有图像的数据时,这不是最好的选择。

还有一件事,在 Core Data 中可以设置批量请求,因此它最初只会获取一定数量的数据。它适用于表格 View ,因为当您滚动它们时,Core Data 会自动获取新数据以填充单元格。是否可以用 firebase 做类似的事情,或者我应该一次读取所有数据?

我还读到 Firebase 不需要保存类似数组的数据,但有几种方法可以解决该问题。这对我很重要,因为我确实需要将部分数据放在数组中。

最佳答案

希望这会提供一些方向,请原谅长度。

没错,通常有比数组更好的方法在 Firebase 中存储数据;数组不可搜索、不可编辑或不可添加,如果您想更改某些内容,则需要覆盖整个数组。请看Arrays Are Evil .

其次Denormalizing Data Is Normal在火力基地。这意味着当数据变得太“深”时,查询你想要的数据就会困难得多。通常越扁平越好 - 取决于您想从 Firebase 中获得什么。

第三项是有 100 种不同的方法来处理您问题中的数据,我将介绍两种;一个从概念上演示如何写入数据,第二个可能是更好的选择。

以下是如何以暴力方式写入数据

let addressDict = [
"longitude": "30.31527",
"latitude": "59.93688",
"formatted1": "Nevskiy prospekt 10, Saint Petersburg",
"formatted2": "Russian Federation"
]

let tagsDict = [
"fish": true,
"italian": true,
"friends": true
]

let restaurantDict = [
"name": "Grand Royal",
"suggested": true,
"address": addressDict,
"tags": tagsDict,
"category": "$$$$",
"description": "Lorem ipsum dolor si.",
"shortDescription": "an",
"collectionName": "Relaxing with friends",
"distance": "1324",
"country": "Russian Federation",
"Region": "North-West region",
"city": "Saint Petersburg"
] as [String : Any]

let restaurantsRef = self.ref.child("restaurants").childByAutoId()
restaurantsRef.setValue(restaurantDict)

运行此代码将生成类似于您的结构的 JSON 结构。请注意,餐厅键 (KzEIkF6nxgWH1nA8B2D) 是在写入数据时自动创建的,因此这就是餐厅在其他结构中通过其键引用的方式。

"restaurants" : {
"-KzEIkF6nxgWH1nA8B2D" : {
"Region" : "North-West region",
"address" : {
"formatted1" : "Nevskiy prospekt 10, Saint Petersburg",
"formatted2" : "Russian Federation",
"latitude" : "59.93688",
"longitude" : "30.31527"
},
"category" : "$$$$",
"city" : "Saint Petersburg",
"collectionName" : "Relaxing with friends",
"country" : "Russian Federation",
"description" : "Lorem ipsum dolor si.",
"distance" : "1324",
"name" : "Grand Royal",
"shortDescription" : "an",
"suggested" : true,
"tags" : {
"fish" : true,
"friends" : true,
"italian" : true
}
}
},

查询所有 $$$$ 餐厅:

//print all restaurants with $$$$
let restRef = self.ref.child("restaurants")
let query = restRef.queryOrdered(byChild: "category").queryEqual(toValue: "$$$$")
query.observeSingleEvent(of: .value) { snapshot in
for child in snapshot.children {
let snap = child as! DataSnapshot
print(snap)
}
}

虽然我们可以查询类别 == "$$$$"的所有餐厅,但地址和标签节点太深(这实际上并不准确,请参阅 Deep Query,但我们将继续使用它对于这个例子,因为这个概念是合理的)。

所以更好的结构是

"restaurants" : {
"-KzEIkF6nxgWH1nA8B2D" : {
"Region" : "North-West region",
"category" : "$$$$",
"city" : "Saint Petersburg",
"collectionName" : "Relaxing with friends",
"country" : "Russian Federation",
"description" : "Lorem ipsum dolor si.",
"distance" : "1324",
"name" : "Grand Royal",
"shortDescription" : "an",
"suggested" : true,
}
},

"addresses"
"-KzEIkF6nxgWH1nA8B2D"
"formatted1" : "Nevskiy prospekt 10, Saint Petersburg",
"formatted2" : "Russian Federation",
"latitude" : "59.93688",
"longitude" : "30.31527"

"tags"
"-KzEIkF6nxgWH1nA8B2D"
"fish" : true,
"friends" : true,
"italian" : true

以及创建它的代码:

let restDict = [
"name": "Jay's Eatery",
"category": "$$$$"
]

let addressDict = [
"formatted1": "Anytown"]

let tagsDict = [
"fish": true,
"friends": true,
"italian": true
]

let restRef = self.ref.child("restaurants")
let addressesRef = self.ref.child("addresses")
let tagsRef = self.ref.child("tags")

let thisRestaurantRef = restRef.childByAutoId()
thisRestaurantRef.setValue(restDict, withCompletionBlock: { (error, snapshot) in
if error == nil {
let thisRestaurantKey = snapshot.key
addressesRef.child(thisRestaurantKey).setValue(addressDict)
tagsRef.child(thisRestaurantKey).setValue(tagsDict)
}
})

现在您可以使用上面的查询轻松查询带有鱼标签、纬度以 59 开头或 Grand Royal 名称的餐厅。

如您所见,当数据存储在 Firebase 中时,不涉及编码或解码。

是的,Firebase 可以批量加载数据来填充数组以用作 tableView 数据源

最佳做法是创建在您的代码中向用户表示数据的类对象,并在后台利用 Firebase 来存储该数据。

class RestaurantClass {
key = "" //"-KzEIkF6nxgWH1nA8B2D"
name = "" //"Grand Royal
etc

func init(withSnapshot: DataSnapshot) {
//populate the class vars from the snapshot
}

然后 $$$$ 餐厅的查询将是这样的:

let restRef = self.ref.child("restaurants")
let query = restRef.queryOrdered(byChild: "category").queryEqual(toValue: "$$$$")
query.observeSingleEvent(of: .value) { snapshot in
for child in snapshot.children {
let snap = child as! DataSnapshot
let rest = RestaurantClass(withSnap: snap)
self.myTableViewDataSourceArray.append(rest)
}
self.myTableViewDataSourceArray.reloadData()
}

还有很多,但这应该能让您朝着正确的方向前进。

从这个答案中得出的结论是利用 Firebase 在后端存储原始数据 - 如果数据结构正确,它速度极快、可扩展且可维护。在代码中使用填充有后端数据的类作为数据源并向用户呈现数据。

最后要注意的是,如果您要处理位置信息,您将需要一种工具来简化这项工作。查看GeoFire获取更多信息。

编辑:

解决评论以进行澄清。

您并不完全像为类或结构创建属性那样在代码中创建 Firebase 数据结构,它完全不像带有标题的空 SQL 表。更多的是您如何告诉 Firebase 如何写入该数据。例如:

ref.child("users").child("uid_0").setValue("Leroy")

告诉 Firebase 在用户节点中,写一个键:字符串的值对:uid 的字符串:Leroy 像这样:

users
uid_0: "Leroy"

let aDict = ["user_name": "Leroy"]
ref.child("users").child("uid_0").setValue(aDict)

将导致告诉 Firebase 在用户节点内写入一个键:字符串的值对:uid 字典:aDict。请注意,aDict 是一个键:字符串本身的值对:字符串(例如 user_name:Leroy)

users
uid_0
user_name: "Leroy"

我喜欢将 Firebase 视为键值对的大字典,其中键始终是字符串(避免数组!),值是任何类型,可以是字符串、整数等或其他字典。

关于json - 使用 Swift 在 Firebase 中保存现有的 JSON 文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47350695/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com