我要做的就是从插入中获取返回值很长一段时间。我知道了,但它不起作用,我从返回的值中返回了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;
}
答案 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()