2012-12-28 240 views
0

我在Android中有一個靜態sqlite數據庫。函數採用int類型的輸入並對數據庫進行查詢。它的做工精細高達的97500輸入值,但如果我進入更大的東西,然後兩種情況之一發生Android Sqlite查詢返回null

  1. 如果輸入爲98,000-99,500如果輸入大於100,000將返回錯誤的數據返回null

下面是是故障的功能:

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

下面是數據庫中的數據的截圖......我想不通爲什麼它不工作。 Here's a screenshot of the data in database

回答

0

因爲我看不到你的數據庫,導致我相信你的問題的根源是這一行:

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

具體的事實,你正在使用income兩個更大的,等於比和小於等於。你確定這是你想要的嗎?你確定這是不是cuppose是

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

沒有查詢是什麼,我想和返回正確的數據輸入少於98000.我附上了數據庫的截圖。如果收入= 98500,那麼應選擇rowid = 17,其中低= 97500和高= 102500,這顯然驗證了97500 <= 98500和102500> = 98500。但它返回null。 – Mehedi

0

你不應該通過數字字符串,因爲字符串有不同的比較規則,例如,字符串「2000」將不是字符串更多考慮「102500 」。

他們發出警告它的Javadoc文檔中:

selectionArgs兩個你可能包括s-在查詢中,將由來自selectionArgs兩個值來代替條款嗎。這些值將被綁定爲字符串。

你應該重寫你的查詢是這樣的:

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

而且,這是一個相當普遍的問題,有些人遇到了類似的問題:SQLite rawQuery selectionArgs and Integers Fields

+0

感謝您的建議。我按照你所說的重新編寫了查詢,但現在它總是返回null。 – Mehedi

+0

@Mehedi發佈創建BudgetTable的代碼。我需要驗證一些字段是否具有整數類型。 – vorrtex

+0

它的解決,這個問題是相當愚蠢的......當我從一個CSV導入到靜態數據庫的數據一些字段被損壞,這些正在創建錯誤...我已經修復了CSV和導入的數據,一切工作精細。感謝你的幫助。 – Mehedi