2016-11-15 6 views
1

を使用してのUITableViewCellからFirebaseで特定の子ノードを削除することができますどのように私はこの画像私はスウィフト

this imageのように見えるUITableViewを持っています。

レコードを削除するためにスワイプすると、レコードが完全に削除されますが、Firebaseでそのレコードにアクセスするのは困難です。

マイ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" 

私はそれが例えば作成された「-KWc7RTuOe5PefiMM2tL」ので、私はその子ノードを削除することができたときに設定されているAUTOID値にアクセスするにはどうすればよいですか?

ログインしているUserIdに応じて、exerciseNameの値にアクセスできますか?

+0

このすべては、あなたのdataSourceアレイを移入する方法にダウンしています。それを単純化する私の答えを見てください。 – 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'で並べ替え、次にUITableViewCellから抽出したエクササイズ名の値を.queryEqual(toValue :)に並べ替えます。

私はこれのスナップショット値を除去し、サンプルコードは、以下である:

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のスナップショットから読み込まれた辞書、またはスナップショットから構築されたオブジェクトの配列から構築されます(推奨)。だからここ

は、ユーザが、例えば、行3を通す場合、アレイからの運動オブジェクトを取得し、その後、あなたFirebase構造に一致する例(これはスナップショットから単一のノードから移入された)

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

です、row3。

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

となりました。

関連する問題