0

誰でもこれで私を助けてくれることを願っています。

Android アプリで sqlite3 を使用しています。私はこのクエリを実行しようとしています:

mCursor = conexion.getDatabase().rawQuery("SELECT employee.name, company.name FROM employee "
                                               + " INNER JOIN company "
                                               + " ON (employee.idCompany=company._id) ORDER BY employee.name", null);

これは私のスキーマです:

CREATE table company ("_id INTEGER PRIMARY KEY AUTOINCREMENT, "
                    + "name TEXT NOT NULL);";

CREATE table employee ("_id INTEGER PRIMARY KEY AUTOINCREMENT, "
                     + "name TEXT NOT NULL, "
                     + "fullName TEXT NOT NULL, "
                     + "idCompany INTEGER NOT NULL, "
                     + "FOREIGN KEY(idCompany) REFERENCES company (_id));";

Android アプリでこのクエリを実行すると、次のエラーが表示されます。

05-09 22:35:23.170: E/AndroidRuntime(10920): FATAL EXCEPTION: main
05-09 22:35:23.170: E/AndroidRuntime(10920): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.ej.ej/com.ej.ej.controlador.AplicacionActivity}: java.lang.IllegalArgumentException: column '_id' does not exist

select * を使用して同じクエリを実行すると、次のようになります。

mCursor = conexion.getDatabase().rawQuery("SELECT * FROM employee "
                                               + " INNER JOIN company "
                                               + " ON (employee.idEmployee=company._id) ORDER BY employee.name", null);

問題ありません。問題なく動作します。しかし、私のスキーマでは、会社の名前と従業員の名前があるため、両方を区別する必要があります。

cmd および adb コマンドを使用してこのクエリを実行しようとしましたが、機能します。エラーの理由が本当にわかりません!!

EDITED:@HalRがクエリで提案したように(理由がわからない)、IDを取得する必要があるため、機能させました。だから今私は持っています:

mCursor = conexion.getDatabase().rawQuery("SELECT company._id, employee.name as employee, company.name as company FROM employee "
                                           + " INNER JOIN company "
                                           + " ON (employee.idCompany=company._id) ORDER BY employee.name", null);

しかし、もう1つ問題があり、クエリではなく、ActivityFragmentにありました(@Hoan Nguyenのおかげで、彼はコードのこの部分をもう一度見させてくれました):従業員をリストすると、従業員の名前を取得していましたidCompany. 理由はわかりませんが、これは idCompany の Employee ではなく、Company の _id を探していました。

String[] from = new String[] { "name", "idCompany"};
int[] to = new int[] { R.id.textViewNombreIzq,  R.id.textViewNombreCent };

ListView lvEmployee = (ListView) view.findViewById (android.R.id.list);

ListClientsCursorAdapter notes = new ListClientsCursorAdapter(context, R.layout.activity_file_client, mCursorEmployee, from, to, 0);
lvEmployee .setAdapter(notes);

私はちょうど変更しました:

String[] from = new String[] { "name", "idCompany"}; 

為に:

String[] from = new String[] { "employee", "company"};

そして今は大丈夫です。皆さんのおかげで、私は本当に感謝しています:)。

4

3 に答える 3

0

私はあなたがこれを望んでいると思います:

mCursor = conexion.getDatabase().rawQuery("SELECT employee.idCompany, employee.name, company.name FROM employee "
                                               + " INNER JOIN company "
                                               + " ON (employee.idCompany=company._id) ORDER BY employee.name", null);

注: SELECT の直後のセクションで、比較する列名を必ず指定する必要があります。

于 2013-05-10T03:37:31.423 に答える
0

_id実際には、テーブルのように列に名前を付ける必要はありません。たとえば、テーブルのようcompany_idに列を作成しcompany、クエリを作成するときに、この列を次のように指定できます。

select company_id as _id, name from company.

于 2013-05-10T03:37:52.413 に答える