我希望将我的应用中存储在4个标签和1个文本视图中的数据保存到我的Firebase数据库中,但我没有取得任何成功,下面是我编写的代码。该应用程序是一个填写的表单,并有一个保存按钮,一旦按下该按钮应该将数据发送到我的firebase数据库但是当我检查那里什么都没有?
我甚至不确定如何在此问题的控制台中检查错误。
import UIKit
import CoreLocation
import Firebase
class AddSightingViewController: UIViewController {
@IBOutlet weak var dateLabel: UILabel!
@IBOutlet weak var timeLabel: UILabel!
@IBOutlet weak var latitudeLabel: UILabel!
@IBOutlet weak var longitudeLabel: UILabel!
@IBOutlet weak var descriptionLabel: UITextView!
var locManager = CLLocationManager()
var currentLocation: CLLocation!
override func viewDidLoad() {
super.viewDidLoad()
// Set Date & Time
let dateFormatter = DateFormatter()
dateFormatter.dateStyle = .medium
dateFormatter.setLocalizedDateFormatFromTemplate("EEEE, MMM d, yyyy") // // set template after setting locale
let dateString = "\(dateFormatter.string(from: Date() as Date))"
dateLabel.text = String(dateString)
let timeFormatter = DateFormatter()
timeFormatter.timeStyle = .medium
timeFormatter.setLocalizedDateFormatFromTemplate("hhmm")
let timeString = "\(timeFormatter.string(from: Date() as Date))"
timeLabel.text = String(timeString)
// Set Latitude & Longitude
locManager.requestWhenInUseAuthorization()
if (CLLocationManager.authorizationStatus() == CLAuthorizationStatus.authorizedWhenInUse ||
CLLocationManager.authorizationStatus() == CLAuthorizationStatus.authorizedAlways){
currentLocation = locManager.location
self.latitudeLabel.text = String("\(currentLocation.coordinate.latitude)")
self.longitudeLabel.text = String("\(currentLocation.coordinate.longitude)")
}
}
func post() {
let date = dateLabel.text
let time = timeLabel.text
let latitude = latitudeLabel.text
let longitude = longitudeLabel.text
let sightingDescription = descriptionLabel.text
let post: [String : AnyObject] = ["date" : date as AnyObject,
"time" : time as AnyObject,
"latitude" : latitude as AnyObject,
"longitude" : longitude as AnyObject,
"Description" : sightingDescription as AnyObject]
var ref: DatabaseReference!
ref = Database.database().reference()
ref.child("Sightings").childByAutoId().setValue(post)
}
@IBAction func saveButton(_ sender: Any) {
post()
}
}
答案 0 :(得分:2)
在AppDelegate中初始化Firebase或实际发布时,您是否在控制台上收到任何错误消息?如果您这样做,请更新您的帖子
如果没有: 确保在info.plist中将“允许任意载入”设置为“真实”。
确保write权限合适:
默认情况下,Firebase通过服务提供的一种Auth方法实现使用firebase对应用程序的用户进行身份验证。有时在创建新项目时会忽略这一点。如果您不想要验证(不推荐,但可以是公共可访问数据库的解决方案),您只需要转到数据库(在您的项目中)>规则并将其更改为:
// These rules give anyone, even people who are not users of your app,
// read and write access to your database
{
"rules": {
".read": true,
".write": true
}
}
您可以查看如何使用基本级别规则here。
否则,如果这些不修复它,请在应用程序启动时以及发布时提供更多代码或控制台日志! (还要确保IBAction确实会触发......你会感到惊讶)通常,如果正在初始化firebase,你应该默认在App Launch上获得控制台消息。否则,当您使用您正在使用的setValue
方法发布时,您将无法获得XCode控制台日志。使用setValue(_ value: Any?, withCompletionBlock block: @escaping (Error?, FIRDatabaseReference) -> Void)
方法通常会更好:
let ref = Database.database().reference().[..all the childs until where you post]
ref.setValue(item) { (err, resp) in
guard err == nil else {
print("Posting failed : ")
print(err)
return
}
print("No errors while posting, :")
print(resp)
}
从这里开始发布错误信息,如果以前的建议都没有,则发布resp内容!