Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/228.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java SQLite:如何从子查询填充pojo上的布尔字段_Java_Android_Sql_Sqlite_Android Room - Fatal编程技术网

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