无法通过 RPC 获取 ListDataProvider 的正确列表

Posted

技术标签:

【中文标题】无法通过 RPC 获取 ListDataProvider 的正确列表【英文标题】:Can't get correct List via RPC for ListDataProvider 【发布时间】:2013-06-10 10:42:06 【问题描述】:

我想通过 RPC 接收类型化的列表,然后将其链接到 ListDataProvider。然后 ListDataProvider 必须在 CellTable 中显示此列表。但是我从 RPC 获得的 List 并没有出现在 CellTable 中。 我创建了一个没有 RPC 的简单列表并将其链接到 ListDataProvider。此列表已成功显示。 在调试器的帮助下,我发现了这两个列表(变量)之间的区别:

从 RPC 获取的变量结构为 elementData->[0],[1],... 简单List的变量结构是list->elementData->[0],[1],...

这里我通过 RPC 发送列表:

public List<Pravform> greetServer(String input) throws IllegalArgumentException 
...
TypedQuery<Pravform> query = em.createQuery("SELECT p FROM Pravform p",Pravform.class);
List<Pravform> categoryList = query.getResultList();
return categoryList; 

这里我将 List 链接到 ListDataProvider。

public void onSuccess(List<Pravform> result) 
List<Pravform> listPf = dataProvider.getList();
listPf = result;        

请告诉我,我做错了什么?

【问题讨论】:

【参考方案1】:

问题在于 DataListProvider 的工作方式。你基本上只是询问它的数据列表,然后你修改这个列表。所以在 onSuccess 中,你要求 dataProvider 给你它的 List,它在其中存储它的数据。您将对该列表的引用存储在 listPf 中。但之后,您将完全不同的 List 分配给 listPf。所以在这一步之前,listPf 指向存储在表中的相同数据(listPf -> 表中包含数据的列表)。但之后它指向来自 RPC 的数据(listPf -> result)。很明显,您没有看到 CellTable 中的数据发生任何变化,因为您没有更改它们。

解决方案应该是,将 onSuccess 中的新列表设置为 DataListProvider(我必须承认我没有尝试过)

dataProvider.setList(result);

或者只使用您的 dataProvider 提供的列表(就像我一样)

public void greetServer(String input, List listFromDataProvider) throws IllegalArgumentException 
...
TypedQuery<Pravform> query = em.createQuery("SELECT p FROM Pravform p",Pravform.class);
listFromDataProvider.addAll(query.getResultList());

当你从 RPC 调用这个方法时,使用

greetServer("someInput", dataProvider.getList())

【讨论】:

谢谢。我试过这个方法:dataProvider.setList(result);并成功执行。再次非常感谢你:)

以上是关于无法通过 RPC 获取 ListDataProvider 的正确列表的主要内容,如果未能解决你的问题,请参考以下文章

无法通过 JSON-RPC 将 GETBLOCKHASH 发布到比特币核心

连接到json-rpc接口

使用 javascript 异步函数通过 json-rpc 请求获取 Phantom 钱包余额的问题?

如何通过 Phantom 钱包集成使用 Vanilla JS 和 JSON-RPC 获取 Solana 帐户信息和/或 SOL 余额?

无法从另一台机器连接到 Geth 节点 RPC

Chia FullNode RPC 奇亚全节点