簡體   English   中英

Android SQLite查詢返回null

[英]Android Sqlite query returning null

我在Android中有一個靜態的sqlite數據庫。 函數采用int類型的輸入,並查詢數據庫。 它可以正常工作,直到輸入值為97,500,但是如果我輸入更大的值,則會發生以下兩種情況之一

  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;
}

下面是數據庫中數據的屏幕截圖...我不知道為什么它不起作用。 這是數據庫中數據的屏幕截圖

由於看不到您的數據庫,因此我被認為是您的問題的根源是:

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)});

您不應該將數字作為字符串傳遞,因為字符串具有不同的比較規則,例如,字符串“ 2000”將被視為大於字符串“ 102500”。

他們在javadoc文檔中對此進行了警告:

selectionArgs您可以在查詢的where子句中包含?s,它將替換為selectionArgs中的值。 這些值將綁定為字符串。

您應該這樣重寫查詢:

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

同樣,這是一個很常見的問題,有些人遇到了類似的問題: SQLite rawQuery selectionArgs和Integers Fields

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM