2016-11-15 71 views
1

刪除特定的子節點我有一個UITableView它看起來像這樣的圖像我怎樣才能在火力地堡從使用的UITableViewCell斯威夫特

this image

當我滑動刪除記錄時,我可以完全從存儲它的數組中刪除它,但我無法在Firebase中將其刪除。

我的火力地堡數據庫結構是上面的截圖如下:

-KWc7RTuOe5PefiMM2tL 
    bodyPart: "Arms" 
    exerciseName: "Test 1 " 
    userId: "8rHmyTxdocTEvk1ERiiavjMUYyD3" 
-KWcEbpw_f6kxcePY5cO 
    bodyPart: "Chest" 
    exerciseName: "Test 2 " 
    userId: "8rHmyTxdocTEvk1ERiiavjMUYyD3" 
-KWcEdUN49QaJIVf0kwO 
    bodyPart: "Legs" 
    exerciseName: "Test 3 " 
    userId: "8rHmyTxdocTEvk1ERiiavjMUYyD3" 
-KWcFrMSaLKQRxghGHyT 
    bodyPart: "Arms" 
    exerciseName: "Test 4" 
    userId: "8rHmyTxdocTEvk1ERiiavjMUYyD3" 

如何訪問創建時e.g「-KWc7RTuOe5PefiMM2tL」這樣我就可以刪除該子節點被設置在自動識別值?

或者,我還可以訪問exerciseName值,具體取決於登錄的UserId

+0

這一切都歸結到你如何填充您的數據源陣列。看到我的答案可能會簡化它。 – Jay

回答

1

從什麼MHDev已經回答了繼:

func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) { 
    if editingStyle == .delete { 

     if let exerciseName = exercises[indexPath.row].exerciseName { 

      let ref = FIRDatabase.database().reference().child("userExercises") 

      ref.queryOrdered(byChild: "exerciseName").queryEqual(toValue: exerciseName).observe(.childAdded, with: { (snapshot) in 

       snapshot.ref.removeValue(completionBlock: { (error, reference) in 
        if error != nil { 
         print("There has been an error:\(error)") 
        } 
       }) 

      }) 

     } 

     exercises.remove(at: indexPath.row) 
     tableView.deleteRows(at: [indexPath], with: .left) 
    } 
} 
2

爲了解決這個問題,我在最終達到預期結果之前嘗試了很多不同的方法。

要刪除該值,我創建了一個對子節點'userExercises'的引用,然後通過'exerciseName'對它進行排序,然後.queryEqual(toValue :)從UITableViewCell中提取的練習名稱值。

我然後取出的這個快照值和示例代碼如下:

func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) { 
    if editingStyle == .delete { 

     if let exerciseName = exercises[indexPath.row].exerciseName { 

      let ref = FIRDatabase.database().reference().child("userExercises") 

      ref.queryOrdered(byChild: "exerciseName").queryEqual(toValue: exerciseName).observe(.childAdded, with: { (snapshot) in 

       snapshot.ref.removeValue(completionBlock: { (error, reference) in 
        if error != nil { 
         print("There has been an error:\(error)") 
        } 
       }) 

      }) 

     } 

     exercises.remove(at: indexPath.row) 
     tableView.deleteRows(at: [indexPath], with: .left) 
    } 
} 
1

這是一個相當直接的過程:

通常,對於tableViews數據源是一個數組。該數組是使用從Firebase快照讀取的字典或從快照構建的對象數組(建議)構建的。

因此,這裏是你的火力地堡結構(這是從一個節點填充從快照)

class Exercise { 
    key: "KWc7RTuOe5PefiMM2tL" 
    bodyPart: "Legs" 
    exerciseName: "Test 3 " 
    userId: "8rHmyTxdocTEvk1ERiiavjMUYyD3" 
} 

匹配,那麼,當用戶掃描行3爲例爲例,從陣列中檢索練習對象,row3。

let theObject = ExerciseArray[3] 
let parentNode = theObject.key 
let ref = rootNode.child(parentNode) 
ref.setValue(nil) 

你就完成了。