【问题标题】:SQLite query returns NULL values while trying to update rowsSQLite 查询在尝试更新行时返回 NULL 值
【发布时间】:2019-01-06 04:08:39
【问题描述】:

我正在使用 SQLite db 在 android 中创建一个多步骤表单。 我的问题是,我想更新用户名(主键)中的一列,但是数据库给了我两行和一个空值。

用户名 ---------------- 密码 -------------- 活动
我的用户名--------------mypass---------------------null
空---------------- 空---------- - 是的

用户名、密码、fname、lname、活动是我的“用户”表中的列。

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);           

 }

【问题讨论】:

  • 建议尝试创建一个演示相同问题的最小示例。

标签: android sqlite


【解决方案1】:

在您的 Next.java 类中,您在 saveUser1() 方法中传递 active,我猜这是一个布尔字符串。该方法将 active 布尔字符串作为 username 传递,以检查该用户(用户名“yes”/“no”)是否已经存在,这是错误的。

您的saveUser1() 方法实现也不正确。您将所有 db 操作结果放在 result 值中,但从未返回它。

编辑:

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,您能否显示详细信息,例如您保存到数据库中的数据以及从查询中检索到的数据?如果您没有正确发送输入,那么您将无法获得正确的结果。我希望你明白我只是分享一个可能的解决方案,因此我没有你的应用程序的整个数据流。
猜你喜欢
  • 2018-05-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-15
  • 2014-11-16
  • 2019-04-05
相关资源
最近更新 更多