Android 数据库游标上的空对象引用

Android 数据库游标上的空对象引用,android,nullpointerexception,android-sqlite,Android,Nullpointerexception,Android Sqlite,我一直在尝试从数据库检索数据,我的数据库有值,我不知道是哪一个导致此错误 public void popList(String date, String time, String type, String game, String place){ Cursor data = databaseHelper.getReports(date, time, type, game, place); while (data.moveToNext()) { HashMap<

我一直在尝试从数据库检索数据,我的数据库有值,我不知道是哪一个导致此错误

public void popList(String date, String time, String type, String game, String place){
    Cursor data = databaseHelper.getReports(date, time, type, game, place);
    while (data.moveToNext()) {
        HashMap<String, String> datax = new HashMap<>();
        datax.put("id", (data.getString(data.getColumnIndex("betid"))));
        datax.put("betnumber", (data.getString(data.getColumnIndex("betnum"))));
        datax.put("betamount", (data.getString(data.getColumnIndex("betamt"))));
        mData3.add(datax);
    }
    bettorAdapter = new MyAdapter(mData3);
    listViewx.setAdapter(bettorAdapter);
    bettorAdapter.notifyDataSetChanged();
}


    public Cursor getReports(String date, String time, String type, String game, String place){
    Cursor data=null;
    try {
    SQLiteDatabase db = this.getReadableDatabase();
    String query = "SELECT * FROM reports WHERE date='"+date+"' AND time ='"+time+"' AND game='"+game+"' AND type='"+type+"' AND lugar='"+place+"'";
    data = db.rawQuery(query,null);
    }catch (Exception e){
        System.out.println(e);
    }
    return data;
}
public void popList(字符串日期、字符串时间、字符串类型、字符串游戏、字符串位置){
游标数据=databaseHelper.getReports(日期、时间、类型、游戏、地点);
while(data.moveToNext()){
HashMap datax=新的HashMap();
put(“id”),(data.getString(data.getColumnIndex(“betid”));
put(“betnumber”,data.getString(data.getColumnIndex(“betnum”));
put(“betamount”),(data.getString(data.getColumnIndex(“betamt”));
mData3.add(datax);
}
bettorAdapter=新的MyAdapter(mData3);
setAdapter(bettorAdapter);
bettorAdapter.notifyDataSetChanged();
}
公共游标getReports(字符串日期、字符串时间、字符串类型、字符串游戏、字符串位置){
游标数据=空;
试一试{
SQLiteDatabase db=this.getReadableDatabase();
String query=“从报告中选择*,其中日期=”“+date+”,时间=”“+time+”,游戏=”“+game+”,类型=”“+type+”,卢格=”+place+”;
data=db.rawQuery(查询,空);
}捕获(例外e){
系统输出打印ln(e);
}
返回数据;
}

您需要实例化/构造databaseHelper对象,因为如果只声明该对象,则该对象将为null。也就是说,您需要使用等效的行:-

databaseHelper = new DatabaseHelper(appropriate_values_for the_constructor);
其中,构造函数的
适当的\u值\u正如它所说的,是构造函数的适当值,通常只是上下文

在调用poplist方法之前,将使用上述方法。通常,databaseHelper将在类级别声明,并且只要上下文可用,或在上下文可用后不久,就会设置上面的行。在活动中,这可能是在设置ContentView之后的onCreate方法中

下面是一个示例,其中databaseHelper名为mDBHlpr,构造函数只需要传递一个值,即上下文中的有效值(例如,对于活动this):-

public类MainActivity扩展了AppCompatActivity{

DatabaseHelper mDBHlpr;//getReports()中是否有任何异常
?是的,这里是@Priyankagb
java.lang.NullPointerException:尝试调用虚拟方法'android.database.Cursor com.johnlim.butadaapplistview.DatabaseHelper.getReports(java.lang.String,java.lang.String,java.lang.String,java.lang.String,java.lang.String,java.lang.String)'在空对象引用上
您的
数据库帮助程序
为空。请在使用它之前分配它
public class MainActivity extends AppCompatActivity {

    DatabaseHelper mDBHlpr; //<<<<<<<<<< Declares the mDBHlpr instance, it will be null until instantiated

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mDBHlpr = new DatabaseHelper(this); //<<<<<<<<<<< Instantiates the Database Helper instance named mDBHlpr
        .......... other code
    }
    .......... other code
}