2013-05-10 5 views
0

Я надеюсь, что кто-нибудь может мне помочь.Запрос не работает на android, столбец «_id» не существует?

Я использую sqlite3 в своем приложении для Android. Я пытаюсь сделать этот запрос:

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

Когда я запускаю этот запрос на мой андроид приложение, которое я получаю следующее сообщение об ошибке:

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 предложил в запросе (не знаю почему), я должен получить идентификаторы. Так что теперь у меня есть:

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 Employee.

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

И теперь прекрасно. Спасибо всем, за вашу помощь я действительно оценил :).

+0

нет idEmployee –

+0

нет, есть idCompany. Мой сотрудник ссылается на свою компанию. – kiduxa

+0

У вас есть список в приложении? –

ответ

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.

+0

да, это так. Но даже пытаюсь, чтобы я получил ту же ошибку. Это действительно странно! – kiduxa

+0

см. Мое редактирование выше - вы должны упомянуть employee.idCompany также в SELECT или утверждение ничего не узнает об этом. – HalR

+0

Я все еще получаю сообщение об ошибке. Уже это сделал. Это просто не имеет смысла. – kiduxa

0

На самом деле вам не нужно указывать свою колонку как _id в вашей таблице. например, вы можете создать столбец как company_id в своей таблице company, и когда вы напишете свой запрос, вы можете указать этот столбец, как показано ниже.

select company_id as _id, name from company.

+0

Итак, должен ли я определенно изменить свои идентификаторы схемы ?. Но есть ли какие-либо проблемы при вызове _id ?? – kiduxa

+0

имена не имеют значения. – kdehairy

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.

исправьте их первым и сообщите мне, если ошибка все еще существует.

+0

да, извините, это опечатки, потому что мой запрос на испанском языке, и я перешел на английский язык для лучшего усвоения. У меня все в порядке. Итак, это не моя ошибка. И помните, что select * работает. – kiduxa

Смежные вопросы