3

「満タン」という特定のチェックボックスがあるアプリを作成しています。このボックスにチェックを入れると、バリュー マイレージを計算してデータベースに保存する必要があります。チェックが入っていない場合は、マイレージは計算されず、マイレージ欄に0が格納されます。ただし、データベースに最初のエントリを作成するときは、チェックボックスがオンになっているかどうかに関係なく、マイレージを 0 にしたいと考えています。

誰でもアイデアを手伝ってもらえますか?私が今まで試したことは次のとおりですが、このコードは最初の行のマイレージも生成します:-

    public void calculateMileage(FuelExpense fe) 
    {

        // TODO Auto-generated method stub
        String [] columns = new String[]{KEY_ROW_ID, KEY_KM, KEY_FUEL_QTY, KEY_FUEL_PRICE, KEY_TOTAL_COST, KEY_MILEAGE, KEY_DATE,KEY_TANK_FULL};

        long numRows = DatabaseUtils.queryNumEntries(ourDatabase, "fuel_table");
        if(fe.getTankFullstatus()==true)
        {
            mileageCursor = ourDatabase.rawQuery("SELECT * FROM fuel_table ORDER BY _id DESC LIMIT 1", null);

            if(mileageCursor!=null && mileageCursor.getCount()>0)
            {

                mileageCursor.moveToLast();

                String lastKm = mileageCursor.getString(1);
                String lastFuelQty = mileageCursor.getString(2);

                lastDBFuelEntry.setKm(Long.parseLong(lastKm));
                lastDBFuelEntry.setFuelQty(Double.parseDouble(lastFuelQty));
            }
            else
            {
                mileage = 0.0d;
            }

        }
        else
        {

            for(mileageCursor.moveToLast();!mileageCursor.isBeforeFirst();mileageCursor.moveToPrevious())
            {
                nftQty = nftQty+lastDBFuelEntry.getFuelQty();

            }

        }
        fuelUsed = nftQty + fe.getFuelQty();
        mileage =(fe.getKm() - lastDBFuelEntry.getKm())/ fuelUsed;
        mileage= (double)(Math.round(mileage*100))/100;
        fe.setMileage(mileage);
        }

Table creation:-
//Fuel info table
            db.execSQL( "CREATE TABLE "+FUEL_DATABASE_TABLE +" (" +
                    KEY_ROW_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " +
                    KEY_KM + " LONG NOT NULL, "+
                    KEY_FUEL_QTY + " INTEGER NOT NULL, "+
                    KEY_FUEL_PRICE + " DOUBLE NOT NULL, "+
                    KEY_TOTAL_COST + " DOUBLE NOT NULL, "+
                    KEY_MILEAGE + " DOUBLE DEFAULT 0, "+
                    KEY_DATE + " DATE NOT NULL, "+
                    KEY_TANK_FULL + " TEXT);"
                    );

Insert:-
{
        // TODO Auto-generated method stub


        ContentValues cv = new ContentValues();
        cv.put(KEY_KM, fe.getKm());
        cv.put(KEY_FUEL_QTY, fe.getFuelQty());
        cv.put(KEY_FUEL_PRICE,fe.getFuelPrice());
        cv.put(KEY_TOTAL_COST, fe.getTotalCost());
        cv.put(KEY_MILEAGE, fe.getMileage());
        cv.put(KEY_DATE, fe.getFuelFilledDate());
        cv.put(KEY_TANK_FULL, fe.getTankFullstatus());
        return ourDatabase.insert(FUEL_DATABASE_TABLE, null, cv);
    }
4

2 に答える 2

1

私があなたのことを正しく理解していれば、

データベースにエントリが 1 つしかない場合は、計算せずにゼロを表示する必要があります。

あなたがする必要があるのは、これを変更することだけだと思います:

if(mileageCursor!=null && mileageCursor.getCount()>0

これに:

if(mileageCursor!=null && mileageCursor.getCount()>1

moveToPrevious()そして、データベースにエントリが 1 つしかない場合、結果の計算は 0 になります。エントリが 1 つしかないのに、カーソルでを呼び出そうとしているため、コードがおかしくなっていると思います。

于 2013-08-14T06:24:45.333 に答える
0

次のような最初の行であるかどうかを確認できます。

//Fetch row count in FUEL_DATABASE_TABLE before insertion
if(ROW_COUNT == 0)
    Insert into FUEL_DATABASE_TABLE (... KEY_MILEAGE ...) values (... 0 ...);
else
    // Insert what you want
于 2013-08-14T06:19:37.377 に答える