索引 2 处的绑定值为空

bind value at index 2 is null

我有两个活动。通过意图将数据从一个 activity 发送到另一个。然后我从数据库中调用一个函数来显示该特定行的所有记录。
这里 feeder_nodate 是复合主键。 我没有任何记录的空值,但在索引 2 处仍然有一个错误的空值。

This is function definition in database:

//show feeder details date wise
public Cursor showFeederDateWiseDetails(int feeder_no, String date) {
    SQLiteDatabase db = this.getReadableDatabase();

    Cursor cursor = db.rawQuery("Select * from " + TABLE_FEEDER_DETAILS + " where feeder_no = ? and date = ?", new String[]{String.valueOf(feeder_no), date});
    while (cursor.moveToFirst()){
        if(cursor.getCount()>0)
            return cursor;
    }
    return null;
}

函数调用

Intent intent = getIntent();
try {
    feeder_no = Integer.parseInt(intent.getStringExtra("feeder_no"));
}catch (NumberFormatException e){
    Toast.makeText(getApplicationContext(), "....", Toast.LENGTH_SHORT).show();
}
String date = intent.getStringExtra("date");
Cursor answer = myDB.showFeederDateWiseDetails(feeder_no, date);
while (answer.moveToNext()) {
    t1.setText(answer.getString(1));
    t2.setText(answer.getString(2));
    t3.setText(answer.getString(3));
}

This is how I am getting value of date and feeder no from one acitivity

private void openFeederDetailsPage() {
    Intent intent = new Intent(this, FeederDetailsDateWise.class);
    intent.putExtra("feeder_no", getFeederNo);
    intent.putExtra("date", getDate);
    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    startActivity(intent);
}

您的代码存在一些问题。

因为 feeder_nodate 是复合主键,那么你应该期望查询最多 return 1 行,所以你得到后不需要循环光标。
cursor.moveToFirst() 的简单调用足以检查游标是否 return 编辑了一行。

然后当您通过调用 showFeederDateWiseDetails() 获得光标时,您必须仅检查它是否为 null
如果不是,则获取列值(无需再次调用 moveToFirst(),之前已经完成)。

最后,不是直接通过它们的索引获取列值(这在 return 多列的查询中是不安全的)而是通过 getColumnIndex() 使用它们的名称。
您应该知道您在 t1.setText(answer.getString(1)); return 中使用的索引 1 是第二列的值,因为该索引是基于 0 的。

此外,您应该将调用 showFeederDateWiseDetails() 的代码移到 try...catch 块中:

public Cursor showFeederDateWiseDetails(int feeder_no, String date) {
    SQLiteDatabase db = this.getReadableDatabase();
    Cursor cursor = db.rawQuery("Select * from " + TABLE_FEEDER_DETAILS + " where feeder_no = ? and date = ?", new String[]{String.valueOf(feeder_no), date});
    if (cursor.moveToFirst()) return cursor;
    return null;
}
.........................................................................
Intent intent = getIntent();
try {
    feeder_no = Integer.parseInt(intent.getStringExtra("feeder_no"));
    String date = intent.getStringExtra("date");
    Cursor answer = myDB.showFeederDateWiseDetails(feeder_no, date);
    if (answer != null) {
        t1.setText(answer.getString(answer.getColumnIndex("column1")));
        t2.setText(answer.getString(answer.getColumnIndex("column2")));
        t3.setText(answer.getString(answer.getColumnIndex("column3")));
    }
    answer.close();
} catch (NumberFormatException e) {
    Toast.makeText(getApplicationContext(), "....", Toast.LENGTH_SHORT).show();
}

column1column2column3 更改为您的查询 return 列的实际名称。