6

私は2つのテーブルを持っています:

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

2 に答える 2

2

選択引数は自動的に文字列として使用されます。これを変える:

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

これに:

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

そこに余分な'ものがあると、テキストがキャンセルされ、''%John%''ビルダー'は選択引数を自動的に処理します。

編集
クエリもこれに変更します。

String sql = "SELECT * FROM Salary WHERE emp_id in (select _id from Employee where employee_name like ?)";
Cursor c = getDB(mContext).rawQuery(sql, whereArgs);

編集2

以下のクラスでセットアップを再作成したところ、すべてのコードが正常に実行されました。ユーザー John から取得した結果、両方の結果が得られました。データベースの作成に問題があるか、データベース内にデータがないだけだと思います。DDMS を使用してデータベースをプルし、SQLite ブラウザーで開きます。データベース内にデータがあるかどうかを確認します。そうである場合、テーブルの作成タイプが select ステートメントと一致しません。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;
    }
}

開発リファレンス:

?s を選択に含めることができます。これは、selectionArgs からの値で置き換えられ、選択に表示されます。値は文字列としてバインドされます

于 2013-08-01T04:22:32.103 に答える