0

Android に静的な sqlite データベースがあります。関数は int 型の入力を受け取り、データベースに対してクエリを実行します。97,500 の入力値まで問題なく動作していますが、それ以上の値を入力すると、2 つのケースのいずれかが発生します

  1. 入力が 98,000 ~ 99,500 の場合、null を返します
  2. 入力が 100,000 を超えると、間違ったデータが返されます

誤動作している機能は次のとおりです。

    Budget getBudget(int income,String name)
{
    Budget B=null;
    Log.d("DB", String.valueOf(income));
    try{
        SQLiteDatabase db=this.getReadableDatabase();
        Cursor cur=db.rawQuery("SELECT * FROM "+BudgetTable+" WHERE "+Low+"<=? AND "+High+">=?", new String[]{String.valueOf(income),String.valueOf(income)});
        Log.d("DB", String.valueOf(cur.getCount()));
        if(cur.getCount()!=0)
        {
            Log.d("DB", "Cursor not empty");
            cur.moveToFirst();
            B=new Budget(0, income,cur.getInt(cur.getColumnIndex(MortgageRent)),cur.getInt(cur.getColumnIndex(Utilities)) , 
                    cur.getInt(cur.getColumnIndex(LightnPower)), cur.getInt(cur.getColumnIndex(PhonenInternet)), 
                    cur.getInt(cur.getColumnIndex(HomeMaintenance)), cur.getInt(cur.getColumnIndex(HomeCleaning)), 
                    cur.getInt(cur.getColumnIndex(Groceries)), cur.getInt(cur.getColumnIndex(Clothing)),0, 
                    cur.getInt(cur.getColumnIndex(PersonalGrooming)), cur.getInt(cur.getColumnIndex(MedicalnPharmacy)), 
                    cur.getInt(cur.getColumnIndex(HealthInsurance)), cur.getInt(cur.getColumnIndex(LifeInsurance)), 
                    cur.getInt(cur.getColumnIndex(HomeInsurance)), cur.getInt(cur.getColumnIndex(Accounting)), 
                    cur.getInt(cur.getColumnIndex(BankFees)), cur.getInt(cur.getColumnIndex(Fuel)), 
                    cur.getInt(cur.getColumnIndex(ServicenRepairs)), cur.getInt(cur.getColumnIndex(GovernmentCharges)), 
                    cur.getInt(cur.getColumnIndex(CarInsurance)),0, cur.getInt(cur.getColumnIndex(PublicTransport)), 
                    cur.getInt(cur.getColumnIndex(Entertainment)), cur.getInt(cur.getColumnIndex(SportsnGym)),
                    cur.getInt(cur.getColumnIndex(EatOut)), cur.getInt(cur.getColumnIndex(Alcohol)), 
                    cur.getInt(cur.getColumnIndex(Gifts)), cur.getInt(cur.getColumnIndex(Holidays)), 
                    cur.getInt(cur.getColumnIndex(NewspapernMagazine)), cur.getInt(cur.getColumnIndex(Others)), 0, 0, name);

            Log.d("DB", String.valueOf(cur.getInt(cur.getColumnIndex(IncomeLevel))));
            cur.close();
            db.close();

        }
    }catch(Exception ex)
    {
        Log.d("DB", ex.getMessage());
    }
    return B;
}

以下はデータベース内のデータのスクリーンショットです...なぜ機能しないのかわかりません。 これはデータベース内のデータのスクリーンショットです

4

2 に答える 2

0

私はあなたのデータベースを見ることができないので、あなたの問題の原因はこの行であると信じるように導かれます:

Cursor cur=db.rawQuery("SELECT * FROM "+BudgetTable+" WHERE "+Low+"<=? AND "+High+">=?", new String[]{String.valueOf(income),String.valueOf(income)});

具体的には、income等しい以上と等しい以下の両方に使用しているという事実。これがあなたが望むものであると確信していますか?そんなことはありませんか?

Cursor cur=db.rawQuery("SELECT * FROM "+BudgetTable+" WHERE "+Low+"<=? AND "+High+">=?", new String[]{String.valueOf(lowIncome),String.valueOf(highIncome)});
于 2012-12-28T19:12:58.077 に答える
0

文字列には異なる比較規則があるため、数値を文字列として渡さないでください。たとえば、文字列「2000」は文字列「102500」よりも大きいと見なされます。

彼らはjavadocのドキュメントでそれについて警告しています:

selectionArgsクエリのwhere句に?sを含めることができます。これは、selectionArgsの値に置き換えられます。値は文字列としてバインドされます。

クエリを次のように書き直す必要があります。

Cursor cur=db.rawQuery("SELECT * FROM "+BudgetTable+
                      " WHERE "+Low+"<=" + income + " AND "+High+">=" + income);

また、これは非常に一般的な問題であり、同様の問題が発生した人もいます:SQLiterawQueryselectionArgsおよびIntegersFields

于 2012-12-28T19:16:56.613 に答える