Java SQLite:如何从子查询填充pojo上的布尔字段
我想返回一个类似的帖子列表Java SQLite:如何从子查询填充pojo上的布尔字段,java,android,sql,sqlite,android-room,Java,Android,Sql,Sqlite,Android Room,我想返回一个类似的帖子列表 @Query("SELECT * FROM posts") List<Post> getPosts() 现在,我希望列表中的每个帖子都有userHasNewContent:Boolean,通过检查拥有该帖子的用户是否有不超过一周的新内容来填充 所以我试过了 @Query("SELECT *, (SELECT content_uid FROM content WHERE content_uid = postUid AND co
@Query("SELECT * FROM posts")
List<Post> getPosts()
现在,我希望列表中的每个帖子都有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)
这似乎不像预期的那样有效,我是这样做的吗
编辑
好的,在写了问题之后,现在我清楚我想做什么了。这是简短的版本
//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);
}
所以,我想用一个查询来实现这一点,而不是使用这个循环。您的子查询应该作为一个案例来编写:
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
假设post和user是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,则需要使用group和have-too。您需要按照以下方式重写查询
SELECT
*,
(
(
SELECT
COUNT(*)
FROM
(
SELECT
content_uid
FROM
content
WHERE
content_uid = postUid
AND contentTime > : aWeekAgo
)
)> 0
) AS userHasNewContent
FROM
posts
Sqlite没有位类型。您用什么格式存储时间?它与aWeekAgo使用的格式完全相同吗?这是一种可以有意义地比较不平等性的格式吗?哦,这是unix时间戳,很长,所以aWeekAgo是'System.currentTimeMillis-1000*60*60*24*7'很酷。你经常会看到人们试图使用MM-DD-YYYY之类的东西,这根本不起作用。Unix时间通常以秒为单位,而不是以毫秒为单位,但只要保持一致…@Shawn是的,你认为我应该怎么做?SQLite使用整数而不是布尔值。因此,如果分别得到True或False,请将传入数据转换为1和0。好的,这样做了,但时间有问题,似乎忽略了它,即使用户的内容超过一周,也会返回True。我还将代码更改为。选择*,+从内容中选择COUNTcontent\u uid,其中content\u uid=uid和content\u time<:aWeekAgo>0+作为userHasNewContent+,按时间排序DESC@Relm我认为这是唯一的问题,所有其他部分都很好。您可以指定contentTime和aWeekAgo实际上是什么吗?他们的数据类型和一组样本值?如果它们是时间戳,我想你需要一个>而不是
SELECT posts.name, posts.uid, posts.postUid,
(content.contentTime < :aWeekAgo) as userHasNewContent
FROM posts inner join content on content.uid = post.uid
SELECT
*,
(
(
SELECT
COUNT(*)
FROM
(
SELECT
content_uid
FROM
content
WHERE
content_uid = postUid
AND contentTime > : aWeekAgo
)
)> 0
) AS userHasNewContent
FROM
posts