Sqlite Query with Subquery возвращает пустое значение - PullRequest
0 голосов
/ 11 июня 2018

В моем приложении я использую подзапросы sqlite, подзапрос возвращает 3 значения, это нормально, но в основном запросе возвращает пустое значение, и мне нужна помощь в этом.

* некоторые части переменныхна португальском, потому что я бразилец.

public List<Table_Anuncio_Empregador> getAllUser_Empregador() {
    SQLiteDatabase db = this.getReadableDatabase();
    List<Table_Anuncio_Empregador> anuncios = new ArrayList<Table_Anuncio_Empregador>();

    SharedPreferences preferences = context.getSharedPreferences("user_preferences", MODE_PRIVATE);
    int user_id = preferences.getInt("user_id_conectado",0);

    String selectQuery = "SELECT "+KEY_ID+", "+KEY_IMAGEM_ANUNCIO+", "+KEY_TITULO+", "+KEY_DESCRICAO+", "+KEY_CIDADE
                        + " FROM " + TABLE_ANUNCIO_EMPREGADOR
                        + " WHERE "+ KEY_ID +" IN (SELECT "+KEY_ANUNCIO_EMPREGADOR_ID+" FROM "+ TABLE_ANUNCIO
                        +" WHERE "+ KEY_ANUNCIO_PERFIL+" = 'empregador' AND "+ KEY_USER_ID+" = "+user_id+")";
    Log.e(LOG, selectQuery);
    Cursor c = db.rawQuery(selectQuery, null);
    if (c.moveToFirst()) {
        do {
            Table_Anuncio_Empregador anuncio = new Table_Anuncio_Empregador();
            anuncio.setAnuncio_empregador_id(c.getInt(c.getColumnIndex(KEY_ID)));
            anuncio.setImagem_do_anuncio(c.getBlob(c.getColumnIndex(KEY_IMAGEM_ANUNCIO)));
            anuncio.setTitulo(c.getString(c.getColumnIndex(KEY_TITULO)));
            anuncio.setDescricao(c.getString(c.getColumnIndex(KEY_DESCRICAO)));
            anuncio.setCidade(c.getString(c.getColumnIndex(KEY_CIDADE)));

            anuncios.add(anuncio);
        } while (c.moveToNext());
    }

    return anuncios;
}

Журнал показывает запрос как: -

E/Banco_Helper: SELECT ID, Imagem_anuncio, Titulo, Descricao, Cidade FROM Anuncio_empregador WHERE ID IN (SELECT Anuncio_empregado_info_ID FROM Anuncio WHERE Anuncio_perfil = 'empregador' AND User_ID = 2)

Таблицы создаются с использованием: -

private static final String CREATE_TABLE_ANUNCIO =
        "CREATE TABLE IF NOT EXISTS " + TABLE_ANUNCIO + "(" + KEY_ID + " INTEGER PRIMARY KEY AUTOINCREMENT," +
                KEY_USER_ID + " INTEGER NOT NULL," +
                KEY_ANUNCIO_PERFIL + " TEXT NOT NULL," +
                KEY_ANUNCIO_EMPREGADOR_ID + " INTEGER," +
                KEY_ANUNCIO_PRESTADOR_ID + " INTEGER," +

                KEY_CREATED_AT + " DATETIME NOT NULL" + ")";

и: -

private static final String CREATE_TABLE_ANUNCIO_EMPREGADOR =
        "CREATE TABLE IF NOT EXISTS " + TABLE_ANUNCIO_EMPREGADOR + "(" + KEY_ID + " INTEGER PRIMARY KEY," +
                KEY_TITULO + " TEXT NOT NULL," +
                KEY_DESCRICAO + " TEXT NOT NULL," +
                KEY_BAIRRO + " TEXT NOT NULL," +
                KEY_CIDADE + " TEXT NOT NULL," +
                KEY_ESTADO + " TEXT NOT NULL," +
                KEY_LOCAL_SERVICO + " TEXT NOT NULL," +
                KEY_EXIGENCIAS + " TEXT," +
                KEY_IMAGEM_ANUNCIO + " BLOB NOT NULL" + ")";

Приравнивается к: -

CREATE TABLE IF NOT EXISTS Anuncio( 
    ID INTEGER PRIMARY KEY AUTOINCREMENT,
    USER_ID INTEGER NOT NULL,
    Anuncio_perfil TEXT NOT NULL,
    Anuncio_empregado_info_ID INTEGER,
    ANUNCIO_PRESTADOR_ID INTEGER,
    CREATED_AT DATETIME NOT NULL
);

И: -

