Получение ошибки нулевой точки при попытке вставить значения - PullRequest
1 голос
/ 06 июня 2019
public boolean addInfo(String username, String DOB, String gender, String password) {

            SQLiteDatabase db = this.getWritableDatabase();

            ContentValues contentValues = new ContentValues();

            contentValues.put(UserProfile.Users.col_02, username);
            contentValues.put(UserProfile.Users.col_03, DOB);
            contentValues.put(UserProfile.Users.col_04, gender);
            contentValues.put(UserProfile.Users.col_05, password);

            long res = db.insert(UserProfile.Users.Table_Name, null, contentValues);

            if (res == -1) {
                return false;
            } else {
                return true;
            }

        }




public boolean updateInfo(String id, String username, String DOB, String gender, String password) {

        SQLiteDatabase db = this.getWritableDatabase();
        ContentValues contentValues = new ContentValues();

        contentValues.put(UserProfile.Users.col_01, id);
        contentValues.put(UserProfile.Users.col_02, username);
        contentValues.put(UserProfile.Users.col_03, DOB);
        contentValues.put(UserProfile.Users.col_04, gender);
        contentValues.put(UserProfile.Users.col_05, password);

db.update(UserProfile.Users.Table_Name, contentValues, "ID = ?", new String[]{id});

        return true;

    }

    public Cursor readAllInfo(String id) {

        SQLiteDatabase db = this.getReadableDatabase();

        String[] projection = {
                UserProfile.Users.col_01,
                UserProfile.Users.col_02,
                UserProfile.Users.col_03,
                UserProfile.Users.col_04,
                UserProfile.Users.col_05
        };

        String selection = UserProfile.Users.col_01 + "=?";

        Cursor cursor = db.query(UserProfile.Users.Table_Name,
                projection,
                selection,
                new String[]{id},
                null,
                null,
                null);

        return cursor;

    }
  public Integer deleteInfo(String id) {
        SQLiteDatabase db = this.getWritableDatabase();

  return db.delete(UserProfile.Users.Table_Name, "ID = ?", new String[]{id});

    }

Это мои методы, в которых, я думаю, нет ничего плохого в коде, но, тем не менее, каждый раз, когда я вызываю addInfo метод в моей кнопке добавления, он говорит «исключение нулевой точки при попытке вызвать виртуальный метод»

Ответы [ 2 ]

1 голос
/ 06 июня 2019

Вероятная причина в том, что вы объявляете, но не создаете экземпляр объекта Помощник по базам данных, т.е. this .

Методы, вероятно, являются частью класса, который расширяет SQliteOpenHelper, и у него будет конструктор, предполагая, что класс DBHelper, а затем в действии, которое вызывает эти методы

у вас будет что-то вроде

DBHelper myDatabaseHelper;
  • Обратите внимание, что без кода, который вызывает (вызывает) метод, фактические имена могут быть любыми. Трассировка стека, см. Отладка приложения. Просмотр системного журнала также предоставляет информацию, которая должна быть скопирована в такие вопросы, поскольку она точно определяет, где произошло исключение.

перед вызовом методов, которые вам нужно создать (конструировать) myDatabaseHelper, который будет выглядеть примерно так: -

    myDatabaseHelper = new DBhelper(this); //<<<<<<<<<< You are likely missing this and hence myDatabaseHelper is null.

Вы можете использовать

     if (myDatabaseHelper.addInfo("TheUserName","2000-01-01","Female","thepassword"))
         ...... code to run if the info was added 
     { else {
         ... code to run if the user was not added
     }

Поскольку myDatabaseHelper имеет значение null, возникает исключение, когда делается попытка получить к нему доступ (addInfo, если он был создан / создан, был бы частью myDatabaseHelper)

Рассмотрим следующий пример: -

Ваш DatabaseHelper (так как будет использоваться без изменений в обоих примерах): -

public class DBHelper extends SQLiteOpenHelper {

    public static final String DBNAME = "mydb";
    public static final int DBVERSION = 1;

    public DBHelper(Context context) {
        super(context, DBNAME, null, DBVERSION);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL("CREATE TABLE If NOT EXISTS " + UserProfile.Users.Table_Name +
                "(" +
                        UserProfile.Users.col_01 + " INTEGER PRIMARY KEY," +
                        UserProfile.Users.col_02 + " TEXT, " +
                        UserProfile.Users.col_03 + " TEXT," +
                        UserProfile.Users.col_04 + " TEXT," +
                        UserProfile.Users.col_05 + " TEXT" +
                ")"
        ); 
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

    }

    public boolean addInfo(String username, String DOB, String gender, String password) {

        SQLiteDatabase db = this.getWritableDatabase();
        ContentValues contentValues = new ContentValues();
        contentValues.put(UserProfile.Users.col_02, username);
        contentValues.put(UserProfile.Users.col_03, DOB);
        contentValues.put(UserProfile.Users.col_04, gender);
        contentValues.put(UserProfile.Users.col_05, password);
        long res = db.insert(UserProfile.Users.Table_Name, null, contentValues);
        if (res == -1) {
            return false;
        } else {
            return true;
        }
    }

    public boolean updateInfo(String id, String username, String DOB, String gender, String password) {

        SQLiteDatabase db = this.getWritableDatabase();
        ContentValues contentValues = new ContentValues();
        contentValues.put(UserProfile.Users.col_01, id);
        contentValues.put(UserProfile.Users.col_02, username);
        contentValues.put(UserProfile.Users.col_03, DOB);
        contentValues.put(UserProfile.Users.col_04, gender);
        contentValues.put(UserProfile.Users.col_05, password);
        db.update(UserProfile.Users.Table_Name, contentValues, "ID = ?", new String[]{id});
        return true;
    }

    public Cursor readAllInfo(String id) {

        SQLiteDatabase db = this.getReadableDatabase();
        String[] projection = {
                UserProfile.Users.col_01,
                UserProfile.Users.col_02,
                UserProfile.Users.col_03,
                UserProfile.Users.col_04,
                UserProfile.Users.col_05
        };

        String selection = UserProfile.Users.col_01 + "=?";

        Cursor cursor = db.query(UserProfile.Users.Table_Name,
                projection,
                selection,
                new String[]{id},
                null,
                null,
                null);
        return cursor;

    }
    public Integer deleteInfo(String id) {
        SQLiteDatabase db = this.getWritableDatabase();
        return db.delete(UserProfile.Users.Table_Name, "ID = ?", new String[]{id});
    }
}
  • Обратите внимание, что ваш код встроен, как указано выше.

И рассмотрим вызывающее действие (БЕЗ создания экземпляра myDatabasehelper): -

public class MainActivity extends AppCompatActivity {

    DBHelper myDatabaseHelper;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //myDatabaseHelper = new DBHelper(this); //<<<<<<<<<< 
        myDatabaseHelper.addInfo("UserX","2000-01-01","Unknown","password");
        Cursor csr = myDatabaseHelper.readAllInfo("1");
        DatabaseUtils.dumpCursor(csr);
    }
}

