2016-12-04 1 views
0

私は研究室で保持されているアイテムを追跡するために在庫アプリケーションを作成しています。実験室には、さまざまなアイテムが含まれている異なるステーションがあります。これらのステーションには、Firebaseデータベースで正しく構成されていることがわかります。autoIDの下に保持されているFirebaseにデータを表示するには?

Firebase Database

Iphone Simulator

私はテーブルセルのうちの特定の項目を削除しようとすると、私の問題が来ます。私はUIから削除することができますが、firebaseではデータは残っています。私は完全な再調査をしましたが、この特定の問題に関連するものは何も見つけることができません。

データサービスクラス

let DB_BASE = FIRDatabase.database().reference().child("laboratory")  //contains the root of our database 
let STORAGE_BASE = FIRStorage.storage().reference() 

class DataService { 

static let ds = DataService() 

//DB References 
private var _REF_BASE = DB_BASE 
private var _REF_STATION = DB_BASE.child("stations") 
private var _REF_USERS = DB_BASE.child("users") 

//Storage Reference 
private var _REF_ITEM_IMAGE = STORAGE_BASE.child("item-pics") 

var REF_BASE: FIRDatabaseReference { 
    return _REF_BASE 
} 

var REF_STATION: FIRDatabaseReference { 
    return _REF_STATION 
} 

var REF_USERS: FIRDatabaseReference { 
    return _REF_USERS 
} 

var REF_ITEM_IMAGES: FIRStorageReference { 
    return _REF_ITEM_IMAGE 
} 

//creating a new user into the firebase database 

func createFirebaseDBUser(_ uid: String, userData: Dictionary<String, String>) { 
    REF_USERS.child(uid).updateChildValues(userData) 
} 
} 

インベントリビューコントローラ

import UIKit 
import Firebase 

class InventoryViewController: UIViewController, UITableViewDataSource, UITableViewDelegate, UIImagePickerControllerDelegate, UINavigationControllerDelegate { 

var items = [Item]() 

private var _station: Station! 
private var _item: Item! 

var sortIndex = 3 

var imagePicker: UIImagePickerController! 
static var imageCache: NSCache<NSString, UIImage> = NSCache() 
var imageSelected = false 

@IBOutlet weak var itemImageToAdd: UIImageView! 
@IBOutlet weak var objectTextInput: UITextField! 
@IBOutlet weak var brandTextInput: UITextField! 
@IBOutlet weak var unitTextInput: UITextField! 
@IBOutlet weak var amountTextInput: UITextField! 
@IBOutlet weak var tableView: UITableView! 
@IBOutlet var addItemView: UIView! 
@IBOutlet weak var currentStationLabel: UILabel! 

var station: Station { 
    get { 
     return _station 
    } set { 
     _station = newValue 
    } 
} 

override func viewDidLoad() { 
    super.viewDidLoad() 

    var currentStationName = station.title 

    currentStationLabel.text = currentStationName 

    self.items = [] 

    let currentStation = station.title 
    let stationRef = DataService.ds.REF_STATION.child(currentStation!) 
    let inventoryRef = stationRef.child("inventory") 

    tableView.delegate = self 
    tableView.dataSource = self 

    imagePicker = UIImagePickerController() 
    imagePicker.allowsEditing = true 
    imagePicker.delegate = self 

    inventoryRef.observe(.value, with: { (snapshot) in 
     print(snapshot.value!) 

     self.items = [] 

     if let snapshot = snapshot.children.allObjects as? [FIRDataSnapshot] { 

      for snap in snapshot { 

       print("SNAP: \(snap)") 
       if let itemDict = snap.value as? Dictionary<String, AnyObject> { 

        let key = snap.key 
        let item = Item(itemKey: key, 
            itemData: itemDict) 
        self.items.append(item) 
       } 
      } 
     } 
     self.tableView.reloadData() 
    }) 


} 

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
    let item = items[indexPath.row] 

    if let cell = tableView.dequeueReusableCell(withIdentifier: "inventoryTableCell", for: indexPath) as? ItemCell { 

     if let img = InventoryViewController.imageCache.object(forKey: NSString(string: item.imageURL!)) { 

      cell.updateItemUI(item: item, img: img) 

     } else { 

      cell.updateItemUI(item: item) 
     } 

     return cell 

    } else { 

     return ItemCell() 
    } 
} 
func numberOfSections(in tableView: UITableView) -> Int { 
    return 1 
} 
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
    return items.count 
} 

