Как связать класс SQLiteOpenHelper с MainActivity? - PullRequest
0 голосов
/ 06 октября 2018

Я создал 3 класса (1. Класс MainActivity, DBhelper и Student).Я новичок, который использует простой код, и у меня постоянно возникают проблемы с подключением класса DBhelper к MainActivity.Я думаю, что все в порядке, но после нажатия «buttonAdd» я получаю сообщение «Мое приложение остановлено».В MainActivity я использовал только методы loadStudents и addStudent из DBhelper, потому что у меня проблемы даже с этим базовым уровнем.

Идея приложения -> Добавление новых студентов в editText, удаление их и т. Д. Iзнаете, лучше использовать scrollList, но я просто хочу узнать, как использовать SQLite для начала.

Студенческий класс -> Я использую его в "DBhelper class" и в "MainActivity"."

public class Student {

private int studentID;
private String studentName;

public Student(int id, String studentName) { //konstruktor
    this.studentID = id;
    this.studentName = studentName;
}

public int getStudentID() {
    return studentID;
}

public void setStudentID(int studentID) {
    this.studentID = studentID;
}

public String getStudentName() {
    return studentName;
}

public void setStudentName(String studentName) {
    this.studentName = studentName;
}
}

DBhelper class

public class DBhelper extends SQLiteOpenHelper {

private static final int DATABASE_VERSION = 1;
private static final String DATABASE_NAME = "studentDB.db";
public static final String TABLE_NAME = "student";
public static final String COLUMN_ID = "studentID";
public static final String COLUMN_NAME = "studentName";
//initialize the database

public DBhelper(Context context) {
    super(context, DATABASE_NAME, null, DATABASE_VERSION);
}


@Override
public void onCreate(SQLiteDatabase db) {
    db.execSQL("CREATE TABLE " + TABLE_NAME + "("
            + COLUMN_ID + "INTEGER PRIMARYKEY,"
            + COLUMN_NAME + " TEXT " + ")");
}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    db.execSQL("DROP TABLE IF EXISTS contacts");
    onCreate(db);
}

public void addStudent(Student student) {
    SQLiteDatabase db = this.getWritableDatabase();
    ContentValues values = new ContentValues();
    values.put(COLUMN_ID, student.getStudentID());
    values.put(COLUMN_NAME, student.getStudentName());
    db.insert(TABLE_NAME, null, values);
    db.close();
}

public String loadStudents() {
    String result = "";
    String query = "Select*FROM " + TABLE_NAME;
    SQLiteDatabase db = this.getWritableDatabase();
    Cursor cursor = db.rawQuery(query, null);
    while (cursor.moveToNext()) {
        int result_0 = cursor.getInt(0);
        String result_1 = cursor.getString(1);
        result += String.valueOf(result_0) + " " + result_1 +
                System.getProperty("line.separator");
    }
    cursor.close();
    db.close();
    return result;
}

public Student findStudent(int ID, String studentName) {
    String query = "Select * FROM " + TABLE_NAME + "WHERE" + COLUMN_NAME + " 
= " + "'" + studentName + "'";
    SQLiteDatabase db = this.getWritableDatabase();
    Cursor cursor = db.rawQuery(query, null);
    Student student = new Student(ID, studentName);
    if (cursor.moveToFirst()) {
        cursor.moveToFirst();
        student.setStudentID(Integer.parseInt(cursor.getString(0)));
        student.setStudentName(cursor.getString(1));
        cursor.close();
    } else {
        student = null;
    }
    db.close();
    return student;
}

public boolean deleteStudent(int ID, String studentName) {
    boolean result = false;
    String query = "Select*FROM" + TABLE_NAME + "WHERE" + COLUMN_ID + "= '" 
+ String.valueOf(ID) + "'";
    SQLiteDatabase db = this.getWritableDatabase();
    Cursor cursor = db.rawQuery(query, null);
    Student student = new Student(ID, studentName);
    if (cursor.moveToFirst()) {
        student.setStudentID(Integer.parseInt(cursor.getString(0)));
        db.delete(TABLE_NAME, COLUMN_ID + "=?",
                new String[] {
            String.valueOf(student.getStudentID())
        });
        cursor.close();
        result = true;
    }
    db.close();
    return result;
}

