Вероятная причина в том, что вы объявляете, но не создаете экземпляр объекта Помощник по базам данных, т.е. 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: <<<<<