func postToFirebase(itemImageURL: String) { 

    let post: Dictionary<String, AnyObject> = [ 
     "objectLabel": objectTextInput.text! as AnyObject, 
     "brandLabel": brandTextInput.text! as AnyObject, 
     "unitLabel": unitTextInput.text! as AnyObject, 
     "amountLabel": amountTextInput.text! as AnyObject, 

     //post elsewhere as an image for future reference 
     "itemImageURL": itemImageURL as AnyObject, 

     ] 
    let stationText = _station.title 
    let stationRef = DataService.ds.REF_STATION.child(stationText!) 
    let inventoryRef = stationRef.child("inventory") 

    let firebasePost = inventoryRef.childByAutoId() 
    firebasePost.setValue(post) 

    objectTextInput.text = "" 
    brandTextInput.text = "" 
    unitTextInput.text = "" 
    amountTextInput.text = "" 
    imageSelected = false 

    tableView.reloadData() 
} 

func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) { 
    if let image = info[UIImagePickerControllerEditedImage] as? UIImage { 

     itemImageToAdd.image = image 
     imageSelected = true 
    } else { 

     print("Please select a valid image") 
    } 

    imagePicker.dismiss(animated: true, completion: nil) 
} 

@IBAction func backToStations(_ sender: Any) { 

    performSegue(withIdentifier: "backToStations", sender: nil) 

} 

func tableView(_ tableView: UITableView, canEditRowAt indexPath: IndexPath) -> Bool { 
    return true 
} 

func tableView(tableView: (UITableView!), commitEditingStyle editingStyle: UITableViewCellEditingStyle, forRowAtIndexPath indexPath: (NSIndexPath!)) { 

} 

func tableView(_ tableView: UITableView, editActionsForRowAt indexPath: IndexPath) -> [UITableViewRowAction]? { 

    let currentStation = station.title 
    let stationRef = DataService.ds.REF_STATION.child(currentStation!) 
    let inventoryRef = stationRef.child("inventory") 

    var deleteAction = UITableViewRowAction(style: .default, title: "Delete") {action in 

     //Insert code to delete values from Firebase 
     self.items.remove(at: indexPath.row) 
     tableView.deleteRows(at: [indexPath as IndexPath], with: .fade) 

    } 

    var editAction = UITableViewRowAction(style: .normal, title: "Edit") { action in 

    } 

    return [deleteAction, editAction] 
} 
} 

私の思考プロセスは、特定のテーブルセルの行の現在のキーにreffering self_items.keyを呼び出すために、削除時です。そこから私は現在のキーwhickをautoIDとし、その値を削除します。残念ながら、それは致命的な無限のエラーでプログラムをクラッシュさせます。

+0

あなたの質問にJSONツリーの画像へのリンクが含まれています。実際のJSONをテキストとして置き換えてください.FirebaseデータベースコンソールのExport JSONリンクをクリックすると簡単に取得できます。 JSONをテキストとして検索可能にすることで、実際のデータを使ってテストしたり、答えに使用したりすることができます。一般的には、これは良いことです。 –

+0

[Swiftを使用してFireTitanの特定の子ノードをUITableViewCellから削除するにはどうすればよいですか?](http://stackoverflow.com/questions/40612987/how-can-i-delete-a-specific-child-node-in -firebase-from-uitableviewcell-using-sw) – Jay

+0

[この質問]への私の答えを見てください(http://stackoverflow.com/questions/40876616/how-to-check-for-value-in-firebase-that-自閉症の子供がいるかどうかはnoredirect = 1#comment68990882_40876616)。それは別の質問ですが、答えはあなたの質問に適用されるデザインパターンを提供します。そして...そのメモで、あなたが削除のためのfirebaseのノードを観察しているなら、配列からそれを削除する必要はありません。削除するノードが分かれば、それはあなたのアプリに通知し、アレイを再ロードし、それに応じてtableViewを更新します。 – Jay

答えて

0

この問題を解決するための最良の方法は、削除アクションで、Firebaseからオブジェクトを削除することです。ここからテーブルビューを変更しないでください。

データリスナーで、データが削除されたとき(またはNULLになったとき)にチェックしてから、それをtableviewデータソース配列から削除してtableviewを更新します。

関連する問題