public boolean updateStudent(int ID, String name) {
    SQLiteDatabase db = this.getWritableDatabase();
    ContentValues args = new ContentValues();
    args.put(COLUMN_ID, ID);
    args.put(COLUMN_NAME, name);
    return db.update(TABLE_NAME, args, COLUMN_ID + "=" + ID, null) > 0;
}
}

MainActivity

public class MainActivity extends AppCompatActivity {

Button buttonLoad;
Button buttonAdd;
Button buttonFind;
Button buttonDelete;
Button buttonUpdate;
TextView textViewStudents;
EditText editTextID;
EditText editTextName;
DBhelper myDB;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    buttonLoad = (Button) findViewById(R.id.buttonLoad);
    buttonAdd = (Button) findViewById(R.id.buttonAdd);
    buttonFind = (Button) findViewById(R.id.buttonFind);
    buttonDelete = (Button) findViewById(R.id.buttonDelete);
    buttonUpdate = (Button) findViewById(R.id.buttonUpdate);
    textViewStudents = (TextView) findViewById(R.id.textViewStudents);
    editTextID = (EditText) findViewById(R.id.editTextID);
    editTextName = (EditText) findViewById(R.id.editTextName);
    myDB = new DBhelper(this);

    //load
    buttonLoad.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            textViewStudents.setText(myDB.loadStudents());
            editTextID.setText("");
            editTextName.setText("");
        }
    });

    buttonAdd.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            int id = Integer.parseInt(editTextID.getText().toString());
            String name = editTextName.getText().toString();
            Student student = new Student(id, name);
            myDB.addStudent(student);
            editTextID.setText("");
            editTextName.setText("");
        }
    });
}
// Maybe it will be better to use the methos under the onCreate method but I 
//don't know what should I write as a paramether instead of "view" when I 
//will use this method in the onCreate
//    public void addStudent() {
//        DBhelper myDB = new DBhelper(this);
//        int id = Integer.parseInt(editTextID.getText().toString());
//        String name = editTextName.getText().toString();
//        Student student = new Student(id, name);
//        myDB.addStudent(student);
//        editTextID.setText("");
//        editTextName.setText("");
//    }
}

1 Ответ

0 голосов
/ 06 октября 2018

В методе loadStudents у вас есть String query = "Select*FROM " + TABLE_NAME;, что приведет к синтаксической ошибке, так как между SELECT и * и * и FROM нет пробелов.

Это должно бытьString query = "Select * FROM " + TABLE_NAME;

Вам необходимо проверить код на наличие пропущенных пробелов, поскольку вы пропустили число.

  • aпробел между именем столбца и типом, а также пробел между PRIMARY и KEY, поэтому studentID не будет псевдонимом столбца rowid и, таким образом, будет иметь значение null вместо автоматически сгенерированного уникального идентификатора.** Это, если не исправить (это не приведет к ошибке), приведет к тому, что методы find / delete / update / Students не будут работать должным образом.

  • есть другойздесь отсутствует пробел TABLE_NAME + "WHERE" перед ключевым словом WHERE .

  • та же самая первоначальная ошибка Select*FROM повторяется в методе deleteStudent.

  • Примечание могут быть другие синтаксические ошибки, приведенные выше были обнаружены только при визуальном просмотре кода.

Я бы предложил внести все изменения, затем удалить данные приложения или удалить приложение или увеличить значение, назначенное DATABASE_VERSION, а затем повторно запустить приложение.

Вы также должны проверить журнал после того, как «оно перестало работать», он подробно расскажет об обнаруженной ошибке.

Дополнительно

Ниже приведен код, который был протестирован и также содержит некоторые предложения, например, только использование идентификатора студента для определения местоположения студента.

Класс DBhelper.java (обратите внимание, для удобства был использован класс DBhelper2): -

public class DBhelper2 extends SQLiteOpenHelper { //<<<<<<<<<< Change DBhelper2 to DBhelper

    private static final int DATABASE_VERSION = 1;
    private static final String DATABASE_NAME = "studentDB.db";
    public static final String TABLE_NAME = "student";
    public static final String COLUMN_ID = "studentID";
    public static final String COLUMN_NAME = "studentName";    //initialize the database

