Как исправить проблему с базой данных, которая вылетает из моего приложения? - PullRequest
0 голосов
/ 14 февраля 2019

Я добавляю нового пользователя, но когда я пытаюсь войти в систему, это приводит к сбою моего приложения.Он говорит мне, что нет колонки «имя».Любая помощь будет принята с благодарностью.Вот мой код:

 public void onCreate(SQLiteDatabase db) {
    // TODO Auto-generated method stub
    db.execSQL(
            "create table users " +
                    "(id integer primary key, name text,password text,age integer)"
    );
    db.execSQL(
            "create table tasks " +
                    "(id integer primary key, name text, agemin integer,agemax integer,time integer)"
    );
}
public boolean insertUser (String name, String password, int age) {
    SQLiteDatabase db = this.getWritableDatabase();
    ContentValues contentValues = new ContentValues();
    contentValues.put("name", name);
    contentValues.put("password", password);
    contentValues.put("age", age);
    db.insert("users", null, contentValues);
    return true;
}

public boolean checkPassword(String name, String password) {
    int id = getUserIDByName(name);
    SQLiteDatabase db = this.getReadableDatabase();
    Cursor res =  db.rawQuery( "select password from users where id="+id+"", null );
    String pass = res.getString(1);
    return (password.equals(pass));
}

public int getUserIDByName(String name) {
    SQLiteDatabase db = this.getReadableDatabase();
    Cursor res =  db.rawQuery( "select id from users where name="+name+"", null );
    int id = res.getInt(1);
    return id;

Ответы [ 3 ]

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

Поскольку вы сравниваете имя в функции getUserIdbyName (), вы должны использовать colun в запросе.

public int getUserIDByName(String name) {
    SQLiteDatabase db = this.getReadableDatabase();
    Cursor res =  db.rawQuery( "select id from users where name='"+name+"'", null );
    int id = res.getInt(1);
    return id;
}

Целочисленный и числовой тип данных легко сравнивать в SQL, когда дело доходит до строкового или текстового типа, что иногда очень сложно и немного сложно.

Надеюсь, это работает для вас.

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

Сначала используйте кавычки вокруг переменной name:

Cursor res =  db.rawQuery( "select id from users where name = '"+ name + "'", null );

Затем измените на:

int id = res.getInt(0);

и это:

String pass = res.getString(0);

Индексыстолбцы курсора 0 на основе.Также вы должны использовать moveFirst(), чтобы проверить, есть ли какая-либо строка, выбранная Cursor.Так что измени на это:

public boolean checkPassword(String name, String password) {
    int id = getUserIDByName(name);
    SQLiteDatabase db = this.getReadableDatabase();
    Cursor res =  db.rawQuery( "select password from users where id="+id+"", null );
    String pass = "";
    if (res.moveFirst())
        pass = res.getString(0);
    return (password.equals(pass));
}

public int getUserIDByName(String name) {
    SQLiteDatabase db = this.getReadableDatabase();
    Cursor res =  db.rawQuery( "select id from users where name='"+name+"'", null );
    int id = 0;
    if (res.moveFirst())
        id = res.getInt(0);
    return id;
}
0 голосов
/ 14 февраля 2019

Я бы посоветовал ниже, потому что это предотвращает SQL-инъекцию

String query = "select id from users where name=?";
Cursor cursor = db.rawQuery(query, new String [] {name});

, но если вы хотите использовать необработанные запросы, то обязательно ставьте кавычки вокруг строковых значений.

Изменение

Cursor res =  db.rawQuery( "select id from users where name="+name+"", null );

до

Cursor res =  db.rawQuery( "select id from users where name='" + name + "'", null );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...