Как ограничить условие if только однократным выполнением sql-запроса в java

#java #sql #if-statement

#java #sql #if-оператор

Вопрос:

Я передаю sql-запрос через оператор if, как показано ниже. Мне было интересно, как я могу ограничить выполнение запроса бесконечным числом раз только одним отключением? Мне нужен цикл, поскольку он постоянно взвешивает то, что находится на весах, и когда значение находится в диапазоне моего массива, он выполняет запрос, но он выполняется повторно, пока вес находится в этом диапазоне. Есть ли способ обойти это, когда после его выполнения он не будет выполняться снова, даже если вес все еще находится в диапазоне?

  public class UsbScale implements UsbPipeListener {

    private final UsbDevice device;
    private UsbInterface iface;
    private UsbPipe pipe;
    private byte[] data = new byte[6];

    private UsbScale(UsbDevice device) {
        this.device = device;
    }

    public static void main(String[] args) throws UsbException {

        UsbScale scale = UsbScale.findScale();
        scale.open();
        try {
            for (boolean i = true; i; i = true) {
                scale.syncSubmit();
            }
        } finally {
            scale.close();
        }
    }

    public static UsbScale findScale() throws UsbException {
        UsbServices services = UsbHostManager.getUsbServices();
        UsbHub rootHub = services.getRootUsbHub();
        // Dymo M5 Scale:
        UsbDevice device = findDevice(rootHub, (short) 0x0922, (short) 0x8003);
        // Dymo M25 Scale:
        if (device == null) {
            device = findDevice(rootHub, (short) 0x0922, (short) 0x8005);
        }
        if (device == null) {
            return null;
        }
        return new UsbScale(device);
    }

    private static UsbDevice findDevice(UsbHub hub, short vendorId, short productId) {
        for (UsbDevice device : (List<UsbDevice>) hub.getAttachedUsbDevices()) {
            UsbDeviceDescriptor desc = device.getUsbDeviceDescriptor();
            if (desc.idVendor() == vendorId amp;amp; desc.idProduct() == productId) {
                return device;
            }
            if (device.isUsbHub()) {
                device = findDevice((UsbHub) device, vendorId, productId);
                if (device != null) {
                    return device;
                }
            }
        }
        return null;
    }

    private void open() throws UsbException {
        UsbConfiguration configuration = device.getActiveUsbConfiguration();
        iface = configuration.getUsbInterface((byte) 0);
        // this allows us to steal the lock from the kernel
        iface.claim(usbInterface -> true);
        final List<UsbEndpoint> endpoints = iface.getUsbEndpoints();
        pipe = endpoints.get(0).getUsbPipe(); // there is only 1 endpoint
        pipe.addUsbPipeListener(this);
        pipe.open();
    }

    private void syncSubmit() throws UsbException {
        pipe.syncSubmit(data);
    }

    public void close() throws UsbException {
        pipe.close();
        iface.release();
    }

    @Override
    public void dataEventOccurred(UsbPipeDataEvent upde) {

        boolean empty = data[1] == 2;
        boolean overweight = data[1] == 6;
        boolean negative = data[1] == 5;
        boolean grams = data[2] == 2;
        int scalingFactor = data[3];
        int weight = (data[4] amp; 0xFF)   (data[5] << 8);

        // int phoneWeights[] = new int[5];
        // int minWeight = 142;
        //int previous weight=0;

        boolean phoneOnScale = false;
        int[] phoneWeight = {140,150};

        /*
         for(int i=0, i=Length(phoneWeights); i  ) { phoneWeights[i] = minweight i; }
         */

        /*
         * System.out.println(String.format("Weight = %,.1f%s", scaleWeight(weight,
         * scalingFactor), grams ? "g" : "oz"));
         */

        System.out.println("My Weight: "   weight);
        /*if(newweight != oldweight) {
            oldweight = newweight;
            write to db shopping list;
        }*/

        if(phoneWeight[0] <= weight amp;amp; weight <= phoneWeight[1]) {
            phoneOnScale = true;
            System.out.println("Phone is on scale");
            // write one phone to table in db.
            try {
                // create a mysql database connection
                String myDriver = "com.mysql.jdbc.Driver";
                String myUrl = "jdbc:mysql://localhost:3306/smartfridge";
                Class.forName(myDriver);
                Connection conn = DriverManager.getConnection(myUrl, "root", "admin");

                // the mysql insert statement
                String query = " insert into fridge (name, UnitOfSale, ContentsQuantity, department, AverageSellingUnitWeight)"
                          " values (?, ?, ?, ?, ?)";

                // create the mysql insert preparedstatement
                PreparedStatement preparedStmt = conn.prepareStatement(query);
                preparedStmt.setString(1, "Eggs");
                preparedStmt.setInt(2, 1);
                preparedStmt.setInt(3, 6);
                preparedStmt.setString(4, "Milk, Butter amp; Eggs");
                preparedStmt.setBoolean(5, phoneOnScale);

                // execute the preparedstatement
                preparedStmt.execute();


            } catch (Exception e) {
                e.printStackTrace();
            }
        } else {
            phoneOnScale = false;
        }
  

Комментарии:

1. есть ли цикл поверх if ?

2. @Deadpool Да, извините, цикл содержится в моем основном методе: ‘public static void main(String[] args) вызывает исключение UsbException { UsbScale scale = UsbScale.findScale(); scale.open(); try { for (логическое значение i = true; i; i = true) { scale.syncSubmit(); } } наконец { scale.close(); } }’

3. Простой цикл удаления, если он вам не нужен

4. @Deadpool Мне нужен цикл, поскольку он постоянно взвешивает то, что находится на весах, и когда значение находится в диапазоне моего массива, он выполняет запрос, но он выполняется повторно, пока вес находится в этом диапазоне. Есть ли способ обойти это, когда после его выполнения он не будет выполняться снова, даже если вес все еще находится в диапазоне?

5. Вам следует обновить код

Ответ №1:

Что вы можете попробовать сделать, так это присвоить логическому значению false в начале. Затем создайте другой цикл if перед запросом, который будет выполнять запрос, только если он равен false. Затем, как только вы запустите запрос, измените переменную на true с помощью самого цикла. В псевдокоде

 boolean querychecker = False
#this would have to be done outside your other loop. Maybe at the beginning of the class.
if (querychecker == False){
    do(query)
    querychecker = True
}
else {
   #whatever you want to do
}
  

Комментарии:

1. Я надеюсь, что это может помочь вам, если вы еще не поняли, как это сделать.