【问题标题】:Xamarin Firebase DeleteAsyncXamarin Firebase DeleteAsync
【发布时间】:2017-09-18 16:44:27
【问题描述】:

我在 Xamarin Android 应用上从 Firebase 数据库中删除项目时遇到问题。

我收到 400(错误请求)错误

删除方法:

private async void RemovePost(string ActivityID)
{
    var firebase = new FirebaseClient(FirebaseURL);
    await firebase.Child("posts").Child(ActivityID).DeleteAsync();

    var intent = new Intent(mContext, typeof(MyProfileActivity));
    mContext.StartActivity(intent);
}

型号:

public class Post
{
    public string ActivityID { get; set; }

    public string OwnerID { get; set; }

    public string ActivityTitle { get; set; }

    public string ActivitySport { get; set; }

    public DateTime ActivityDate { get; set; }

    public DateTime ActivityTime { get; set; }

    public string ActivityTown { get; set; }

    public string ActivityAddress { get; set; }

    public string ActivityPhone { get; set; }

    public string ActivityEmail { get; set; }

    public string ActivityDetails { get; set; }
}

Firebase 数据库表:

注意我传递给RemovePost方法的活动ID是“0”

【问题讨论】:

  • 您的请求是否经过身份验证?
  • 不,他们不必经过身份验证,我要做的就是从数据库中删除与我传递给它的 id 匹配的项目
  • 你使用的是什么 firebase 库?
  • Firebase.Xamarin v0.3.6
  • 那么在将记录保存到数据库时,为什么不首先将activityid 作为键呢?除此之外,您必须加载所有记录,然后遍历它们以找到与您的过滤器匹配的记录,然后使用它的键将其从数据库中删除

标签: c# firebase firebase-realtime-database xamarin.android


【解决方案1】:

那么,当您首先将记录保存到数据库时,为什么不将ActivityId 作为键呢?

var post = new Post {
    ActivityId = 0,
    //...other properties populated
}

var record = await firebase
    .Child("posts")
    .Child(post.ActivityId)
    .PostAsync(post));

var posts = await firebase
    .Child("posts")
    .OnceAsync<Post>();

foreach (var item in posts) {
    Console.WriteLine($"{item.Key} post has id {item.Object.ActivityId}");
}

await firebase.Child("posts").Child(post.ActivityID).DeleteAsync();

这样在查询记录时可以查询已知键

【讨论】:

    【解决方案2】:

    这个:

    await firebase.Child("posts").Child(ActivityID)
    

    将尝试将 ActivityID 与节点的根匹配,在您的情况下是值 KiG7ju8CsDfGW3eSBIn

    尝试将您的 firebase 删除调用更改为以下内容:

    await firebase.Child("posts").OrderBy("ActivityID").EqualTo(ActivityID).DeleteAsync();
    

    更新

    试试这个,这样你就可以调试了。设置一个断点并运行调用以查看结果。

    //Get the record(s). Can be more than one if ActivityID value is repeated.
    var posts = await firebase
        .Child("posts")
        .OrderBy("ActivityID")
        .EqualTo("0")
        .OnceAsync<Post>();
    
    // Select only the first one
    var firstPost = posts.FirstOrDefault();
    
    // send to delete this
    await firebase
        .Child("posts")
        .Child(firstPost?.Key)
        .DeleteAsync();
    

    【讨论】:

    • 这一行给了我一个新错误:{System.Net.Http.HttpRequestException: 400 (Bad Request)
    • 先尝试获取记录,不要做删除部分firebase.Child("posts").OrderBy("ActivityID").EqualTo(ActivityID) 调试看看是否有权限访问记录。还告诉我你正在使用什么 nuget 包
    • 我正在使用 Firebase.Xamarin v0.3.6,当我使用该行时,我得到了一个 Firebase.Xamarin.Database.Query.FilterQueryobject,我试图深入研究它是否是我的帖子对象,但我还没有找到它
    • @CathalO'Donnell 更新了帖子,因此您可以尝试并专门调试。
    • 当我尝试运行该代码时出现异常错误:“400(错误请求)”,它在第一行崩溃
    猜你喜欢
    • 2020-07-10
    • 1970-01-01
    • 2021-08-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-01
    • 1970-01-01
    • 2017-10-17
    相关资源
    最近更新 更多