如何为不同用户设置不同的Android Firebase书签内容?

时间:2018-07-14 14:41:56

标签: android firebase firebase-realtime-database firebase-authentication

我在3天前上传的Play商店中有一个Application。我正在为我的应用程序使用Firebase数据库。它基于一个单词,成语短语,介词,短语动词,对各种考试都很重要。每个单词都有一个书签选项。一切都很好,超过30个人安装了我的应用程序。但是不幸的是我犯了一个大错误。现在的问题是,当一个用户在列表中为该用户在书签部分中显示的所有单词添加了单词时,将其添加为书签。当一个用户从书签中删除任何单词时,应用程序将全部删除该单词。我没有使用任何登录选项。请帮助我如何为不同的用户设置不同的书签选项?这是我的书签代码。

    @Override
    protected void onStart() {
        super.onStart();
        FirebaseRecyclerAdapter<Blog,Idioms.BlogViewHolder>firebaseRecyclerAdapter=new FirebaseRecyclerAdapter<Blog, Idioms.BlogViewHolder>
                (Blog.class,R.layout.bank_row,Idioms.BlogViewHolder.class,mUserDatabase) {
            @Override
            protected void populateViewHolder(Idioms.BlogViewHolder viewHolder, final Blog model, int position) {

                final String fav_key=getRef(position).getKey();
                viewHolder.setDetails(getApplicationContext(), model.getTitle(), model.getDescription(), model.getExample());
viewHolder.setFavourite(fav_key);

                viewHolder.favourite.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View view) {
                        mfavourite=true;
                        databasefavourite.addValueEventListener(new ValueEventListener() {
                            @Override
                            public void onDataChange(DataSnapshot dataSnapshot) {

                                 if(mfavourite){

                                     if (dataSnapshot.child(fav_key).hasChild("Title")){
                                         databasefavourite.child(fav_key).child("Title").removeValue();
                                         mfavourite = false;
                                     }else {
                                         databasefavourite.child(fav_key).child("Title").setValue(model.getTitle());
                                         mfavourite = false;
                                     }
                                     if (dataSnapshot.child(fav_key).hasChild("Description")){
                                         databasefavourite.child(fav_key).child("Description").removeValue();
                                         mfavourite = false;
                                     }else {
                                         databasefavourite.child(fav_key).child("Description").setValue(model.getDescription());
                                         mfavourite = false;
                                     }
                                     if (dataSnapshot.child(fav_key).hasChild("Example")){
                                         databasefavourite.child(fav_key).child("Example").removeValue();
                                         mfavourite = false;
                                     }else {
                                         databasefavourite.child(fav_key).child("Example").setValue(model.getExample());
                                         mfavourite = false;
                                     }
                                 }

                            }

                            @Override
                            public void onCancelled(DatabaseError databaseError) {

                            }
                        });
                    }
                });

            }
        };
        mResultList.setAdapter(firebaseRecyclerAdapter);
    }

1 个答案:

答案 0 :(得分:1)

最好的方法是提供身份验证,但是在我的回答中,我将假定您不能或不愿意。

为使您的应用正常运行,请利用每次随机生成且唯一的firebase按钮。当用户第一次收藏时,生成一个按键并将其保存在共享的首选项中,每个收藏夹现在都将与该按键一起存储在数据库中。目前,每个用户都在调用相同的引用,并通过按键对其进行更改是唯一的方法。由于问题出在android代码中,因此现有用户将继续面临该问题。

您的应用很酷

代码。您喜欢的操作将更改为:

//check if user has liked
SharedPreferences local = getSharedPreferences("favorite", MODE.PRIVATE);
String link = local.getString("link", null);
if(link != null){
    databasefavourite = databasefavourite.child(link);
}else{
    link = databasefavourite.push().getKey();
    local.edit().putString("link", link).apply();
    databasefavourite = databasefavourite.child(link);
}
//now continue with your code here
databasefavourite.addListenerForSingleValueEvent(...);

请注意,您应该使用单个侦听器,因为每次都会触发值事件侦听器