SQLite: Как заполнить логическое поле в pojo из подзапроса - PullRequest
0 голосов
/ 13 декабря 2018

Я хочу вернуть список сообщений наподобие.

@Query("SELECT * FROM posts")
List<Post> getPosts()

У меня есть pojo.

post {
   name:String
   id :String
   postUid:String
   userHasNewContent:Boolean
}

Теперь я хочу, чтобы у каждого сообщения в списке была userHasNewContent:Boolean, заполняется проверкой, есть ли у пользователя, которому принадлежит этот пост, новый контент (не старше недели)

Итак, я попробовал.

@Query("SELECT *,
       (SELECT content_uid FROM content WHERE content_uid = postUid AND
        contentTime < :aWeekAgo)AS userHasNewContent 
      FROM posts")
List<Post> getPosts(String aWeekAgo)

ГДЕ контент: content {contentTime: Long// Unix Timestamp id: String}

AND

public static Long aWeekAgo() {
        long day = (1000 * 60) * 60 * 24;
        return System.currentTimeMillis() - day * 7;
    }

Кажется, это работает не так, как ожидалось, я делаю так?

Edit Хорошо, после написания вопроса теперь ясно, что я хочу сделать.Вот короткая версия.

//Get all posts
@Query("SELECT * FROM posts")
List<Post> getPosts()

//Then loop through them.
@Query("SELECT count(*) FROM content WHERE contentId :contentUID AND soundTime < : aWeekAgo")
int checkIfUserHasNewContent(String uid, long aWeekAgo);


List<Post> postsWithNewContentIndicator = new ArrayList<>();
for (Post post : postsFromDb) {
    post.userHasNewContent(checkIfUserHasNewContent(post.getUid()) > 0);
    postsWithNewContentIndicator.add(post);
}

Итак, но я хочу сделать это с помощью одного запроса и не использовать этот цикл.

Ответы [ 3 ]

0 голосов
/ 13 декабря 2018

Предположим, что запись и пользователь от 1 до 1, вы можете сделать это с объединением.

SELECT posts.name, posts.uid, posts.postUid, 
  (content.contentTime < :aWeekAgo) as userHasNewContent
FROM posts inner join content on content.uid = post.uid

Если для пользователя от 1 до n, вам нужно будет использовать группу и тоже.

0 голосов
/ 16 декабря 2018

Вам нужно переписать запрос следующим образом

SELECT 
  *, 
  (
    (
      SELECT 
        COUNT(*) 
      FROM 
        (
          SELECT 
            content_uid 
          FROM 
            content 
          WHERE 
            content_uid = postUid 
            AND contentTime > : aWeekAgo
        )
    )> 0
  ) AS userHasNewContent 
FROM 
  posts
0 голосов
/ 13 декабря 2018

Ваш подзапрос должен быть написан как регистр:

SELECT CASE WHEN EXISTS (
   SELECT content_uid FROM content WHERE content_uid = postUid AND
       contentTime < :aWeekAgo
)
THEN CAST(1 AS BIT)
ELSE CAST(0 AS BIT) END
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...