MainScreen + Persistable 在一个 BlackBerry 类中

Posted

技术标签:

【中文标题】MainScreen + Persistable 在一个 BlackBerry 类中【英文标题】:MainScreen + Persistable in one BlackBerry class 【发布时间】:2012-03-04 16:38:02 【问题描述】:

我的黑莓应用程序现在几乎没有课程。现在我正在做的是创建一个屏幕供用户输入他们的信息,将其存储在持久存储中,这样当他们点击导航按钮上的返回时,他们输入的所有信息都将显示在列表视图中。

我的问题是,我不能创建一个扩展 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!");
        
    );

【问题讨论】:

当你尝试合并它们时会出现什么错误? 它是这样说的: mypackage.SchedulerCreateNew:错误!:类 mypackage.SchedulerCreateNew 被接口标记为 Persistable:net.rim.device.api.util.Persistable 不是 Persistable:基类 net.rim.device.api.ui .container.MainScreen 没有实现 net.rim.vm.Persistable 【参考方案1】:

您正在见证 BlackBerry 编程不是 Java 的真实证据:接口 (Persistable) 未被继承。

在 BlackBerry 中,如果您想持久化一个类,将其标记为 Persistable 是不够的。向上的整个类层次结构应该是可持久的。同时,标记一个类 Persistable 会让你认为子类会继承persistable,但事实并非如此。您必须将子类显式标记为 Persistable。 (我知道,此时您可能会认为这是异端邪说、暴行、......,好吧,黑莓编程充满了这样的棘手事情)。将Persistable 视为未继承的标记接口。

在你的情况下,你有一个运行时错误告诉你为了保持你的屏幕,你必须让MainScreen实现Persistable,你当然不能因为你没有访问权限到源代码。即使可以,还有另一个警告:屏幕中的每个字段、集合、容器也应该是 Persistable 的,否则你会得到一个异常。所以你在这里完全不走运,因为Field 或其子类都没有实现Persistable

但无论如何,即使有可能,也不建议为了方便而保存整个 View(及其许多嵌套对象)。而是将字段的内容和屏幕状态保存在一个小的容器对象中(实现Persistable),并在进入应用程序时恢复屏幕。这种方法允许您在从 GUI 添加或删除新字段的情况下重用容器对象(否则每次更改 GUI 设计时都必须清理模拟器内存​​以避免ClassCastException 从持久性加载屏幕)。因为您将 GUI 与持久性分离,所以它还允许您选择保存哪些字段以及不需要保存哪些字段。

【讨论】:

对不起,我对此有不好的理解。这是否意味着我应该有一个实现 Persistable 的类来管理所有存储的数据,而另一个类将是编辑字段、保存、编辑、删除等等? 是的。不仅是唯一的方法(因为 BlackBerry 非常特殊的实现),它也是一个很好的设计:您将遵循单一职责原则,并避免与继承相关的问题。即使在您的想法可能奏效的其他平台上,我也推荐它。 我明白了。我可以知道如何从持久类访问/检索存储的数据到查看类吗?我在上面附上了我的代码,请帮助我修复它。我知道这可能很可怕,但我仍在学习所有这些。 看这里,解释得更好:docs.blackberry.com/en/developers/deliverables/36691/…【参考方案2】:

MainScreen 是一个非常复杂的类,其中包含许多用户界面元素。即使您可以保留整个 MainScreen,我也无法想象您为什么要这样做。 MVC 模式建议您将模型(您的持久存储)与您的视图和控制器分开。

在 MainScreen 中组合视图和控制器可能很容易,但您可以将它们分开。

不将无关内容放入持久存储的另一个理由是,每次更改它时,您都必须提供将旧格式存储迁移到新格式,或者强制用户再次重新输入数据。

【讨论】:

感谢@Richard 的想法,实际上在阅读了这么多关于 MVC 的文章后,我并没有清楚地了解 MVC 在 Java 编程中是如何工作的。因此,我的大部分编码只是尝试和错误尝试的集合。【参考方案3】:

从外观上看,您的 UserVector 类应该实现 Persistable 并且应该具有用于​​从持久内存中存储和检索 UserVector 对象的静态方法。

查看http://docs.blackberry.com/en/developers/deliverables/7693/Persistent_data_storage_509562_11.jsp 了解有关持久性存储的良好介绍。

持久内存有点像 Windows 注册表。您可以使用唯一键查找对象,操作它们,然后将它们保存回那里,只要它们是可序列化的(可持久化的)。不要尝试将与 UI 相关的任何内容保存到持久内存中,只保存数据。

另外,如果您要保存许多用户数据,最好查看SQLite database for storage。

【讨论】:

以上是关于MainScreen + Persistable 在一个 BlackBerry 类中的主要内容,如果未能解决你的问题,请参考以下文章

尽管 Superview 的位置,但将 UIView 居中在 MainScreen 的中心

UIScreen.mainScreen().nativeBounds.height 无法使用 Xcode 7/Swift 2,目标 iOS7

横向模式的“UIScreen mainScreen] applicationFrame]”

在调用 willRotateToInterfaceOrientation 时,iOS 7 与 iOS 8 上的 mainScreen 边界大小不同

iPad:[UIScreen mainScreen].bounds 返回错误的坐标

为啥 [UIScreen mainScreen].bounds] 没有返回全屏尺寸?