args Selection sẽ tự động được sử dụng như là chuỗi. Thay đổi này:
String[] whereArgs = new String[] {"'%" + mFilter + "%'" };
Để này:
String[] whereArgs = new String[] {"%" + mFilter + "%" }; (removed ' from your strings)
Với thêm '
trong đó nó hủy bỏ ra các văn bản và trở thành ''%John%''
Các builder tự động xử lý '
cho args lựa chọn.
EDIT
Thay đổi truy vấn của bạn cũng như thế này:
String sql = "SELECT * FROM Salary WHERE emp_id in (select _id from Employee where employee_name like ?)";
Cursor c = getDB(mContext).rawQuery(sql, whereArgs);
EDIT 2
tôi tái thiết lập của bạn với các lớp bên dưới và tất cả các mã của tôi chạy tốt. Tôi kéo từ người dùng John và có cả hai kết quả. Tôi tin rằng vấn đề nằm trong việc tạo cơ sở dữ liệu của bạn hoặc bạn chỉ không có dữ liệu trong cơ sở dữ liệu của bạn. Sử dụng DDMS để kéo cơ sở dữ liệu và mở nó bằng Trình duyệt SQLite. Kiểm tra xem cơ sở dữ liệu của bạn có bất kỳ dữ liệu nào bên trong nó hay không. Nếu có thì các loại tạo bảng của bạn không khớp với câu lệnh chọn. Khi tôi gọi GetMyValues () tôi nhận được 2 bản ghi được trả về từ con trỏ.
public class DataBaseHandler extends SQLiteOpenHelper {
private static final String TAG = "DBHandler";
//Database VERSION
private static final int DATABASE_VERSION = 2;
//DATABASE NAME
private static final String DATABASE_NAME = "test";
//DATABASE TABLES
private static final String TABLE_SALARY = "Salary";
private static final String TABLE_EMP = "Employee";
//DATABASE FIELDS
private static final String SalaryID= "_id";
private static final String SalaryEmpName = "employee_name";
private static final String EmpID= "_id";
private static final String EmpAmt = "amount";
private static final String EmpSalID = "emp_id";
//DATABASE TYPES
private static final String INTPK = "INTEGER PRIMARY KEY";
private static final String INT = "INTEGER";
private static final String TEXT = "TEXT";
//CREATE TABLES
private static final String CREATE_SALARY_TABLE = "CREATE TABLE " + TABLE_SALARY + "("
+ EmpID + " " + INTPK + "," + EmpAmt + " " + INT + ","
+ EmpSalID + " " + INT + ")";
//CREATE TABLE Salary(_id INTEGER PRIMARY KEY,amount INTEGER,emp_id INTEGER)
private static final String CREATE_EMPLOYEE_TABLE = "CREATE TABLE " + TABLE_EMP + "("
+ SalaryID + " " + INTPK + "," + SalaryEmpName + " " + TEXT + ")";
//CREATE TABLE Employee(_id INTEGER PRIMARY KEY, employee_name TEXT)
public DataBaseHandler(Context context){
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(CREATE_EMPLOYEE_TABLE);
db.execSQL(CREATE_SALARY_TABLE);
insertEmployeeValues(db);
insertSalaryValues(db);
}
private void insertEmployeeValues(SQLiteDatabase db){
ContentValues values = new ContentValues();
values.put(SalaryEmpName, "John");
db.insert(TABLE_EMP, null, values);
values.clear();
values.put(SalaryEmpName, "Rocky");
db.insert(TABLE_EMP, null, values);
values.clear();
values.put(SalaryEmpName, "Marry");
db.insert(TABLE_EMP, null, values);
values.clear();
}
private void insertSalaryValues(SQLiteDatabase db){
ContentValues values = new ContentValues();
values.put(EmpAmt, 500);
values.put(EmpSalID, 1);
db.insert(TABLE_SALARY, null, values);
values.clear();
values.put(EmpAmt, 400);
values.put(EmpSalID, 1);
db.insert(TABLE_SALARY, null, values);
values.clear();
values.put(EmpAmt, 600);
values.put(EmpSalID, 2);
db.insert(TABLE_SALARY, null, values);
values.clear();
values.put(EmpAmt, 700);
values.put(EmpSalID, 2);
db.insert(TABLE_SALARY, null, values);
values.clear();
values.put(EmpAmt, 350);
values.put(EmpSalID, 3);
db.insert(TABLE_SALARY, null, values);
values.clear();
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("DROP TABLE IF EXISTS " + TABLE_EMP);
db.execSQL("DROP TABLE IF EXISTS " + TABLE_SALARY);
onCreate(db);
}
public int GetMyValues(){
String mFilter = "John";
String[] whereArgs = new String[]{"%" + mFilter + "%"};
int count = 0;
SQLiteDatabase db = this.getWritableDatabase();
String where = " emp_id in (select _id from Employee where employee_name like ?)";
Cursor c = db.query("Salary",null, where, whereArgs,null,null,null);
count = c.getCount();
c.close();
return count;
}
}
Dev Reference:
Bạn có thể bao gồm? S trong việc lựa chọn, sẽ được thay thế bởi các giá trị từ selectionArgs, theo thứ tự mà chúng xuất hiện trong việc lựa chọn. Các giá trị này sẽ bị ràng buộc như Strings
Tôi đã thử xóa 'từ mã .. nhưng nó không hoạt động. – mudit
@mudit Bạn có thể thử những gì trong phần chỉnh sửa của tôi để xem nếu nó hoạt động – ObieMD5
tôi đã thử bằng cách sử dụng 2 .. nó đang làm việc trên khách hàng sqlite firefox nhưng nó không hoạt động trên Android. – mudit