Запрос SQLite возвращает значения NULL при попытке обновить строки

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

имя пользователя ---------------- пароль -------------- active
myusername -------------- mypass --------------------- null
ноль ноль---------------------- --да

имя пользователя, пароль, fname, lname, active - мои столбцы в моей «пользовательской» таблице.

SqliteHelper.java

public boolean saveUser(String fname, String lname, String username, String password) {
    Cursor cursor = getUser(username);

    SQLiteDatabase db = this.getWritableDatabase();

    ContentValues contentValues = new ContentValues();
    contentValues.put("fname", fname);
    contentValues.put("lname", lname);
    contentValues.put("password", password);

    long result;
    if (cursor.getCount() == 0) {
        // added fname, lname, password
        contentValues.put("username", username);
        result = db.insert("users", null, contentValues);
    } else {
        result = db.update("users", contentValues, "fname=?", new String[] { fname });
        result = db.update("users", contentValues, "lname=?", new String[] { lname });
        result = db.update("users", contentValues, "username=?", new String[] { username });
        result = db.update("users", contentValues, "password=?", new String[] { password });
    }

    if (result == -1) {
        return false;
    } else {
        return true;
    }
}

public long  saveUser1(String active) {
    Cursor cursor = getUser(active);
    SQLiteDatabase db = this.getWritableDatabase();
    ContentValues contentValues = new ContentValues();
    contentValues.put("active", active);
    long result;
    if (cursor.getCount() == 0) {
        result = db.insert("users", null, contentValues);
    } else {
        result = db.update("users", contentValues, "active=?", new String[] { active });
    }
    return db.update("users", contentValues, "active=?", new String[] { active });

}

public Cursor getUser(String username) {
    SQLiteDatabase db = this.getReadableDatabase();
    String sql = "SELECT * FROM users WHERE username=?";
    return  db.rawQuery(sql, new String[] { username });
}

MainActivity.java

public void save(View view) {
    // added fname, lname, password
    fname = ((EditText)findViewById(R.id.editText1)).getText().toString();
    lname = ((EditText)findViewById(R.id.editText2)).getText().toString();
    username = ((EditText)findViewById(R.id.editText3)).getText().toString();
    password = ((EditText)findViewById(R.id.editText4)).getText().toString();

    if (username.isEmpty()) {
        Toast.makeText(getApplicationContext(), "Email cannot be empty!", Toast.LENGTH_LONG).show();
        return;
    }

    boolean result = sqliteHelper.saveUser(fname, lname, username, password);
    if (result) {
        Toast.makeText(getApplicationContext(), "Successfully saved!", Toast.LENGTH_LONG).show();
    } else {
        Toast.makeText(getApplicationContext(), "Failed to save!", Toast.LENGTH_LONG).show();
    }

    Intent intent = new Intent(MainActivity.this, Next.class);
    startActivity(intent);
}

Next.java

 public void save(View view) {
     long result = sqliteHelper.saveUser1(active);           

 }

Предлагается попытаться создать минимальный пример, демонстрирующий ту же проблему.

andrel 06.01.2019 01:49
1
1
64
1

Ответы 1

В вашем классе Next.java вы передаете активный в методе saveUser1(), который, я думаю, является логической строкой. И этот метод передает эту логическую строку активный как имя пользователя, чтобы проверить, существует ли этот пользователь (с именем пользователя «да» / «нет»), что неверно.

Также ваша реализация метода saveUser1() неверна. Вы помещаете все результаты операций с базами данных в значение результат, но не вернули его.

Редактировать:

public long  saveUser1(String username, String active) {
    Cursor cursor = getUser(username);
    SQLiteDatabase db = this.getWritableDatabase();
    ContentValues contentValues = new ContentValues();
    contentValues.put("active", active);
    long result;
    if (cursor.getCount() == 0) {
        result = db.insert("users", null, contentValues);
    } else {
        result = db.update("users", contentValues, "username=?", new String[] { username });
    }
    return result;
}

ааа ладно. Спасибо. Но как я могу это улучшить ?? Я понятия не имею

Fayee 05.01.2019 20:52

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

sourav.bh 05.01.2019 21:10

привет @Fayee, не могли бы вы показать подробности, например, какие данные вы сохранили в БД, а затем что вы получили из запросов? Если вы не отправите входные данные должным образом, вы не сможете ожидать правильных результатов. Надеюсь, вы понимаете, что я просто делюсь возможным решением, поэтому у меня нет всего потока данных вашего приложения.

sourav.bh 06.01.2019 13:02

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