Error: Attempt to invoke virtual method on null object reference 'android.database.Cursor com.myapplication.DatabaseHeleper.getData()'

Error: Attempt to invoke virtual method on null object reference 'android.database.Cursor com.myapplication.DatabaseHeleper.getData()'

This the error

我在执行下面提到的代码后附加了上面的错误,下面给出的代码不是完整代码,但它针对的是我的问题 is.I 试图通过变量发送短信的主要代码,其中数字是通过从 sqlite 数据库中获取来存储的。所以下面的代码显示我试图从 dbhelper.java class 中获取并存储在 sendsms.java class 中的变量 num 中,但我认为它没有获取因此我会要求你看看我错误的代码和指南需要改进。我希望现在问题很清楚并且给出了充分的描述所以请帮忙。

sendsms.java


   try {

            Cursor cursor = databaseHelper.getdata();
            while (cursor.moveToNext())

            {

                String num = cursor.getString(0);
                String numm = cursor.getString(1);
                String nummm = cursor.getString(2);

            }

       }
        catch(Exception e){
            Toast.makeText(getBaseContext(), e.getMessage(),
                    Toast.LENGTH_SHORT).show();
        }

            public void run() {

                sms.sendTextMessage(num, null, "Help! I've met with an accident at http://maps.google.com/?q=" + String.valueOf(latitude) + "" +
                        "," + String.valueOf(longitude), null, null);

dbhelper.java


    public static final String TABLE_REGISTER = "signin";
    public static final String COL_ID = "USER_ID";
    public static final String COL_NAME = "NAME";
    public static final String COL_PHONE = "PHONE_NUMBER";
    public static final String COL_EMAIL = "EMAIL";
    public static final String COL_PASSWORD = "PASSWORD";
    public static final String COL_CONFIRM_PASSWORD = "CONFIRM_PASSWORD";

    public static final String COL_NAMEone_CON = "NAMEONE";
    public static final String COL_NUMBERone_CON = "NUMBERONE";
    public static final String COL_NAMEtwo_CON = "NAMETWO";
    public static final String COL_NUMBERtwo_CON = "NUMBERTWO";
    public static final String COL_NAMEthree_CON = "NAMETHREE";
    public static final String COL_NUMBERthree_CON = "NUMBERTHREE";

    public SQLiteDatabase db;

    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL("CREATE TABLE " + TABLE_REGISTER + "(" + COL_ID + " INTEGER PRIMARY KEY AUTOINCREMENT , "
                + COL_NAME + " TEXT , " + COL_PHONE + "  LONG  UNIQUE  ," + COL_EMAIL + " VARCHAR UNIQUE," + COL_PASSWORD + " VARCHAR , "
                + COL_CONFIRM_PASSWORD + " VARCHAR ," + COL_NAMEone_CON + " TEXT , "
                + COL_NUMBERone_CON + "  LONG  UNIQUE ," + COL_NAMEtwo_CON + " TEXT ," + COL_NUMBERtwo_CON + "  LONG  UNIQUE , "
                + COL_NAMEthree_CON + " TEXT ," + COL_NUMBERthree_CON + " LONG  UNIQUE " + ")");

    }

    public Cursor getdata(){
        SQLiteDatabase db = this.getWritableDatabase();

        Cursor cursor = db.rawQuery("select NUMBERONE, NUMBERTWO,NUMBERTHREE  from signin ", null);

        return cursor;
    }

请像这样更改您的代码:-

 try {

        Cursor cursor = databaseHelper.getdata();
        if (cursor != null && cursor.getCount() > 0) {
            while (cursor.moveToNext()) {

               String num = cursor.getString(0);
               String numm = cursor.getString(1);
               String nummm = cursor.getString(2);

           }
     }

   }
    catch(Exception e){
        Toast.makeText(getBaseContext(), e.getMessage(),
                Toast.LENGTH_SHORT).show();
    }

看来你需要数据之前必须调用getReadableDatabase或getWritableDatabase,这是因为创建database.So需要时间,你必须意识到这一点。

此外,我想说明的是,在 sendsms.java

上执行 cursor.moveToNext() 之前,您必须先 cursor.moveToFirst()