Первичный ключ Android Studio SQLite не возвращен

У меня есть таблица с именем 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);, я не знаю почему. Я попытался вручную вставить идентификатор с автоинкрементом целого числа, не работает, поэтому, я не знаю, жду, когда вы мне поможете, спасибо

Потому что мне нужен идентификатор для другой таблицы, у которой в качестве внешнего ключа есть student_id

Ryad Dwalibi 10.12.2018 14:31

Я использую счетчик, он отображает имя и фамилию студента, я знаю, что это не оптимальный метод, но я не знаю, как получить идентификатор без моих условий, потому что пользователь добавит студента вручную, заполняя поле имени и фамилии, и он может добавить оценку, а затем он может проконсультироваться со всеми своими учениками (с их оценкой, которая является моей другой таблицей), это все, что мое приложение делает на данный момент.

Ryad Dwalibi 10.12.2018 15:50
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
2
247
3

Ответы 3

Я подозреваю, что сбой на самом деле происходит на следующей строке, поскольку вы пытаетесь извлечь данные из позиции, которая находится перед первой строкой.

Предлагаю попробовать: -

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, это нормально? Кстати спасибо за ансера!

Ryad Dwalibi 10.12.2018 14:30

он работает, в моем запросе я поставил ";" вот почему это не сработало, спасибо!

Ryad Dwalibi 10.12.2018 14:45

Строки в 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-запросов, но они работают ....

pskink 10.12.2018 12:34

Другие вопросы по теме