Android Sqlite查询返回null

Android Sqlite查询返回null,android,android-sqlite,Android,Android Sqlite,我在Android中有一个静态sqlite数据库。函数接受int类型的输入并对数据库进行查询。当输入值达到97500时,它可以正常工作,但是如果我输入任何更大的值,则会出现两种情况之一 如果输入为98000-99500,则返回null 如果输入大于100000,则返回错误的数据 以下是出现故障的函数: Budget getBudget(int income,String name) { Budget B=null; Log.d("DB", String.valueOf(i

我在Android中有一个静态sqlite数据库。函数接受int类型的输入并对数据库进行查询。当输入值达到97500时,它可以正常工作,但是如果我输入任何更大的值,则会出现两种情况之一

  • 如果输入为98000-99500,则返回null
  • 如果输入大于100000,则返回错误的数据
  • 以下是出现故障的函数:

        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;
    }
    
    Budget getBudget(整数收入,字符串名称)
    {
    预算B=空;
    Log.d(“DB”,String.valueOf(income));
    试一试{
    SQLiteDatabase db=this.getReadableDatabase();
    游标cur=db.rawQuery(“从“+BudgetTable+”中选择*,其中“+Low+”=?”,新字符串[]{String.valueOf(income),String.valueOf(income)});
    Log.d(“DB”,String.valueOf(cur.getCount());
    如果(cur.getCount()!=0)
    {
    Log.d(“DB”,“光标不为空”);
    cur.moveToFirst();
    B=新预算(0,收入,当前getInt(当前getColumnIndex(MortgageRent)),当前getInt(当前getColumnIndex(Utilities)),
    cur.getInt(cur.getColumnIndex(LightnPower)),cur.getInt(cur.getColumnIndex(PhonenInternet)),
    cur.getInt(cur.getColumnIndex(HomeMaintenance)),cur.getInt(cur.getColumnIndex(HomeCleaning)),
    当前getInt(当前getColumnIndex(杂货)),当前getInt(当前getColumnIndex(服装)),0,
    cur.getInt(cur.getColumnIndex(个性化修饰)),cur.getInt(cur.getColumnIndex(MedicalPharmacy)),
    当前getInt(当前getColumnIndex(健康保险)),当前getInt(当前getColumnIndex(人寿保险)),
    当前getInt(当前getColumnIndex(家庭保险)),当前getInt(当前getColumnIndex(会计)),
    当前getInt(当前getColumnIndex(银行费用)),当前getInt(当前getColumnIndex(燃料)),
    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(娱乐)),cur.getInt(cur.getColumnIndex(SportsnGym)),
    cur.getInt(cur.getColumnIndex(EatOut)),cur.getInt(cur.getColumnIndex(酒精)),
    当前getInt(当前getColumnIndex(礼品)),当前getInt(当前getColumnIndex(假日)),
    cur.getInt(cur.getColumnIndex(NewspapernMagazine)),cur.getInt(cur.getColumnIndex(其他)),0,0,name);
    Log.d(“DB”,String.valueOf(cur.getInt(cur.getColumnIndex(IncomeLevel)));
    cur.close();
    db.close();
    }
    }捕获(例外情况除外)
    {
    Log.d(“DB”,例如getMessage());
    }
    返回B;
    }
    
    下面是数据库中数据的截图…我不明白为什么它不工作。

    由于我看不到您的数据库,我相信您的问题的根源是这一行:

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

    您不应该将数字作为字符串传递,因为字符串具有不同的比较规则,例如,字符串“2000”将被视为大于字符串“102500”

    他们在javadoc文档中对此提出警告:

    selectionArgs您可以在查询中的where子句中包含?s,该子句将被selectionArgs中的值替换。这些值将被绑定为字符串

    您应该按照以下方式重写查询:

    Cursor cur=db.rawQuery("SELECT * FROM "+BudgetTable+
                          " WHERE "+Low+"<=" + income + " AND "+High+">=" + income);
    
    cursorcur=db.rawQuery(“选择*自”+BudgetTable+
    “其中”+低+“=”+收入);
    

    此外,这是一个非常常见的问题,有些人遇到了类似的问题:

    否查询是我想要的,并且返回的输入数据少于98000的正确数据。我还附上了数据库的截图。如果收入=98500,则应选择rowid=17,低=97500,高=102500,这显然验证了97500=98500。但是它返回空值。谢谢你的建议。正如您所说,我已经编写了查询,但现在它总是返回null。@Mehedi发布了一个创建BudgetTable的代码。我需要验证一些字段是否为整数类型。问题已经解决,问题相当愚蠢…当我将数据从csv导入静态数据库时,一些字段已损坏,这些字段正在创建错误…我已修复csv并再次导入数据,一切正常。谢谢你的帮助。
    Cursor cur=db.rawQuery("SELECT * FROM "+BudgetTable+
                          " WHERE "+Low+"<=" + income + " AND "+High+">=" + income);