У меня есть таблица с именем student, использующая SQLite, я пытаюсь получить идентификатор одного студента с помощью запроса SELECT, есть мой метод:
public int getID(String name, String surname){
int id;
String selectQuery = "SELECT* FROM " + TABLE_NAME + " WHERE " + COL_2 + " =\"" + name + "\" AND " + COL_3 + " =\"" + surname + "\";";
SQLiteDatabase db = this.getReadableDatabase();
Cursor cursor = db.rawQuery(selectQuery,null); //App is crashing here
id = cursor.getInt(0);
return id;
}
Мой код для вставки данных в базу данных:
public boolean insertStudent(String name, String surname){
SQLiteDatabase db = this.getWritableDatabase();
ContentValues contentValues = new ContentValues();
contentValues.put(COL_2, name);
contentValues.put(COL_3, surname);
long result=db.insert(TABLE_NAME,null,contentValues);
if (result == -1)
return false;
else
return true;
}
А затем создайте таблицу запросов:
@Override
public void onCreate(SQLiteDatabase db){
//Requête SQL de la création de la table student
db.execSQL("CREATE table " + TABLE_NAME + "(student_id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT, surname TEXT)");
Приложение вылетает на db.rawQuery (selectQuery, null);, я не знаю почему. Я попытался вручную вставить идентификатор с автоинкрементом целого числа, не работает, поэтому, я не знаю, жду, когда вы мне поможете, спасибо
Я использую счетчик, он отображает имя и фамилию студента, я знаю, что это не оптимальный метод, но я не знаю, как получить идентификатор без моих условий, потому что пользователь добавит студента вручную, заполняя поле имени и фамилии, и он может добавить оценку, а затем он может проконсультироваться со всеми своими учениками (с их оценкой, которая является моей другой таблицей), это все, что мое приложение делает на данный момент.




Я подозреваю, что сбой на самом деле происходит на следующей строке, поскольку вы пытаетесь извлечь данные из позиции, которая находится перед первой строкой.
Предлагаю попробовать: -
public int getID(String name, String surname){
int id = -1;
String selectQuery = "SELECT* FROM " + TABLE_NAME + " WHERE " + COL_2 + " =\"" + name + "\" AND " + COL_3 + " =\"" + surname + "\";";
SQLiteDatabase db = this.getReadableDatabase();
Cursor cursor = db.rawQuery(selectQuery,null); //App is crashing here
if (cursor.moveToFirst) {
id = cursor.getInt(0);
}
return id;
}
То есть, если курсор не пуст, вы перейдете к первой строке и извлечете данные из реальной строки. Если курсор пуст, возвращается -1.
Возвращается -1, значит, мой первичный ключ не сгенерирован и имеет значение NULL, это нормально? Кстати спасибо за ансера!
он работает, в моем запросе я поставил ";" вот почему это не сработало, спасибо!
Строки в SQL идут в 'single quotes'. "double quoted strings" используются в качестве идентификаторов, и вы получаете синтаксическую ошибку для них, поскольку нет столбцов с такими именами.
Чтобы избежать необходимости в цитировании и SQL-инъекции, лучше предоставить аргументы SQL в виде переменных, например:
String selectQuery = "SELECT* FROM " + TABLE_NAME + " WHERE " + COL_2 + " =? AND " + COL_3 + " =?;";
SQLiteDatabase db = this.getReadableDatabase();
Cursor cursor = db.rawQuery(selectQuery, new String[] { name, surname });
После исправления этой проблемы вы столкнетесь с ошибкой неверной позиции курсора, выделенной MikeT.
Что вы имеете в виду под крахом? Было бы полезно использовать трассировку стека.
Во всяком случае, в дополнение к тому, что было упомянуто другими, в вашем SQL есть опечатка:
"SELECT* FROM "
Я предполагаю, что вам нужен пробел перед *:
"SELECT * FROM "
не совсем: мой sqlite3 принимает даже такие вещи, как "SELECT*FROM table_name ..." - конечно, вы правы, это не очень хорошая форма написания sql-запросов, но они работают ....
Потому что мне нужен идентификатор для другой таблицы, у которой в качестве внешнего ключа есть student_id