java - 将收藏的项目保存和检索到 firebase-database
问题描述
我正在使用 firebase-database 开发电子商务 android 应用程序。所以我想添加一个功能,用户可以通过单击在数据库中添加和删除最喜欢的项目。我想要第一次点击添加到数据库中,第二次从数据库中删除
This is my firebase structure:
"Favorites" : {
"0773047940" : {
"04" : {
"description" : "It features a 4.7\" (11.94 cm) display with a screen resolution of 750 x 1334 pixels and runs on iOS v10 operating system. The device is powered by Quad core, 2.37 GHz processor paired with 3 GB of RAM. It has a 2230 mAh battery cell. A rear camera of 13 MP camera, BSI Sensor supporting a resolution of 4128 x 3096 Pixels and the front snapper is powered by a BSI Sensor",
"discount" : "5",
"image" : "https://resize.indiatvnews.com/en/centered/newbucket/715_431/2016/07/iphone-7-1468477109.jpg",
"menuID" : "01",
"name" : "IPhone 7s",
"price" : "2100000"
}
}
}
这是 productList 活动:
database = FirebaseDatabase.getInstance();
productItemList = database.getReference("Products");
favoriteItem = database.getReference("Favorites");
private void loadProductItemList(String categoryId) {
adapter = new FirebaseRecyclerAdapter<Product, ProductViewHolder>(
Product.class,
R.layout.product_list_layout,
ProductViewHolder.class,
productItemList.orderByChild("menuid").equalTo(categoryId)//getting product items where menuID equals to category id
) {
@Override
protected void populateViewHolder(final ProductViewHolder viewHolder, final Product model, final int position) {
viewHolder.productItemName.setText(model.getName());
Locale locale = new Locale("en", "UG");
NumberFormat numberFormat = NumberFormat.getCurrencyInstance(locale);
int thePrice = (Integer.parseInt(model.getPrice()));
viewHolder.productItemPrice.setText(numberFormat.format(thePrice));
Picasso.with(getBaseContext()).load(model.getImage())
.into(viewHolder.productItemImage);
//the name on the toolbar
Bundle bundle = getIntent().getExtras();
toolbarTitle = bundle.getString("Title_key");
setTitle(toolbarTitle);
final Product productItem = model;
viewHolder.setItemClickListener(new ItemClickListener() {
@Override
public void onClick(View view, int position, boolean isLongClicked) {
Intent productDetail = new Intent(ProductList.this, ProductDetail.class);
//Getting the category key id and sending it to the product list activity
productDetail.putExtra("ProductListID", adapter.getRef(position).getKey());
startActivity(productDetail);
}
});
//adding to favorite
viewHolder.favoriteImage.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
final String itemKey = adapter.getRef(position).getKey();
favoriteItem.child(Common.user_Current.getPhone()).child(itemKey).addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
if (dataSnapshot.child(itemKey).equals(itemKey)){
viewHolder.favoriteImage.setImageResource(R.drawable.ic_favorite_black_24dp);
Toast.makeText(ProductList.this, itemKey + "Exists", Toast.LENGTH_SHORT).show();
}
else {
String me = dataSnapshot.getKey();
viewHolder.favoriteImage.setImageResource(R.drawable.ic_favorite_black_24dp);
favoriteItem.child(Common.user_Current.getPhone()).child(itemKey).setValue(model);
Toast.makeText(ProductList.this, model.getName() +"added to favorites", Toast.LENGTH_SHORT).show();
}
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
}
});
}
};
//Setting the adapter
recyclerView.setAdapter(adapter);
}
这是viewHolder
public class ProductViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
public TextView productItemName, productItemPrice;
public ImageView productItemImage, favoriteImage;
private ItemClickListener itemClickListener;
public ProductViewHolder(@NonNull View itemView) {
super(itemView);
productItemName = (TextView) itemView.findViewById(R.id.item_name);
productItemPrice = (TextView) itemView.findViewById(R.id.item_price);
productItemImage = (ImageView) itemView.findViewById(R.id.item_image);
favoriteImage = (ImageView) itemView.findViewById(R.id.img_favorite);
itemView.setOnClickListener(this);
}
public void setItemClickListener(ItemClickListener itemClickListener) {
this.itemClickListener = itemClickListener;
}
@Override
public void onClick(View view) {
itemClickListener.onClick(view, getAdapterPosition(), false);
}
}
请我需要有关如何以更好的方式做到这一点的帮助,因为我只是卡在了我到达的地方。
解决方案
我有根据的猜测是,您很难实现切换逻辑,第一次单击将项目添加到数据库中,随后单击将其删除。由于数据的新状态取决于现有状态,因此您需要在那里使用Firebase 事务。
快速刺一下应该是这样的:
final String itemKey = adapter.getRef(position).getKey();
DatabaseReference favoriteRef = favoriteItem.child(Common.user_Current.getPhone()).child(itemKey);
favoriteRef.runTransaction(new Transaction.Handler() {
@Override
public Transaction.Result doTransaction(MutableData mutableData) {
Product product = mutableData.getValue(Product.class)
if (product == null) {
// favorite does not exist, create it
mutableData.setValue(model);
}
else {
// favorite exists, remove it
mutableData.setValue(null);
}
return Transaction.success(mutableData);
}
@Override
public void onComplete(DatabaseError databaseError, boolean b,
DataSnapshot dataSnapshot) {
// Transaction completed
Log.d(TAG, "toggleFavorite:onComplete:" + databaseError);
}
});
推荐阅读
- laravel - 通过 artisan 和 composer 安装的区别
- r - 何在 R 中使用带有 tm 包的自定义词干算法?
- selenium - 与 Implicitwait 相比,我们是否需要为 ExplicitWait 声明更少的时间
- .net - Couchbase Mobile Client Lite 如何通过代理
- python - Django:如何通过模型方法设置默认字段值
- javascript - 为什么日历多个课程缺少右下角的蓝色三角形?
- supervisord - Supervisord:不要从 crond 杀死进程
- javascript - 如何使用 lodash 将对象中的数组数据与计数分组
- sql-server - SSIS:无法运行 sql 任务来更新表
- java - 错误的 SQL 语法 - 在此 ResultSet 中找不到列名?