MainScreen + Persistable в одном классе BlackBerry - PullRequest
0 голосов
/ 04 марта 2012

У меня есть несколько классов для моего приложения 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!");
        }
    });

Ответы [ 3 ]

1 голос
/ 05 марта 2012

Вы видите истинное доказательство того, что BlackBerry-программирование не является Java: тот факт, что интерфейс (Persistable) не наследуется.

В BlackBerry, если вы хотите сохранить класс, пометить его как Persistable недостаточно. Вся иерархия классов вверх должна быть устойчивой. В то же время, маркировка класса Persistable заставит вас думать, что подкласс унаследует постоянный, но это не так. Вам придется явно пометить подкласс как постоянный. (Я знаю, на данный момент вы, вероятно, думаете о том, что это ересь, злодеяние, ... ну, ну, в программировании BlackBerry полно таких хитрых вещей, как эта). Думайте о Persistable как о интерфейсе маркера, который не наследуется.

В вашем случае у вас возникает ошибка Runtime, сообщающая, что для сохранения вашего экрана вам нужно будет MainScreen реализовать Persistable, чего, конечно, вы не можете, потому что у вас нет доступа к исходному коду. Даже если бы вы могли, есть еще одна оговорка: каждое поле, коллекция, контейнер на вашем экране также должны быть постоянными, чтобы вещь работала, иначе вы получите исключение. Так что вам совершенно не повезло, потому что ни Field, ни его подклассы не реализуют Persistable.

Но в любом случае, даже если бы это было возможно, не рекомендуется сохранять весь вид (с множеством вложенных объектов) просто для удобства. Вместо этого сохраните содержимое полей и состояние экрана в небольшом контейнере (реализует Persistable) и восстановите экран при входе в приложение. Этот подход позволяет вам повторно использовать ваш контейнерный объект в случае добавления или удаления новых полей из GUI (в противном случае вам придется очищать память симулятора каждый раз, когда вы изменяете дизайн GUI, чтобы избежать ClassCastException загрузки экрана из постоянства). Поскольку вы отделяете GUI от постоянства, он также позволяет вам выбрать, какие поля будут сохранены, а какие нет.

0 голосов
/ 05 марта 2012

Судя по всему, ваш класс UserVector должен реализовывать Persistable и иметь статические методы для хранения и извлечения объекта UserVector из постоянной памяти.

Проверьте http://docs.blackberry.com/en/developers/deliverables/7693/Persistent_data_storage_509562_11.jsp для хорошего введения в постоянное хранение.

Постоянная память немного похожа на реестр Windows. Вы можете искать объекты с помощью уникального ключа, манипулировать ими, а затем сохранять их там до тех пор, пока они сериализуются (сохраняются). Не пытайтесь сохранить что-либо, связанное с вашим пользовательским интерфейсом, в постоянной памяти, сохраняйте только данные.

Кроме того, если вы сохраняете много пользовательских данных, вам, возможно, лучше взглянуть на базу данных SQLite для хранения .

0 голосов
/ 05 марта 2012

MainScreen - очень сложный класс со множеством элементов пользовательского интерфейса. Даже если бы вы могли сохранить весь MainScreen, я не представляю, почему вы этого хотите. Шаблон MVC предполагает, что вы держите модель (ваше постоянное хранилище) отдельно от вашего представления и контроллеров.

Возможно, проще объединить вид и контроллер на главном экране, но вы можете разделить их.

Еще один аргумент в пользу того, чтобы не помещать посторонние вещи в ваше постоянное хранилище, заключается в том, что каждый раз, когда вы меняете его, вы должны либо обеспечить миграцию старого формата хранения в новый формат, либо заставить своих пользователей повторно вводить данные снова.

...