У меня есть одна таблица, такая как UserTable.

@Entity
public class UserTable{
  @PrimaryKey(autoGenerate = true)
    private int userId;
    private String userName;
    private String userEmailId;

  // Below code is getter and setter of this class.
}

@Dao
public interface UserDao {
    @Query("SELECT * FROM userTable")
    public List<UserTable> loadAllUsers();

    @Insert
    public long insertUserTable(UserTable userTable);

    @Insert
    public long[] insertUserTables(UserTable... userTables);

    @Update
    public int updateUserTable(UserTable userTable);

    @Delete
    public int deleteUserTable(UserTable userTable);

    @RawQuery
    public abstract List<UserTable> loadAllUserListByGivenIds
            (SupportSQLiteQuery query);

    public default List<UserTable> loadAllUserListByIds(long[] userIds) {
        List<UserTable> list;
        ArrayList<Object> argsList = new ArrayList<>();
        String selectQuery = "SELECT  * FROM UserTable WHERE userId IN (?);";
        argsList.add(userIds);
        
        SimpleSQLiteQuery simpleSQLiteQuery = new SimpleSQLiteQuery(selectQuery, argsList.toArray());
        list = loadAllUserListByGivenIds(simpleSQLiteQuery);
        return list;
    }
}

// Теперь в файле My MainActivity.class я использую следующий код:

 List<UserTable> userList= databaseClient
                .getAppDatabase()
                .userDao()
                .loadAllUserListByIds(new long[]{1L,2L});

Мой запрос выполняется в обычной базе данных, но когда я передал массив идентификаторов пользователей, тогда в методе @RawQuery () класса dao не поддерживается предложение «IN», используемое в условии «WHERE userId IN (?)».

Как я буду использовать предложение «IN» в @RawQuery () базы данных комнаты.

0
Mayur Misal 24 Сен 2021 в 08:58

2 ответа

Лучший ответ

Намного проще использовать @Query, это просто: -

@Query("SELECT * FROM UserTable WHERE userId IN (:idList)")
public List<UserTable> getWhatever(long[] idList);

Затем вы использовали бы getWhatever(new long[]{1L,2L})

Если вам нужен @rawQuery, хотя вы могли бы это сделать (для моего удобства использовал предыдущий код ответа): -

private List<TableXEntity> loadAllUserListByIds(int order,long[] idList) {
    StringBuilder idListAsCSV = new StringBuilder(); //<<<<<<<<<<
    boolean afterFirst = false; //<<<<<<<<<<
    //<<<<<<<<<< all of the loop to create the CSV
    for (Long l: idList) {
        if (afterFirst) {
            idListAsCSV.append(",");
        }
        afterFirst = true;
        idListAsCSV.append(String.valueOf(l));
    }
    StringBuilder sb = new StringBuilder("SELECT * FROM ").append(DBHelper.TableX.NAME);
    sb.append(" WHERE " + DBHelper.TableX.COLUMN_ID + " IN(").append(idListAsCSV).append(") "); //<<<<<<<<<<
    switch (order) {
        case DBHelper.TableX.FIRSTNAME_DESCENDING:
            sb.append(DBHelper.TableX.ORDER_BY_FIRSTNAME_DESC);
            break;
        case DBHelper.TableX.FIRSTNAME_ASCENDING:
            sb.append(DBHelper.TableX.ORDER_BY_FIRSTNAME_ASC);
            break;
        case DBHelper.TableX.LASTNAME_DESCENDING:
            sb.append(DBHelper.TableX.ORDER_BY_LASTNAME_DESC);
            break;
        case DBHelper.TableX.LASTNAME_ASCENDING:
            sb.append(DBHelper.TableX.ORDER_BY_LASTNAME_ASC);
            break;
        default:
            break;
    }
    sb.append(";");
    return roomDao.rawq(new SimpleSQLiteQuery(sb.toString(),null));
}

Т.е. предоставить CSV (хотя я смутно помню, как мог передавать массив)

2
MikeT 24 Сен 2021 в 09:31

Пожалуйста, попробуйте это, вот оно работает!

Попробуйте этот простой трюк, чтобы передать аргументы для оператора IN -

List<Object> argList = new ArrayList<>();
 argList.add("3");
 argList.add("6");

    

Затем подготовьте строку исходного запроса:

Примечание. Сопоставьте размер списка аргументов с "?" размер

   String selectQuery = "SELECT * FROM task WHERE id IN (?,?)";

После этого передайте необработанную строку запроса в SimpleSQLiteQuery-

   SimpleSQLiteQuery rawQuery = new SimpleSQLiteQuery(selectQuery, args.toArray());

Затем получите список с помощью DAO:

List<UserTable> taskList1=DatabaseClient
                        .getInstance(getApplicationContext())
                        .getAppDatabase()
                        .userTableDAO()
                        .getAllList(query);
0
Sachin Deshapande 24 Сен 2021 в 11:41