2013-08-01 34 views
6

我有两个表:使用IN关键字的android系统源码

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

的样本数据:

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 

现在,我想在工资表中进行搜索,查看我所支付的工资。让我说如果我在工资表中搜索'John',它应该返回John的第1行和第2行。

这里就是我想:

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

但它总是返回任何结果。请帮忙。

更新

我调试代码,发现下面的查询在光标被执行:

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

回答

2

选择ARGS将自动用作字符串。在那里

String[] whereArgs = new String[] {"%" + mFilter + "%" }; (removed ' from your strings) 

有了额外'它取消了文本,并成为''%John%''建设者自动处理'的选择ARGS:更改此:

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

了这一点。

编辑
更改您的查询也是这样:

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

我重新创建您的设置与下面的类和我的代码跑就好了。我从用户约翰拉出并得到了两个结果。我相信问题出在你的数据库创建中,或者你的数据库中没有数据。使用DDMS来提取数据库并用SQLite Browser打开它。检查数据库中是否有任何数据。如果确实如此,那么你的表创建类型不匹配选择语句。当我调用GetMyValues()时,我得到了从游标返回的2条记录。

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:

您可能包括哪些内容?S IN的选择,这将是由值 代替从selectionArgs两个,以使他们出现在选择。该 值将被绑定为字符串

+0

我试图删除'从代码..但它没有奏效。 – mudit

+0

@mudit你可以尝试什么是我的编辑部分,看看它是否工作 – ObieMD5

+0

我试着用2种方式..它是在firefox的SQLite客户端上工作,但它不工作在Android上。 – mudit

-2

使用游标是更好,我猜,

演示代码:

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

它将返回值,如果这个值实例是数据库! !

+0

你不应该发布没有任何代码的演示代码在提供所有内容以完成实际需要的代码时,请处理上述问题。 – ObieMD5

+0

由于我没有足够的声誉,我无法将该内容作为评论...因此,它在Answer块中! – Exceptional