#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. Я надеюсь, что это может помочь вам, если вы еще не поняли, как это сделать.