Вы получаете исключение нулевого указателя (NPE) согласно: -

2019-06-06 15:34:46.235 5658-5658/aso.so5647108356471083 E/AndroidRuntime: FATAL EXCEPTION: main
    Process: aso.so5647108356471083, PID: 5658
    java.lang.RuntimeException: Unable to start activity ComponentInfo{aso.so5647108356471083/aso.so5647108356471083.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'boolean aso.so5647108356471083.DBHelper.addInfo(java.lang.String, java.lang.String, java.lang.String, java.lang.String)' on a null object reference
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2913)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3048)
        at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:78)
        at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:108)
        at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:68)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1808)
        at android.os.Handler.dispatchMessage(Handler.java:106)
        at android.os.Looper.loop(Looper.java:193)
        at android.app.ActivityThread.main(ActivityThread.java:6669)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
     Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'boolean aso.so5647108356471083.DBHelper.addInfo(java.lang.String, java.lang.String, java.lang.String, java.lang.String)' on a null object reference
        at aso.so5647108356471083.MainActivity.onCreate(MainActivity.java:16)
        at android.app.Activity.performCreate(Activity.java:7136)
        at android.app.Activity.performCreate(Activity.java:7127)
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1271)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2893)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3048) 
        at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:78) 
        at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:108) 
        at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:68) 
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1808) 
        at android.os.Handler.dispatchMessage(Handler.java:106) 
        at android.os.Looper.loop(Looper.java:193) 
        at android.app.ActivityThread.main(ActivityThread.java:6669) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858) 

Следующая строка является подходящей строкой, которая объясняет, что переменная, объявленная как DBhelper, равна нулю.

Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'boolean aso.so5647108356471083.DBHelper.addInfo(java.lang.String,java.lang.String, java.lang.String, java.lang.String)' on a null object reference

Простое изменение (раскомментирование строки myDatabaseHelper = new DBHelper(this);) и использование: -

public class MainActivity extends AppCompatActivity {

    DBHelper myDatabaseHelper;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        myDatabaseHelper = new DBHelper(this); //<<<<<<<<<<
        myDatabaseHelper.addInfo("UserX","2000-01-01","Unknown","password");
        Cursor csr = myDatabaseHelper.readAllInfo("1");
        DatabaseUtils.dumpCursor(csr);
    }
}

работает, извлекает добавленные данные и записывает их в журнал согласно: -

2019-06-06 15:47:22.579 I/System.out: >>>>> Dumping cursor android.database.sqlite.SQLiteCursor@791f7af
2019-06-06 15:47:22.580 I/System.out: 0 {
2019-06-06 15:47:22.580 I/System.out:    _id=1
2019-06-06 15:47:22.580 I/System.out:    col02=UserX
2019-06-06 15:47:22.580 I/System.out:    col03=2000-01-01
2019-06-06 15:47:22.580 I/System.out:    col04=Unknown
2019-06-06 15:47:22.580 I/System.out:    col05=password
2019-06-06 15:47:22.580 I/System.out: }
2019-06-06 15:47:22.580 I/System.out: <<<<<
0 голосов
/ 06 июня 2019

Попробуйте код ниже, здесь myDatabaseHelper - это объект вашего класса, в котором вы создаете таблицы.

myDatabaseHelper.getWritableDatabase().insert(UserProfile.Users.Table_Name, null, contentValues);
...