CREATE TABLE IF NOT EXISTS Anuncio_empregador (
    ID INTEGER PRIMARY KEY,
    Titulo TEXT NOT NULL,
    Descricao TEXT NOT NULL,
    Bairro TEXT NOT NULL,
    Cidade TEXT NOT NULL,
    Estado TEXT NOT NULL,
    Local_Servico TEXT NOT NULL,
    Exigencias TEXT,
    Imagem_anuncio BLOB NOT NULL
);

1 Ответ

0 голосов
/ 11 июня 2018

Я полагаю, что ваша проблема связана с фактическими данными, а не с запросом.

То есть следующее использовалось для создания и заполнения двух таблиц, а также для выполнения запроса (плюс некоторые промежуточные запросы),В результате были включены три ожидаемые строки и три строки, которые должны были быть исключены, были.То есть рассматриваемый запрос выполнялся с ожидаемыми результатами .

Был использован следующий SQL: -

DROP TABLE IF EXISTS Anuncio;
CREATE TABLE IF NOT EXISTS Anuncio( 
    ID INTEGER PRIMARY KEY AUTOINCREMENT,
    USER_ID INTEGER NOT NULL,
    Anuncio_perfil TEXT NOT NULL,
    Anuncio_empregado_info_ID INTEGER,
    ANUNCIO_PRESTADOR_ID INTEGER,
    CREATED_AT DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP
);


DROP TABLE IF EXISTS Anuncio_empregador;
CREATE TABLE IF NOT EXISTS Anuncio_empregador (
    ID INTEGER PRIMARY KEY,
    Titulo TEXT NOT NULL,
    Descricao TEXT NOT NULL,
    Bairro TEXT NOT NULL,
    Cidade TEXT NOT NULL,
    Estado TEXT NOT NULL,
    Local_Servico TEXT NOT NULL,
    Exigencias TEXT,
    Imagem_anuncio BLOB NOT NULL DEFAULT X'00010203040506070809'
)
;   

INSERT INTO Anuncio_empregador 
    (Titulo,Descricao,Bairro,Cidade,Estado,Local_Servico,Exigencias)
    VALUES
        ('Mr','Albert','Bloggs','something','something else','xxx','xxxx'),
        ('Mr','Bert','Bloggs','something','something else','xxx','xxxx'),
        ('Mr','Charlie','Bloggs','something','something else','xxx','xxxx'),
        ('Mr','Dave','Bloggs','something','something else','xxx','xxxx'),
        ('Mr','Eddie','Bloggs','something','something else','xxx','xxxx'),
        ('Mr','Fred','Bloggs','something','something else','xxx','xxxx'),
        ('Mr','George','Bloggs','something','something else','xxx','xxxx')
    ;

SELECT * FROM Anuncio_empregador;

INSERT INTO Anuncio
    (USER_ID, Anuncio_perfil,Anuncio_empregado_info_ID,ANUNCIO_PRESTADOR_ID)
    VALUES
        (1,'empregador',1,100),
        (2,'empregador',2,100),
        (3,'empregador',3,100),
        (4,'not an empregador',1,100),
        (5,'not an empregador',2,100),
        (6,'not an empregador',3,100)
    ;

SELECT * FROM Anuncio;

SELECT * FROM Anuncio WHERE Anuncio_perfil = 'empregador';

SELECT ID,Imagem_anuncio,Titulo,Descricao,Cidade
FROM Anuncio_empregador
WHERE ID IN 
    (
        SELECT Anuncio_empregado_info_ID 
        FROM ANUNCIO 
        WHERE ANUNCIO_PERFIL = 'empregador' AND USER_ID = user_id
        )
;
  • Обратите внимание, что некоторые свободы были взяты,как
    • с использованием CURRENT_TIMESTAMP и
    • с использованием X'00010203040506070809 '
  • с сохранением необходимости повторять эти значения, которые не повлияют на работу SQL.

Результирующий Anuncio_empregador Таблица: -

enter image description here

Результирующий Anuncio таблица: -

enter image description here

  • т.е. последние 3 строки были установлены для исключения в соответствии с пунктом WHERE ANUNCIO_PERFIL = 'empregador'

Результат запроса в вопросе

SELECT ID,Imagem_anuncio,Titulo,Descricao,Cidade
FROM Anuncio_empregador
WHERE ID IN 
    (
        SELECT Anuncio_empregado_info_ID 
        FROM ANUNCIO 
        WHERE ANUNCIO_PERFIL = 'empregador' AND USER_ID = user_id
        )
;

: -

enter image description here

  • Примечание: изменение AND USER_ID = user_id на AND USER_ID = 2 показывает только 1 строку для Берта, как и ожидалось.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...