    public DBhelper2(Context context) { //<<<<<<<<<< Change DBhelpe2 to DBhelper
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
    }


    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL("CREATE TABLE " + TABLE_NAME + "("
                + COLUMN_ID + " INTEGER PRIMARY KEY,"
                + COLUMN_NAME + " TEXT " + ")");
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        db.execSQL("DROP TABLE IF EXISTS contacts");
        onCreate(db);
    }

    public void addStudent(Student student) {
        SQLiteDatabase db = this.getWritableDatabase();
        ContentValues values = new ContentValues();
        values.put(COLUMN_ID, student.getStudentID());
        values.put(COLUMN_NAME, student.getStudentName());
        db.insert(TABLE_NAME, null, values);
        db.close();
    }

    //<<<<<<<<<< ADDED add student allowing ID to be auto generated
    //!!!NOTE!!! ideally long should be used for ID and thus should return long not int
    //              won't be an issue with a small number of Students
    public int addNewStudent(String studentName) {
        SQLiteDatabase db = this.getWritableDatabase();
        ContentValues values = new ContentValues();
        values.put(COLUMN_NAME,studentName);
        return (int) db.insert(TABLE_NAME,null,values);
    }

    public String loadStudents() {
        String result = "";
        String query = "Select * FROM " + TABLE_NAME; //<<<<<<<<<< ADDED SPACES
        SQLiteDatabase db = this.getWritableDatabase();
        Cursor cursor = db.rawQuery(query, null);
        while (cursor.moveToNext()) {
            int result_0 = cursor.getInt(0);
            String result_1 = cursor.getString(1);
            result += String.valueOf(result_0) + " " + result_1 +
                    System.getProperty("line.separator");
        }
        cursor.close();
        db.close();
        return result;
    }

    //<<<<<<<<<< Get all Students as an ArrayList of Student objects
    //<<<<<<<<<< Alternative to loadStudents
    public ArrayList<Student> getAllStudents() {
        ArrayList<Student> result = new ArrayList<>();
        SQLiteDatabase db = this.getWritableDatabase();
        Cursor csr = db.query(TABLE_NAME,null,null,null,null,null,null);
        while (csr.moveToNext()) {
            result.add(
                    new Student(
                            csr.getInt(csr.getColumnIndex(COLUMN_ID)),
                            csr.getString(csr.getColumnIndex(COLUMN_NAME)
                            )
                    )
            );
        }
        csr.close();
        db.close();
        return result;
    }

    public Student findStudent(int ID, String studentName) {
        String query = "Select * FROM " + TABLE_NAME + " WHERE " + COLUMN_NAME + //<<<<<<<<<< ADDED SPACES
                " = " + "'" + studentName + "'"; //<<<<<<<<<< ADDED missing double quote
        SQLiteDatabase db = this.getWritableDatabase();
        Cursor cursor = db.rawQuery(query, null);
        Student student = new Student(ID, studentName);
        if (cursor.moveToFirst()) {
            cursor.moveToFirst(); //<<<<<<<<<< NOT NEEDED as already at first
            student.setStudentID(Integer.parseInt(cursor.getString(0)));
            student.setStudentName(cursor.getString(1));
            cursor.close();
        } else {
            student = null;
        }
        db.close();
        return student;
    }

    //<<<<<<<<<< alternative get student just by id
    //          uses the convenience query method rather than rawQuery
    //          recommended to use COLUMN NAMES not column offsets
    public Student findStudent(int studentID) {
        Student result = null;
        String whereclause = COLUMN_ID + "=?";
        String[] whereargs = new String[]{String.valueOf(studentID)};
        SQLiteDatabase db = this.getWritableDatabase();
        Cursor csr = db.query(TABLE_NAME,null,whereclause,whereargs,null,null,null);
        if (csr.moveToFirst()) {
            result = new Student(
                    csr.getInt(csr.getColumnIndex(COLUMN_ID)),
                    csr.getString(csr.getColumnIndex(COLUMN_NAME)
                    )
            );
        }
        csr.close();
        db.close();
        return result;
    }


    //      Deleting just by id (see findStudent above) could/should be implemented
    public boolean deleteStudent(int ID, String studentName) {
        boolean result = false;
        String query = "Select * FROM " + TABLE_NAME + " WHERE " + COLUMN_ID + "= '" //<<<<<<<<<< ADDED SPACES
                + String.valueOf(ID) + "'";
        SQLiteDatabase db = this.getWritableDatabase();
        Cursor cursor = db.rawQuery(query, null);
        Student student = new Student(ID, studentName);
        if (cursor.moveToFirst()) {
            student.setStudentID(Integer.parseInt(cursor.getString(0)));
            db.delete(TABLE_NAME, COLUMN_ID + "=?",
                    new String[] {
                            String.valueOf(student.getStudentID())
                    });
            cursor.close();
            result = true;
        }
        db.close();
        return result;
    }

    //      Updating just by id (see findStudent above) could/should be implemented
    public boolean updateStudent(int ID, String name) {
        SQLiteDatabase db = this.getWritableDatabase();
        ContentValues args = new ContentValues();
        args.put(COLUMN_ID, ID);
        args.put(COLUMN_NAME, name);
        return db.update(TABLE_NAME, args, COLUMN_ID + "=" + ID, null) > 0;
    }
}
  • Пожалуйста, обратитесь к комментариям в приведенном выше коде

