英文:
Firebase: update an integer value
问题
以下是翻译好的内容:
我正在编写一个库存管理应用程序,使用条形码扫描仪扫描我的产品。我的想法是每次扫描一个产品时,我需要在数据库中减少一个数量。就像这样:扫描产品-->数量=数量-1
这是我的代码:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mFirestore = FirebaseFirestore.getInstance();
scannerView = new ZXingScannerView(this);
setContentView(scannerView);
}
private void updateData() {
// myresult 是项目条形码
final DatabaseReference mDatabase = FirebaseDatabase.getInstance().getReference("Items").child(myresult).child("itemquantity");
mDatabase.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
long qty = (long) dataSnapshot.getValue();
mDatabase.setValue(qty - 1);
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
}
@Override
public void onDestroy() {
super.onDestroy();
scannerView.stopCamera();
}
private void showMessageOKCancel(String message, DialogInterface.OnClickListener okListener) {
new AlertDialog.Builder(addquantityactivity.this)
.setMessage(message)
.setPositiveButton("OK", okListener)
.setNegativeButton("Cancel", null)
.create()
.show();
}
@Override
public void handleResult(Result result) {
myResult = result.getText();
Log.d("QRCodeScanner", result.getText());
Log.d("QRCodeScanner", result.getBarcodeFormat().toString());
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("Scan Result");
builder.setPositiveButton("OK", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
updateData();
scannerView.resumeCameraPreview(addquantityactivity.this);
}
});
builder.setNeutralButton("Visit", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(myResult));
startActivity(browserIntent);
}
});
builder.setMessage(result.getText());
AlertDialog alert1 = builder.create();
alert1.show();
}
我在handleResult
函数中调用了updateData()
。我得到的错误是:
> java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Long
英文:
So im coding an inventory management app and I'm using a barcode scanner to scan my products. My idea is that every time that a product gets scanned I need to remove one quantity of it on my database. Like this: Scan product-->quantity=quantity-1
And this is my code
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mFirestore = FirebaseFirestore.getInstance();
scannerView = new ZXingScannerView(this);
setContentView(scannerView);
private void updateData() {
//myresult is the item barcode
final DatabaseReference mDatabase = FirebaseDatabase.getInstance().getReference("Items").child(myresult).child("itemquantity");
mDatabase.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
long qty =(long) dataSnapshot.getValue();
mDatabase.setValue(qty - 1);
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
@Override
public void onDestroy() {
super.onDestroy();
scannerView.stopCamera();
}
private void showMessageOKCancel(String message, DialogInterface.OnClickListener okListener) {
new AlertDialog.Builder(addquantityactivity.this)
.setMessage(message)
.setPositiveButton("OK", okListener)
.setNegativeButton("Cancel", null)
.create()
.show();
}
@Override
public void handleResult(Result result) {
myResult = result.getText();
Log.d("QRCodeScanner", result.getText());
Log.d("QRCodeScanner", result.getBarcodeFormat().toString());
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("Scan Result");
builder.setPositiveButton("OK", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
updateData();
scannerView.resumeCameraPreview(addquantityactivity.this);
}
});
builder.setNeutralButton("Visit", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(myResult));
startActivity(browserIntent);
}
});
builder.setMessage(result.getText());
AlertDialog alert1 = builder.create();
alert1.show();
}
}
i call updateData()
in my handleResult
function.
The error i get is :
> java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Long
答案1
得分: 0
这不是在 Firebase 实时数据库中减少属性值的正确方法。因为我们正在创建将在多用户环境中使用的应用程序,更适当的方法应该是使用事务,正如我在以下帖子中所解释的答案:
或者,更简单的方法是:
mDatabase.setValue(ServerValue.increment(-1));
英文:
That's not the right way to decrement the value of a property in Firebase Realtime Database. Because we are creating apps that will be used in a multi-user environment, a more appropriate approach should be the use of transactions as explained in my answer from the following post:
Or, in a more simpler way:
mDatabase.setValue(ServerValue.increment(-1));
答案2
得分: 0
尝试这样写:
long qty = dataSnapshot.getValue(Long.class);
英文:
Try this :
long qty = dataSnapshot.getValue(Long.class);
专注分享java语言的经验与见解,让所有开发者获益!
评论