В методе 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
- Студент Мэри добавляется с идентификатором 2
- Учащиеся Фред и Мэри перечислены.
- Студент 1 (Фред) обновлен и теперь имеет имя Берт.
- Студент 1 (теперь Берт) найден
- Студент Берт указан в списке.
- Студент2 (Мэри) удалена.
- Добавлены учащиеся Гарольд и Сьюзен (с использованием альтернативного метода, например addNewStudent ).
- Все учащиеся перечислены после получения альтернативой *Метод 1093 * getAllStudents .
- Ученик 3 извлекается альтернативным методом findStudent (только по идентификатору, поэтому изменение имени (например, Фреда на Берта) не влияет на получение ученика) и в списке.