【问题标题】:Android SQLite SELECT QueryAndroid SQLite SELECT 查询
【发布时间】:2012-03-06 01:05:37
【问题描述】:

我从EditText 中获取String 值并将其设置在SELECT QUERY after WHERE 条件中

作为

TextView tv = (TextView) findViewById(R.id.textView3);
EditTextet2 et = (EditText) findViewById(R.id.editText1);

String name = et.getText().toString();

Cursor c = db.rawQuery("SELECT * FROM tbl1 WHERE name = '"+name+"'", null); 

c.moveToNext();

tv.setText(c.getString(c.getColumnIndex("email")));

但它不起作用。有什么建议?

【问题讨论】:

  • 打印姓名并确保您获得的姓名有效。使用 c.moveToFirst();而不是 C....next() 并尝试。

标签: java android sqlite


【解决方案1】:

尝试修剪字符串以确保没有多余的空格:

Cursor c = db.rawQuery("SELECT * FROM tbl1 WHERE TRIM(name) = '"+name.trim()+"'", null);

也可以使用c.moveToFirst(),就像提到的@thinksteep。

【讨论】:

  • 这个例子很糟糕,允许 SQL 注入。为什么不正确使用第二个参数而不是插入null?
【解决方案2】:

这是选择语句的完整代码。

SQLiteDatabase db = this.getReadableDatabase();
Cursor c = db.rawQuery("SELECT column1,column2,column3 FROM table ", null);
if (c.moveToFirst()){
    do {
        // Passing values 
        String column1 = c.getString(0);
        String column2 = c.getString(1);
        String column3 = c.getString(2); 
        // Do something Here with values
    } while(c.moveToNext());
}
c.close();
db.close();

【讨论】:

  • 请注意,使用 c.getString(c.getColumnIndex("column1")) 比使用 c.getString(0) 更好:如果您更改查询,则不必更新索引。
  • 我也会转义名称参数以避免 SQL 注入
【解决方案3】:

尝试使用以下语句:

Cursor c = db.rawQuery("SELECT * FROM tbl1 WHERE name = ?", new String[] {name});

Android 要求 WHERE 子句与 ? 进行比较,然后您指定相等数量的 ?在查询的第二个参数中(您当前有 null)。

正如 Nambari 所说,您应该使用 c.moveToFirst() 而不是 c.moveToNext()

另外,名字中可以引用吗?这也可能把事情搞砸。

【讨论】:

    【解决方案4】:

    这是下面的代码。

    String areaTyp = "SELECT " +AREA_TYPE + "  FROM "
                + AREA_TYPE_TABLE + " where `" + TYPE + "`="
                + id;
    

    其中 id 是显示结果的条件。

    【讨论】:

    • 这有一个 SQL 注入问题
    【解决方案5】:
     public User searchUser(String name) {
        User u = new User();
        SQLiteDatabase db = this.getWritableDatabase(); //get the database that was created in this instance
        Cursor c = db.rawQuery("select * from " + TABLE_NAME_User+" where username =?", new String[]{name});
        if (c.moveToLast()) {
            u.setUsername(c.getString(1));
            u.setEmail(c.getString(1));
            u.setImgUrl(c.getString(2));
            u.setScoreEng(c.getString(3));
            u.setScoreFr(c.getString(4));
            u.setScoreSpan(c.getString(5));
            u.setScoreGer(c.getString(6));
            u.setLevelFr(c.getString(7));
            u.setLevelEng(c.getString(8));
            u.setLevelSpan(c.getString(9));
            u.setLevelGer(c.getString(10));
            return u;
    
        }else {
            Log.e("error not found", "user can't be found or database empty");
            return u;
        }
    
    }
    

    这是我选择一个用户且仅一个用户的代码 所以你启动你的类的一个空对象然后 你调用你的可写数据库 使用光标以防万一你需要一个 在这里你可以选择使用:1-

       if (c.moveToLast()) { } //it return the last element in that cursor 
    

    或使用:2-

     if(c.moveToFirst()) {  } //return the first object in the cursor 
    

    不要忘记,如果数据库是空的,你必须处理这个问题,在我的情况下,我只返回一个空对象

    祝你好运

    【讨论】:

      【解决方案6】:

      详细回答:

      String[] selectionArgs = new String[]{name};
          Cursor c = db.rawQuery(
             "SELECT * FROM " + tabl1 + 
             " WHERE " + name + " = ? ", selectionArgs
          );
      

      selectionArgs :这将您希望与之比较的'name' 作为参数。

      这里注意“一个Cursor对象,它位于你引用的表格的第一个条目之前”。

      所以,移动到第一个条目:

      c.moveToFirst();
      

      getColumnIndex(String ColumnName) :这将返回给定列名的从零开始的列索引。

      tv.setText(c.getString(c.getColumnIndex("email")));
      

      如果您想在“名称”列下搜索给定名称的多行,然后使用如下循环:

      if (cursor.moveToFirst()){
          do{
              ////go traversing through loops
                 
          }while(cursor.moveToNext());
      }
          
      

      这应该可以解决问题。

      【讨论】:

        猜你喜欢
        • 2012-10-28
        • 2019-07-01
        • 2023-02-11
        • 1970-01-01
        • 2013-11-11
        • 2015-08-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多