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

如果我运行相同的查询但选择 *:

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。不知道为什么,但这是在寻找 Company 的 _id 而不是 Employee 的 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"};

现在很好。谢谢大家,我真的很感激你的帮助:)。

4

3 回答 3

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。_

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

于 2013-05-10T12:35:44.583 回答
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 回答