Android SQLITE: получить значение идентификатора на основе значения столбца - PullRequest
0 голосов
/ 19 апреля 2019

Я создаю свое первое приложение для Android, в котором я пытаюсь синхронизировать данные MySQL в SQLite в Android.У меня есть две таблицы в MySQL, и обе синхронизируются должным образом в Android SQLite.Первая таблица выглядит следующим образом:

id ProjectName
1  RA_Tesco
2  RA_Coors
3  RA_JWNT

Вторая таблица выглядит следующим образом:

id pid Outlet Add1
1   1   Tesco  XYZ
2   1   Tesco  ABC
3   2   Coors  NBC

PID во второй таблице ссылается на идентификатор первой таблицы.Как можно установить вторую таблицу на основе значения PID, полученного из идентификатора первой таблицы.Я знаю, что это довольно просто в php, mysql или даже в Python или R. Однако получение идентификатора на основе строки и обращение к нему во второй таблице кажется довольно сложным в Android.Мои коды до сих пор:

sqLiteDatabase = sqLiteHelper.getWritableDatabase();
clickedId = getIntent().getExtras().get("clickedId").toString(); 

Когда я поднимаю тост по clickedId, я получаю правильную строку, например, RA_Tesco.

cursor = sqLiteDatabase.rawQuery("SELECT * FROM "+SQLiteHelper.TABLE_NAME1+" where pid = 1"+"", null);

Приведенный выше код также отображает правильный наборзаписи из таблицы sqlite.Я борюсь с интеграцией их обоих.Я попробовал следующее:

String pid;
sqLiteDatabase = sqLiteHelper.getWritableDatabase();
clickedId = getIntent().getExtras().get("clickedId").toString();
pid = sqLiteDatabase.rawQuery( "select id from "+sqLiteHelper.TABLE_NAME+" where projectName = "+clickedId+"", null );

Я получаю incompatible types ошибку.

Ответы [ 3 ]

1 голос
/ 19 апреля 2019

Вот что у меня сработало:

clickedId = getIntent().getExtras().get("clickedId").toString();
cursor = sqLiteDatabase.rawQuery("SELECT * FROM "+SQLiteHelper.TABLE_NAME1+" where pid = (select id from "+SQLiteHelper.TABLE_NAME+ " where ProjectName = '"+clickedId+"'"+")", null);

Я просто следовал тому же принципу вложенности MySQL. Приведенный выше код выглядит примерно следующим образом:

select * from table2 where pid = (select id from table1 where projectname="xyz");
0 голосов
/ 19 апреля 2019

Если вы хотите получить соответствующие строки из 2-й таблицы, когда вы передаете в качестве аргумента значение ProjectName (я полагаю, это clickedId, хотя его имя - id?), Создайте оператор следующим образом:

String sql = 
    "select t2.* from " + SQLiteHelper.TABLE_NAME1 + 
    " t2 inner join " + SQLiteHelper.TABLE_NAME + 
    " t1 on t1.id = t2.pid where t1.ProjectName = ?"; 

Это объединяет 2 таблицы и возвращает все столбцы 2-й таблицы.Выполните rawQuery(), передав clickedId в качестве параметра, что является правильным способом избежать внедрения SQL:

Cursor cursor = sqLiteDatabase.rawQuery(sql, new String[] {clickedId});
0 голосов
/ 19 апреля 2019

1) Попробуйте поставить запрос в одинарную кавычку

2) rawQuery возвращает Cursor, а не String

Итак,

Cursor pidCursor = sqLiteDatabase.rawQuery( "select id from "+sqLiteHelper.TABLE_NAME+" where projectName = '"+clickedId+"'", null );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...