【问题标题】:Error: Attempt to invoke virtual method on null object reference 'android.database.Cursor com.myapplication.DatabaseHeleper.getData()'错误:尝试在空对象引用“android.database.Cursor com.myapplication.DatabaseHeleper.getData()”上调用虚拟方法
【发布时间】:2020-06-07 12:33:42
【问题描述】:

This the error

我在执行下面提到的代码后附加了上面的错误,下面给出的代码不是完整代码,但它针对我的问题所在的主要代码。我试图通过一个变量发送短信,其中数字存储在从 sqlite 数据库中获取。所以下面的代码显示我试图从 dbhelper.java 类中获取并存储在 sendms.java 类中的变量 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;
    }

【问题讨论】:

  • 您在执行代码“while (cursor.moveToNext())”时遇到崩溃?
  • @ShaluTD 是的,首先出现的错误也附在上面的问题中,然后应用程序崩溃。

标签: java android database sqlite android-studio-3.0


【解决方案1】:

看来你得先调用getReadableDatabase或者getWritableDatabase才需要数据,这是因为创建数据库需要时间。所以,你必须意识到这一点。

另外,我想说明你必须先cursor.moveToFirst(),然后才能在 sendms.java 上执行 cursor.moveToNext()

【讨论】:

  • 您能否进一步澄清这一点。我在 getdata() 下的 dbhelper.java 中添加了 getWritableDatabase。
  • 当然!我想说你可能需要在你的应用程序中更早地调用它。运行应用程序时的一些异步调用,以确保创建数据库。正如文档所说:developer.android.com/reference/android/database/sqlite/…
  • 那么你能确认db确实有信息吗?
  • 是的 sqlite db 有一些信息,但我注意到 db 不能在真实设备上工作,但可以在 android 中使用模拟器。你能帮我解决这个问题吗?
【解决方案2】:

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

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

【讨论】:

  • 您在 try 块中提到的列索引是指表中的特定列。请说清楚。即使使用此代码后,我也会遇到同样的错误!
  • 所以你的光标不会为空 rt?
  • 是的,它不为空,但我注意到 db 不能在真实设备上运行,但可以在 android 中的模拟器上正常运行。我检查了 sqlite db 它有信息。你能帮我吗?
猜你喜欢
  • 1970-01-01
  • 2023-03-13
  • 1970-01-01
  • 1970-01-01
  • 2021-08-24
  • 1970-01-01
  • 1970-01-01
  • 2015-03-24
相关资源
最近更新 更多