我现在的Blackberry应用程序课程很少。现在我正在做的是为用户创建一个屏幕以输入他们的信息,将其存储在持久存储中,这样当他们点击导航按钮后,他们输入的所有信息都将显示在列表视图中。
我的问题是,我无法创建一个扩展MainScreen并同时实现Persistable的类,因为它会给我错误。
如何解决这个问题?
为了让你们更容易看到,这是我所拥有的课程的片段。
inMenu.add(new MenuItem ("Save",110,10)
{
public void run()
{
synchronized(uv.store)
{
Vector _data = (Vector) UserVector.store.getContents();
if (_data == null)
{
_data = new Vector();
UserVector.store.setContents(_data);
}
UserVector newRec = new UserVector();
newRec.setElement(UserVector.TITLE,titleLabel.getText());
newRec.setElement(UserVector.VENUE,venueLabel.getText());
newRec.setElement(UserVector.DESCRIPTION,descriptionLabel.getText());
_data.addElement(newRec);
UserVector.store.commit();
}
Dialog.inform("Information Saved!");
}
});
答案 0 :(得分:1)
您正在目睹BlackBerry编程不是Java的真实证据:接口(Persistable)不会被继承。
在BlackBerry中,如果你想坚持一个类,将它标记为Persistable是不够的。向上的整个类层次结构应该是可持久的。同时,标记一个Persistable类会让你认为子类将继承可持久化,但事实并非如此。您必须明确将子类标记为Persistable。 (我知道,此时你可能会认为这是一种异端邪说,一种暴行,一种......,好吧,黑莓编程充满了这样棘手的事情)。将Persistable
视为未继承的标记接口。
在您的情况下,您遇到运行时错误,告诉您为了保留您的屏幕,您必须MainScreen
实施Persistable
,当然您不能这样做,因为您不能无法访问源代码。即使你可以,还有另一个警告:你的屏幕中的每个字段,集合,容器也应该是可持久的,否则你会得到一个例外。所以你在这里完全没有运气,因为Field
或其子类都没有实现Persistable
。
但无论如何,即使有可能,也不建议保存整个View(带有许多嵌套对象)以方便使用。而是将字段和屏幕状态的内容保存在一个小容器对象中(实现Persistable
)并在进入应用程序时恢复屏幕。这种方法允许您重用容器对象,以防在GUI中添加或删除新的字段(否则,每次更改GUI设计时都必须清理模拟器内存,以避免ClassCastException
从持久性加载屏幕) 。因为您将GUI与持久性分离,所以它还允许您选择保存哪些字段以及哪些字段不需要。
答案 1 :(得分:0)
MainScreen是一个非常复杂的类,其中包含许多用户界面元素。即使你可以坚持整个主屏幕我也无法想象为什么你会想要。 MVC模式表明您将模型(持久存储)与视图和控制器分开。
在MainScreen中组合视图和控制器可能很容易,但您可以将它们分开。
不要在持久性存储中添加无关内容的另一个理由是,每次更改它时,都必须提供将旧格式存储迁移到新格式,或强制用户重新输入数据。 / p>
答案 2 :(得分:0)
从它的外观来看,你的UserVector
类应该实现Persistable
,并且应该有静态方法来存储和从持久内存中检索UserVector对象。
查看http://docs.blackberry.com/en/developers/deliverables/7693/Persistent_data_storage_509562_11.jsp以获得有关持久存储的详细介绍。
持久性内存有点像Windows注册表。您可以使用唯一键查找对象,操作它们,然后将它们保存回那里,只要它们是可序列化的(可持久的)。不要试图将你的UI与永久存储器保存在一起,只保存数据。
此外,如果您要保存许多用户数据,最好还是查看SQLite database for storage。