插入Room Persistence Library后获取rowId

时间:2018-09-24 19:51:46

标签: java android android-room

我要做的就是从插入中获取返回值很长一段时间。我知道了,但它不起作用,我从返回的值中返回了0。我正在使用Google CodeLabs中所述的DAO,存储库和ViewModel。我关注了这篇帖子Rowid after Insert in Room

玩家类

  DECLARE @DynamicPivotQuery AS NVARCHAR(MAX)
DECLARE @ColumnName AS NVARCHAR(MAX)

--Get distinct values of the PIVOT Column 
SELECT @ColumnName = ISNULL(@ColumnName + ',','') + QUOTENAME([month]) 
FROM (SELECT DISTINCT [Month] FROM MyTable) AS [Month]
 order by [month]

--Prepare the PIVOT query using the dynamic 
SET @DynamicPivotQuery = 
  N'SELECT Mem_Name, ' + @ColumnName + '
    FROM MyTable   into MyTest
    PIVOT(SUM(Amount) 
          FOR Month IN (' + @ColumnName + ')) AS PVTTable' 
--Execute the Dynamic Pivot Query
EXEC sp_executesql @DynamicPivotQuery 

DAO

@Entity(tableName = "player_table")
public class Player {
@PrimaryKey(autoGenerate = true)
private long id;
@NonNull
@ColumnInfo(name = "username")
private String username;
}

存储库

 @Insert
long insert(Player player);

ViewModel

public long insert(Player player) {
    new insertAsyncTask(mPlayerDao).execute(player);
    rowId = player.getId();
return rowId;
}

活动

public long insert(Player player){
    rowId = mRepository.insert(player);
    return rowId;
}

2 个答案:

答案 0 :(得分:0)

您的存储库类中的insert方法可以更改为此:

public long insert(Player player) {
    return new insertAsyncTask(mPlayerDao).execute(player).get();
}

我通过在GitHub上搜索后两种类型为“ Void,Long”以及其他一些特定于Room的术语的AsyncTasks找到了this

调试我自己的应用程序时,我发现insert方法中的return语句是在执行doInBackground方法之前执行的,这在我看到它发生之后是显而易见的。

答案 1 :(得分:0)

问题是您在AsyncTask完成其插入的后台工作之前返回player.getId();您必须等待,直到为您提供正确的插入结果为止,这是使用线程安全的CountDownLatch的建议解决方案,该解决方案使用.await()方法暂停执行后续代码,直到{ {1}}达到0;每次调用CountDownLatch时递减1。

.countDown()