- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个 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/
我尝试根据表单元素的更改禁用/启用保存按钮。但是,当通过弹出按钮选择更改隐藏输入字段值时,保存按钮不受影响。 下面是我的代码。我正在尝试序列化旧的表单值并与更改后的表单值进行比较。但我猜隐藏的字段值无
我正在尝试保存模型的实例,但我得到了 Invalid EmbeddedDocumentField item (1) 其中 1 是项目的 ID(我认为)。 模型定义为 class Graph(Docum
我有一个非常奇怪的问题......在我的 iPhone 应用程序中,用户可以打开相机胶卷中的图像,在我的示例中 1920 x 1080 像素 (72 dpi) 的壁纸。 现在,想要将图像的宽度调整为例
目前,我正在使用具有排序/过滤功能的数据表成功地从我的数据库中显示图像元数据。在我的数据表下方,我使用第三方图像覆盖流( http://www.jacksasylum.eu/ContentFlow/
我的脚本有问题。我想按此顺序执行以下步骤: 1. 保存输入字段中的文本。 2. 删除输入字段中的所有文本。 3. 在输入字段中重新加载之前删除的相同文本。 我的脚本的问题是 ug()- 函数在我的文本
任何人都可以帮助我如何保存多对多关系吗?我有任务,用户可以有很多任务,任务可以有很多用户(多对多),我想要实现的是,在更新表单中,管理员可以将多个用户分配给特定任务。这是通过 html 多选输入来完成
我在 Tensorflow 中训练了一个具有批归一化的模型。我想保存模型并恢复它以供进一步使用。批量归一化是通过 完成的 def batch_norm(input, phase): retur
我遇到了 grails 的问题。我有一个看起来像这样的域: class Book { static belongsTo = Author String toString() { tit
所以我正在开发一个应用程序,一旦用户连接(通过 soundcloud),就会出现以下对象: {userid: userid, username: username, genre: genre, fol
我正在开发一个具有多选项卡布局的 Angular 7 应用程序。每个选项卡都包含一个组件,该组件可以引用其他嵌套组件。 当用户选择一个新的/另一个选项卡时,当前选项卡上显示的组件将被销毁(我不仅仅是隐
我尝试使用 JEditorPane 进行一些简单的文本格式化,但随着知识的增长,我发现 JTextPane 更容易实现并且更强大。 我的问题是如何将 JTextPane 中的格式化文本保存到文件?它应
使用 Docker 相当新。 我为 Oracle 11g Full 提取了一个图像。创建了一个数据库并将应用程序安装到容器中。 正确配置后,我提交了生成 15GB 镜像的容器。 测试了该图像的新容器,
我是使用 Xcode 和 swift 的新手,仍在学习中。我在将核心数据从实体传递到文本字段/标签时遇到问题,然后用户可以选择编辑和保存记录。我的目标是,当用户从 friendslistViewCon
我正在用 Java 编写 Android 游戏,我需要一种可靠的方法来快速保存和加载应用程序状态。这个问题似乎适用于大多数 OO 语言。 了解我需要保存的内容:我正在使用策略模式来控制我的游戏实体。我
我想知道使用 fstream 加载/保存某种结构类型的数组是否是个好主意。注意,我说的是加载/保存到二进制文件。我应该加载/保存独立变量,例如 int、float、boolean 而不是结构吗?我这么
我希望能够将 QNetworkReply 保存到 QString/QByteArray。在我看到的示例中,它们总是将流保存到另一个文件。 目前我的代码看起来像这样,我从主机那里得到一个字符串,我想做的
我正在创建一个绘图应用程序。我有一个带有 Canvas 的自定义 View ,它根据用户输入绘制线条: class Line { float startX, startY, stopX, stop
我有 3 个 Activity 第一个 Activity 调用第二个 Activity ,第二个 Activity 调用第三个 Activity 。 第二个 Activity 使用第一个 Activi
我想知道如何在 Xcode 中保存 cookie。我想使用从一个网页获取的 cookie 并使用它访问另一个网页。我使用下面的代码登录该网站,我想保存从该连接获得的 cookie,以便在我建立另一个连
我有一个 SQLite 数据库存储我的所有日历事件,建模如下: TimerEvent *Attributes -date -dateForMark -reminder *Relat
我是一名优秀的程序员,十分优秀!