Когда я вызываю элемент из базы данных SQLite по его идентификатору, «SQLiteDatabase db = this.getReadableDatabase ()» вызывает ошибку: нулевая ссылка на объект - PullRequest
0 голосов
/ 17 февраля 2019

У меня есть база данных sql, в которой я думаю сохранить имена учеников и их номера.Я могу легко добавить элемент в базу данных и легко перечислить их.Однако, когда я хочу вызвать конкретный элемент по его идентификатору, я получаю следующую ошибку:

java.lang.NullPointerException: попытка вызвать виртуальный метод android.database.sqlite.SQLiteDatabase android.content.Context.openOrCreateDatabase (java.lang.String, int, android.database.sqlite.SQLiteDatabase $ CursorFactory, android.database.DatabaseErrorHandler) 'для ссылки на нулевой объект

, и мой эмулятор указывает, чтострока:

SQLiteDatabase db = this.getReadableDatabase();

ЧАСТЬ: getId (int id)

  public StudentsinLib getId(int id){

    String selectQuery = "SELECT * FROM " + STUDENTDATABASETABLE_NAME + " WHERE "+ COL + " ="+id;

    SQLiteDatabase db = this.getReadableDatabase(); // ======> THE EMULATOR POINTS HERE
    Cursor cursor = db.rawQuery(selectQuery, null);

    if (cursor != null)
        cursor.moveToFirst();

    StudentsinLib studentsinLib = new StudentsinLib();
    studentsinLib.setId(cursor.getInt(0));
    studentsinLib.setName(cursor.getString(1));
    studentsinLib.setNumber(cursor.getString(2));

    //log
    Log.d("getStudent(" + id + ")", StudentsinLib.toString());
    // 5. return student
    return studentsinLib;
}

Все мои коды в моей базе данных SQLiteDatabase

public class StudentsinLibDatabase extends SQLiteOpenHelper {
// Database Version
private static final int DATABASE_VERSION = 1;
// Database Name
private static final String STUDENTDATABASE_NAME = "StudentsinLibDB";
// Table Content
private static final String STUDENTDATABASETABLE_NAME = "StudentsinLibTB";
private static String COL = "studentsinLibId";
private static String COL1 = "StudentsinLibName";
private static String COL2 = "studentsinLibNumber";

private static final String[] COLUMNS = {COL,COL1,COL2};
public Context context;

public StudentsinLibDatabase(Context context) {
    super(context, STUDENTDATABASETABLE_NAME, null, DATABASE_VERSION);
    this.context=context;
}
@Override
public void onCreate(SQLiteDatabase db) {

    String CREATE_TABLE = "CREATE TABLE "+STUDENTDATABASETABLE_NAME+"("
            +COL+" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,"
            +COL1+" TEXT,"
            +COL2+" TEXT);";

    db.execSQL(CREATE_TABLE);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    // Drop older students table if existed
    db.execSQL("DROP TABLE IF EXISTS students");

    // create fresh students table
    this.onCreate(db);
}
public void addStudentstoLib(StudentsinLib studentstoLib){

    Log.d("addStudent", studentstolib.toString());

    // 1. get reference to writable DB
    SQLiteDatabase db = this.getWritableDatabase();

    // 2. create ContentValues to add key "column"/value

    ContentValues values = new ContentValues();
    values.put(COL, studentstolib.getId());
    values.put(COL1, studentstolib.getName());
    values.put(COL2, studentstolib.getNumber());

    // 3. insert
    db.insert(STUDENTDATABASETABLE_NAME, // table
            null, //nullColumnHack
            values); // key/value -> keys = column names/ values = column values

    // 4. close
    db.close();
}
public StudentsinLib getId(int id){

    String selectQuery = "SELECT * FROM " + STUDENTDATABASETABLE_NAME + " WHERE "+ COL + " ="+id;

    SQLiteDatabase db = this.getReadableDatabase(); // ======> the emulator points here
    Cursor cursor = db.rawQuery(selectQuery, null);

    if (cursor != null)
        cursor.moveToFirst();

    StudentsinLib studentsinLib = new StudentsinLib();
    studentsinLib.setId(cursor.getInt(0));
    studentsinLib.setName(cursor.getString(1));
    studentsinLib.setNumber(cursor.getString(2));

    //log
    Log.d("getStudent(" + id + ")", StudentsinLib.toString());
    // 5. return student
    return studentsinLib;
}

public void deleteStudentinLib(int id){
    SQLiteDatabase db = this.getWritableDatabase();
    db.delete(StudentsinLibDatabase, COL + " = ?",
            new String[]{String.valueOf(id)});
    db.close();
}

public int updateStudent(StudentsinLib studentsinLib) {
    // 1. get reference to writable DB
    SQLiteDatabase db = this.getWritableDatabase();
    // 2. create ContentValues to add key "column"/value
    ContentValues values = new ContentValues();
    values.put(COL, studentsinLib.getId());
    values.put(COL1,studentsinLib.getName());
    values.put(COL2,studentsinLib.getNumber());

    // 3. updating row
    int i = db.update(STUDENTDATABASETABLE_NAME, //table
            values, // column/value
            COL + " = ?", // selections
            new String[]{String.valueOf(studentsinLib.getId())}); //selection args
    // 4. close
    db.close();
    return i;
}

public ArrayList<StudentsinLib> getAllStudentsinLib() {
    ArrayList<StudentsinLib> studentsinLibs = new ArrayList<StudentsinLib>();
    // 1. build the query
    String query = "SELECT * FROM " + STUDENTDATABASETABLE_NAME;
    // 2. get reference to writable DB
    SQLiteDatabase db = this.getWritableDatabase();
    Cursor cursor = db.rawQuery(query, null);
    // 3. go over each row, build student and add it to list
    while (cursor.moveToNext()) {
        StudentsinLib studentsinLib = new StudentsinLib();
        studentsinLib.setId(cursor.getInt(0));
        studentsinLib.setName(cursor.getString(1));
        studentsinLib.setNumber(cursor.getString(2));
        studentsinLibs.add(studentsinLib);
    }
    Log.d("getAllStudents()", studentsinLibs.toString());
    // return student
    return studentsinLibs;
  }
}

То, что я пробовал раньше, здесь:

NullPointerException at this.getReadableDatabase ();

Исключение NullPointerException для getReadableDatabase ()

Запрос Sqlitedatabase не работает при выборе по _id

Это все из моей истории, спасибо заранее...

1 Ответ

0 голосов
/ 17 февраля 2019

Аргумент Context, передаваемый конструктору StudentsinLibDatabase, равен нулю.

...