Как остановить цикл и вставить данные в массив в определенных условиях на Android

#java #android #arrays #loops

#java #Android #массивы #циклы

Вопрос:

Я хочу, чтобы мой цикл останавливался, когда он выполняется при условии, вот код :

 for (i = 0; i < 8 ; i  ) {
    Cursor r = db.rawQuery("SELECT _id, key_foodstuff, key_calorie, key_carbohydrate, key_fat, key_protein FROM (food INNER JOIN categories ON food.key_nocategory = categories.nocategories) WHERE key_type!='secondary' AND _id!=164 ORDER BY RANDOM() LIMIT 1", null);       

    if(r.moveToFirst())
    {
            morning_food[i] = r.getString(0);
            Log.v("_id : ", morning_food[i]);
            morning_food[c] = r.getString(2);
            Log.v("Kalori : ", morning_food[c]);
            sumOfCalorie = sumOfCalorie   Double.parseDouble(morning_food [c]);
            Log.v("Sum : ", ""   sumOfCalorie);

            if (sumOfCalorie == morning_cal || sumOfCalorie >= morning_cal-(morning_cal*0.1) amp;amp; sumOfCalorie <= morning_cal (morning_cal*0.1))
            {
                break;
            }


    }
  

есть ли какое-либо решение для этого? это не работает… Спасибо.

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

1. почему вы хотите прервать цикл?

2. или что именно вы пытаетесь реализовать?

3. У меня есть 8 слотов для цикла, но если sumOfCalorie уже соответствует требуемому, тогда 8 слотов не должны быть заполнены, поэтому может быть < 8.

Ответ №1:

if(r.moveToFirst()) .. вы просматриваете первую строку 8 раз, даже не переходя к следующей?

Ответ №2:

попробуйте это

 outerloop:
for (i = 0; i < 8 ; i  ) {
    Cursor r = db.rawQuery("SELECT _id, key_foodstuff, key_calorie, key_carbohydrate, key_fat, key_protein FROM (food INNER JOIN categories ON food.key_nocategory = categories.nocategories) WHERE key_type!='secondary' AND _id!=164 ORDER BY RANDOM() LIMIT 1", null);       

    if(r.moveToFirst())
    {
            morning_food[i] = r.getString(0);
            Log.v("_id : ", morning_food[i]);
            morning_food[c] = r.getString(2);
            Log.v("Kalori : ", morning_food[c]);
            sumOfCalorie = sumOfCalorie   Double.parseDouble(morning_food [c]);
            Log.v("Sum : ", ""   sumOfCalorie);

            if (sumOfCalorie == morning_cal || sumOfCalorie >= morning_cal-(morning_cal*0.1) amp;amp; sumOfCalorie <= morning_cal (morning_cal*0.1))
            {
                break outerloop;
            }


    }
  

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

1. достигает ли элемент управления вашего оператора break? Вы пробовали поместить журнал, чтобы убедиться.

2. Просто поместите Log.e(«BREAK»,»BREAK»); перед оператором break и проверьте logcat, будет ли это когда-либо напечатано.

3. Я уже это сделал, это никогда не печатается, так что мне делать? Спасибо

4. Фанк прав, вам нужно использовать r.moveToNext(). Ваша логика неверна, поэтому ваше условие if никогда не оценивается как true, и оператор break никогда не выполняется. Вам нужно будет это исправить.

5. спасибо большое blessenm = D, нет, не нужно moveToNext(), потому что у него есть for .

Ответ №3:

Можете ли вы поместить этот код в функцию, например:

             private void doYourCode() {
            for (i = 0; i < 8 ; i  ) {
                Cursor r = db.rawQuery("SELECT _id, key_foodstuff, key_calorie, key_carbohydrate, key_fat, key_protein FROM (food INNER JOIN categories ON food.key_nocategory = categories.nocategories) WHERE key_type!='secondary' AND _id!=164 ORDER BY RANDOM() LIMIT 1", null);       

                if(r.moveToFirst())
                {
                        morning_food[i] = r.getString(0);
                        Log.v("_id : ", morning_food[i]);
                        morning_food[c] = r.getString(2);
                        Log.v("Kalori : ", morning_food[c]);
                        sumOfCalorie = sumOfCalorie   Double.parseDouble(morning_food [c]);
                        Log.v("Sum : ", ""   sumOfCalorie);

                        if (sumOfCalorie == morning_cal || sumOfCalorie >= morning_cal-(morning_cal*0.1) amp;amp; sumOfCalorie <= morning_cal (morning_cal*0.1))
                        {
                            //break;
                            return;
                        }


                }
            }