我正在开发一个CorDapp,但是还没有实现schema,因为这不是一个好的做法。
但我要在不使用schema的情况下获取一条特定记录的代码是先获取所有状态,然后再获取一条特定的记录,这非常耗时,因为它要遍历每个状态对象。
DataFeed,Vault.Update> dataFeed = proxy.vaultTrack(IOUState.class)。
//this gives a snapshot of IOUState as of now. so if there are 11 IOUState as of now, this will return 11 IOUState objects
Vault.Page<IOUState> snapshot = dataFeed.getSnapshot();
for (StateAndRef<IOUState> state : snapshot.getStates()) {
if (state.getState().getData().getAssetId().equals(value)) {
cs = state.getState().getData();
}
}
你能不能建议一个更好的方法来从corda vault中获取一个特定的记录,而不需要使用schema和遍历每个状态对象。
不知道你是如何得出使用schema不是一个好的做法的结论。你有什么数据点来证明这一点吗?或者这些信息的来源对我们理解实现schema的问题会有帮助。
如果没有schema,是不可能根据一个状态的属性来获取它的。但是,如果你特别想根据一个ID来获取一个状态(也考虑到你的状态是线性的非可变的性质),你可以使用线性状态。一个线性状态可以直接从库中获取,使用一个 LinearStateQueryCriteria
.
val criteria = LinearStateQueryCriteria(linearId = listOf(linearId));
val results = vaultService.queryBy<LinearState>(criteria);