2013-08-01 11 views
6

Ich habe zwei Tabellen:Verwendung von IN Stichwort in Android SQLite

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

Beispieldaten:

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 

Nun möchte ich in Gehaltstabelle suchen, die zu sehen, wem ich das Gehalt gezahlt haben . Sagen wir, wenn ich in der Saladetabelle nach 'John' suche, sollte es die Zeile 1 und 2 zurückgeben, die für John bestimmt sind.

Hier ist, was ich versuche:

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

Aber es wird immer keine Ergebnisse zurück. Bitte helfen Sie.

aktualisieren

ich den Code auf Fehler und fand folgende Abfrage wird in Cursor-Ausführung:

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

Antwort

2

Selection args als Strings automatisch verwendet werden. Ändern Sie dies:

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

zu diesem:

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

Mit extra ' da es den Text aufhebt und wird ''%John%'' Der Builder automatisch ' für die Auswahl args behandelt.

EDIT
Ändern Sie Ihre Abfrage auch dies:

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

ich unter Ihrem Setup mit der Klasse neu erstellt und alle liefen meinen Code einfach gut. Ich zog von Benutzer John und bekam beide Ergebnisse. Ich glaube, dass das Problem innerhalb Ihrer Datenbankerstellung liegt oder Sie haben einfach keine Daten in Ihrer Datenbank. Verwenden Sie DDMS, um die Datenbank abzurufen und mit SQLite Browser zu öffnen. Überprüfen Sie, ob in Ihrer Datenbank Daten enthalten sind. Wenn dies der Fall ist, stimmen die Tabellenerstellungstypen nicht mit der SELECT-Anweisung überein. Wenn ich GetMyValues ​​() aufrufen, bekomme ich 2 Datensätze vom Cursor zurückgegeben.

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:

können Sie enthalten? S in Auswahl, die von selectionArgs durch die Werte ersetzt werden, damit sie bei der Auswahl erscheinen. Die Werte als Strings

+0

Ich habe versucht, die 'aus dem Code .. aber es hat auch nicht funktioniert. – mudit

+0

@mudit Können Sie versuchen, was in meinem Bearbeitungsabschnitt ist, um zu sehen, ob es funktioniert – ObieMD5

+0

Ich versuchte mit der 2-Wege .. Es funktioniert auf Firefox sqlite Client, aber es funktioniert nicht auf Android. – mudit

-2

gebunden Mit Cursor sind besser denke ich,

Demo-Code:

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

Es wird den Wert zurück, wenn die Instanz dieses Wertes in der Datenbank ist! !

+0

Sie sollten nicht Demo-Code, der nichts zu tun hat Machen Sie es mit der obigen Frage, wenn alles zur Verfügung steht, um den tatsächlich benötigten Code zu erstellen. – ObieMD5

+0

Da ich nicht genug Reputation habe, konnte ich diesen Inhalt nicht als Kommentar geben ... Deshalb ist es im Antwortblock! – Exceptional