2012-12-28 4 views
0

J'ai une base de données sqlite statique dans Android. Une fonction prend un type d'entrée int et effectue une requête sur la base de données. Il fonctionne très bien les valeurs d'entrée jusqu'à de 97500, mais si je rentre tout plus grand que l'un des deux cas se produitRequête Android Sqlite renvoyant null

  1. Si l'entrée est 98,000-99,500 il renvoie null
  2. Si l'entrée supérieure à 100 000 il renvoie les données erronées

est ici la fonction qui est défectueux:

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

Voici une capture d'écran des données dans la base de données ... Je ne peux pas comprendre pourquoi cela ne fonctionne pas. Here's a screenshot of the data in database

Répondre

0

Comme je ne vois pas votre base de données, je suis porté à croire la source de votre problème est cette ligne:

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

spécifiquement le fait que vous utilisez income pour les plus-égaux que ET moins que-égal. Êtes-vous sûr que c'est ce que vous voulez? Etes-vous sûr il est cuppose pas être

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

Pas la requête est ce que je veux et retour corriger les données pour les entrées moins de 98000. J'ai joint une capture d'écran de la base de données aussi. Voir si le revenu = 98500 puis rowid = 17 devrait être choisi qui a bas = 97500 et haut = 102500 qui valide évidemment 97500 <= 98500 et 102500> = 98500. Mais son retour est nul. – Mehedi

0

Vous ne devriez pas passer des nombres sous forme de chaînes, parce que les chaînes ont des règles différentes de comparaison, par exemple, la chaîne « 2000 » sera considérée comme supérieure à la chaîne « 102500 ".

Ils mettent en garde à ce sujet dans la documentation javadoc:

selectionArgs Vous pouvez inclure dans l where dans la requête, qui sera remplacée par les valeurs de selectionArgs?. Les valeurs seront liées en tant que chaînes.

Votre devrait réécrire votre requête comme ceci:

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

En outre, il est tout à fait un problème commun et certaines personnes ont rencontré un problème similaire: SQLite rawQuery selectionArgs and Integers Fields

+0

Merci pour votre suggestion. J'ai réécrit la requête comme vous l'avez dit mais maintenant elle retourne toujours null. – Mehedi

+0

@Mehedi Postez un code qui crée BudgetTable. Je dois vérifier que certains champs ont le type entier. – vorrtex

+0

Son résolu, le problème était assez stupide ... quand j'ai importé les données d'un csv à la base de données statique certains champs ont été corrompus et ceux qui créaient l'erreur ... J'ai corrigé le csv et les données importées à nouveau et tout fonctionne bien. Merci pour votre aide. – Mehedi