索引 2 处的绑定值为空
bind value at index 2 is null
我有两个活动。通过意图将数据从一个 activity 发送到另一个。然后我从数据库中调用一个函数来显示该特定行的所有记录。
这里 feeder_no
和 date
是复合主键。
我没有任何记录的空值,但在索引 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_no
和 date
是复合主键,那么你应该期望查询最多 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();
}
将 column1
、column2
和 column3
更改为您的查询 return 列的实际名称。
我有两个活动。通过意图将数据从一个 activity 发送到另一个。然后我从数据库中调用一个函数来显示该特定行的所有记录。
这里 feeder_no
和 date
是复合主键。
我没有任何记录的空值,但在索引 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_no
和 date
是复合主键,那么你应该期望查询最多 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();
}
将 column1
、column2
和 column3
更改为您的查询 return 列的实际名称。