2013-08-01 38 views
6

Tôi có hai bảng:Sử dụng từ khóa IN android sqlite

1) Employee -- _id, employee_name. 
2) Salary -- _id, amount, emp_id. 

mẫu dữ liệu:

Employee: 
1 John 
2 Rocky 
3 Marry 

Salary: 

1 500 1 //salary for John 
2 400 1 //salary for John 
3 600 2 //salary for Rocky 
4 700 2 //salary for Rocky 
5 350 3 //salary for Marry 

Bây giờ, tôi muốn tìm kiếm trong bảng lương để xem mà tôi đã trả lương . hãy nói rằng nếu tôi tìm kiếm 'John' trong bảng lương, nó sẽ trả về hàng 1 và 2 cho John.

Đây là những gì tôi đang cố gắng:

String where = " emp_id in (select _id from Employee where employee_name like ?)"; 

String[] whereArgs = new String[] {"'%" + mFilter + "%'" }; 

Cursor c = getDB(mContext).query("Salary", null, where, whereArgs, 
       null, null, null); 

Nhưng nó luôn luôn quay trở lại không có kết quả. Hãy giúp tôi.

Cập nhật

tôi sửa lỗi mã, và phát hiện truy vấn sau đây được thực hiện trong con trỏ:

SELECT * FROM Salary WHERE emp_id in (select _id from Employee where employee_name like ?); 

Trả lời

2

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

+0

Tôi đã thử xóa 'từ mã .. nhưng nó không hoạt động. – mudit

+0

@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

+0

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

-2

Sử dụng con trỏ là tốt hơn tôi đoán,

Demo Code:

 Cursor c = db.query(TABLE_CONTACTS, columns, KEY_MOBILE + " like '%" 
      + mobno + "'", null, null, null, order); 
return c; 

Nó sẽ trả về giá trị nếu trường hợp của giá trị đó là trong cơ sở dữ liệu! !

+0

Bạn không nên đăng demo mã không có gì để làm với câu hỏi trên khi mọi thứ được cung cấp để hoàn thành mã thực tế cần thiết. – ObieMD5

+0

Vì tôi không có đủ danh tiếng, tôi không thể đưa nội dung đó làm bình luận ... Đó là lý do tại sao nó nằm trong phần Trả lời! – Exceptional

Các vấn đề liên quan