Тестирование

Следующий код в методе действия onCreate использовался для тестирования выше: -

    mDBStudents = new DBhelper2(this);

    //Delete all students for testing purposes only
    mDBStudents.getWritableDatabase().delete(DBhelper2.TABLE_NAME,null,null);

    // Load some data and test methods
    mDBStudents.addStudent(new Student(1,"Fred"));
    mDBStudents.addStudent(new Student(2,"Mary"));
    Log.d("STUDENTS",mDBStudents.loadStudents());
    Student a_student_found = mDBStudents.findStudent(1,"Fred");
    Log.d("STUDENTFOUND", a_student_found.getStudentName());
    mDBStudents.updateStudent(1,"Bert");
    a_student_found = mDBStudents.findStudent(1,"Bert");
    Log.d("STUDENtFOUND",a_student_found.getStudentName());
    mDBStudents.deleteStudent(2,"Mary");
    Log.d("STUDENTS",mDBStudents.loadStudents());

    //Test alternative suggested methods
    mDBStudents.addNewStudent("Harold");
    mDBStudents.addNewStudent("Susan");
    ArrayList<Student> all_students = mDBStudents.getAllStudents();
    boolean after_first_row = false;
    StringBuilder sb = new StringBuilder("Students are :-");
    for (Student s: mDBStudents.getAllStudents()) {
        sb.append("\n\t")
                .append("Student ID is ")
                .append(String.valueOf(s.getStudentID()))
                .append(" Student name is ")
                .append(s.getStudentName());
    }
    Log.d("STUDENTS",sb.toString());
    Student another = mDBStudents.findStudent(3);
    Log.d("STUDENT 3","Student with an ID of 3 is " + another.getStudentName());

Результаты (вlog)

Вывод в журнал, полученный при тестировании, был следующим: -

2018-10-06 08:49:27.410 2382-2382/so52598847.so52598847 D/STUDENTS: 1 Fred
    2 Mary
2018-10-06 08:49:27.411 2382-2382/so52598847.so52598847 D/STUDENTFOUND: Fred
2018-10-06 08:49:27.418 2382-2382/so52598847.so52598847 D/STUDENtFOUND: Bert
2018-10-06 08:49:27.426 2382-2382/so52598847.so52598847 D/STUDENTS: 1 Bert
2018-10-06 08:49:27.444 2382-2382/so52598847.so52598847 D/STUDENTS: Students are :-
        Student ID is 1 Student name is Bert
        Student ID is 2 Student name is Harold
        Student ID is 3 Student name is Susan
2018-10-06 08:49:27.445 2382-2382/so52598847.so52598847 D/STUDENT 3: Student with an ID of 3 is Susan

Результаты соответствуют ожидаемым.То есть

  1. Студент Фред добавляется с идентификатором 1
  2. Студент Мэри добавляется с идентификатором 2
  3. Учащиеся Фред и Мэри перечислены.
  4. Студент 1 (Фред) обновлен и теперь имеет имя Берт.
  5. Студент 1 (теперь Берт) найден
  6. Студент Берт указан в списке.
  7. Студент2 (Мэри) удалена.
  8. Добавлены учащиеся Гарольд и Сьюзен (с использованием альтернативного метода, например addNewStudent ).
  9. Все учащиеся перечислены после получения альтернативой *Метод 1093 * getAllStudents .
  10. Ученик 3 извлекается альтернативным методом findStudent (только по идентификатору, поэтому изменение имени (например, Фреда на Берта) не влияет на получение ученика) и в списке.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...