Corda 从没有模式的Vault中获取特定记录的最佳方法?

Corda 从没有模式的Vault中获取特定记录的最佳方法?,corda,Corda,我正在开发一个CorDapp,但还没有实现模式,因为这不是一个好的实践 但我必须在不使用模式的情况下获取特定记录的代码首先获取所有状态,然后获取特定记录,这非常耗时,因为它在每个状态对象上进行迭代 DataFeed,Vault.Update>DataFeed=proxy.vaultTrack(ioState.class) //这给出了IoState当前的快照。因此,如果到目前为止有11个IoState,那么将返回11个IoState对象 Vault.Page snapshot=dataFeed.

我正在开发一个CorDapp,但还没有实现模式,因为这不是一个好的实践

但我必须在不使用模式的情况下获取特定记录的代码首先获取所有状态,然后获取特定记录,这非常耗时,因为它在每个状态对象上进行迭代

DataFeed,Vault.Update>DataFeed=proxy.vaultTrack(ioState.class)

//这给出了IoState当前的快照。因此,如果到目前为止有11个IoState,那么将返回11个IoState对象
Vault.Page snapshot=dataFeed.getSnapshot();
for(StateAndRef state:snapshot.getStates()){
if(state.getState().getData().getAssetId().equals(value)){
cs=state.getState().getData();
}
}
请您建议一种更好的方法,从corda vault中获取特定记录,而无需使用模式并遍历每个状态对象。

  • 谁说实现模式不是一个好的实践?!请在你读到的地方贴一个链接
  • 如果没有自定义架构,则无法从vault中获取特定记录(即使用对特定属性的查询)

不确定您是如何得出使用模式不是好做法的结论的。你有任何数据证明这一点吗?或者,这些信息的来源将有助于我们理解实现模式的问题

如果没有架构,则无法基于状态的一个属性获取状态。但是,如果您对基于ID获取状态特别感兴趣(还考虑到您的状态本质上是线性/不可替换的),那么可以使用线性状态。可以使用
LinearStateQueryCriteria
直接从vault获取线性状态

val criteria = LinearStateQueryCriteria(linearId = listOf(linearId));
val results = vaultService.queryBy<LinearState>(criteria);
val标准=LinearStateQueryCriteria(linearId=listOf(linearId));
val results=vaultService.queryBy(标准);

谢谢您的回答。我曾在某个地方读到,创建模式不是一个好的实践,原因是如果需要在我们的CorDapp中更改或添加状态类,那么开发人员同样需要为该特定功能创建或更新模式。如果我误解了,请纠正我。谢谢模式有其自身的优点,不能说使用它是一种不好的做法。但是,是的,它是以必须为状态更新而更新模式为代价的。但这更像是一项不定期进行的活动。您不希望定期进行契约升级,因为即使没有模式,也有许多其他事情需要处理。如果您的用例需要,我建议您应该为某些ContactState使用模式。这并不是很糟糕的做法,但事实上,这是一个可以在许多不同情况下(如报告和集成)帮助您的功能。
val criteria = LinearStateQueryCriteria(linearId = listOf(linearId));
val results = vaultService.queryBy<LinearState>(criteria);