2012-02-14 33 views
21

tôi đã lấy String giá trị từ một EditText và đặt nó bên trong SELECT QUERY after WHERE trạngAndroid SQLite CHỌN Query

Như

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

Nhưng nó không hoạt động. Bất kỳ đề xuất?

+3

in tên và đảm bảo bạn đang nhận được tên hợp lệ. sử dụng c.moveToFirst(); thay vì C .... next() và thử. – kosa

Trả lời

33

Hãy thử cắt chuỗi để đảm bảo không có khoảng trắng thêm:

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

Cũng sử dụng c.moveToFirst() như @thinksteep đề cập.

+6

Ví dụ này rất xấu và cho phép tiêm SQL. Tại sao không sử dụng tham số thứ hai một cách chính xác thay vì chèn null? –

9

Hãy thử sử dụng câu lệnh sau:

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

Android đòi hỏi mệnh đề WHERE so sánh với một, và sau đó bạn chỉ định một số lượng tương đương? trong tham số thứ hai của truy vấn (nơi bạn hiện có null).

Và như Nambari đề cập, bạn nên sử dụng c.moveToFirst() hơn c.moveToNext()

Ngoài ra, có thể có được trích dẫn trong tên? Điều đó cũng có thể làm hỏng mọi thứ.

2

Đây là mã bên dưới.

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

trong đó id là điều kiện kết quả sẽ được hiển thị.

+1

Điều này có vấn đề về SQL Injection –

22

Đây là mã hoàn chỉnh cho các câu lệnh chọn.

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(); 
+1

Giải quyết được sự cố của tôi. –

+1

Xin lưu ý rằng việc sử dụng c.getString (c.getColumnIndex ("column1")) tốt hơn c.getString (0): bạn sẽ không phải cập nhật các chỉ mục nếu bạn thay đổi truy vấn của mình. – chteuchteu

+0

Tôi cũng sẽ thoát khỏi tham số tên để tránh SQL injection – saniales