【发布时间】:2018-12-13 07:41:05
【问题描述】:
我想返回一个类似的帖子列表。
@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)
内容在哪里: 内容{ contentTime:Long //Unix时间戳 标识:字符串 }
与
public static Long aWeekAgo() {
long day = (1000 * 60) * 60 * 24;
return System.currentTimeMillis() - day * 7;
}
这似乎没有按预期工作,我是这样做的吗?
编辑 好的,写完问题后,现在很清楚我想做什么。这是简短的版本。
//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);
}
所以,但我想通过单个查询来执行此操作,而不是使用此循环。
【问题讨论】:
-
你用什么格式存储你的时间?它与
aWeekAgo使用的格式完全相同吗?它是一种可以有意义地比较不平等的格式吗? -
哦,这是unix时间戳,在
long,所以aWeekAgo是`System.currentTimeMillis() - ((1000 * 60) * 60 * 24 * 7)` -
酷。您经常看到人们试图使用
MM-DD-YYYY之类的东西,但它根本无法正常工作。 Unix 时间通常以秒为单位,而不是毫秒,但只要它始终如一…… -
@Shawn 是的,你觉得我应该怎么做?
-
SQLite 使用整数而不是布尔值。因此,如果您得到 True 或 False,请将传入的数据分别转换为 1 和 0。
标签: java android sql sqlite android-room