Firebase:更新整数值

huangapple 未分类评论48阅读模式
英文:

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 实时数据库中减少属性值的正确方法。因为我们正在创建将在多用户环境中使用的应用程序,更适当的方法应该是使用事务,正如我在以下帖子中所解释的答案:

https://stackoverflow.com/questions/48307610/how-to-save-users-score-in-firebase-and-retrieve-it-in-real-time-in-android-stud

或者,更简单的方法是:

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:

> https://stackoverflow.com/questions/48307610/how-to-save-users-score-in-firebase-and-retrieve-it-in-real-time-in-android-stud

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);

huangapple
  • 本文由 发表于 2020年6月29日 18:19:02
  • 转载请务必保留本文链接:https://java.coder-hub.com/62635988.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定