【问题标题】:bind value at index 2 is null索引 2 处的绑定值为 null
【发布时间】:2021-09-17 16:40:14
【问题描述】:

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

这是数据库中的函数定义:

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

这就是我如何从一个活动中获取日期和馈线的价值

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

【问题讨论】:

  • 您的查询返回多少列?
  • 返回六列

标签: java android database sqlite android-sqlite


【解决方案1】:

您的代码存在一些问题。

由于feeder_nodate 是复合主键,那么您应该期望查询最多返回1 行,因此在获得游标后不需要循环。
cursor.moveToFirst() 的简单调用就足以检查游标是否返回了一行。

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

最后,不是通过索引直接获取列值(这在返回许多列的查询中是不安全的),而是通过getColumnIndex() 使用它们的名称。
您应该知道,您在 t1.setText(answer.getString(1)); 中使用的索引 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 更改为查询返回的列的实际名称。

【讨论】:

  • 仍有错误。列的值没有显示在 textview 中
  • @Sum 应用程序是否崩溃或者您只是没有获得文本视图中的值?
  • 应用崩溃
  • @Sum 错误日志中的信息是什么?
  • @Sum 如果您看到 toast 消息,这意味着应用程序没有崩溃,但您尝试转换为整数的数字不正确。如果应用程序崩溃,您可以在 Android Studio 屏幕底部查看错误日志。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-06-02
  • 1970-01-01
  • 2015-06-19
  • 2015-06-28
  • 1970-01-01
  • 2021-08-22
  • 1970-01-01
相关资源
最近更新 更多