查询不能在android上工作,列'_id'不存在?

时间:2013-05-10 03:30:02

标签: android sqlite android-sqlite

我希望有人能帮助我。

我在我的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命令执行此查询,但它确实有效。我真的不明白错误!!

编辑:我让它工作,正如@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);

但我还有一个问题,它不在查询中,它出现在我的ActivityFragment上(感谢@Hoan Nguyen,他让我再次看到这部分代码): 列出我的员工,我得到了我的员工和idCompany的名字。不知道为什么,但这是寻找公司的_id而不是员工的idCompany。

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"};

现在很好。感谢所有人,为了你的帮助,我真的很感激:)。

3 个答案:

答案 0 :(得分:1)

首先,我在CREATE TABLE employee语句中使用了标签full name作为列标签。如果这不是拼写错误,请将其更改为full_name。你不能只是以这种方式在列标签中使用空格。

第二次,请使用此查询字符串: SELECT employee.name, company.name FROM employee INNER JOIN company ON (employee.idCompany=company._id) ORDER BY employee.name。请注意ON表达式。它是employee.idCompany而非employee.idEmployee

首先解决这些问题,如果错误仍然存​​在,请告诉我。

答案 1 :(得分: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之后的部分中指定要比较的列名。

答案 2 :(得分:0)

实际上,您无需在表格中将列命名为_id。例如,您可以在company_id表格中创建company列,并在编写查询时,可以按以下方式指定此列。

select company_id as _id, name from company