Постоянный магазин BlackBerry выдает java.lang.Error - PullRequest
1 голос
/ 13 августа 2011

Я пытаюсь разработать приложение, которое использует класс appinfo для хранения настроек.Это постоянно.Когда я использую только что установленное приложение, оно работает отлично.Затем, если я перезагружу трески, любая постоянная попытка доступа к хранилищу вызовет java.lang.error и заявит, что у меня нет разрешений (приостанавливается на исключение разрешений для приложения до того, как даже войти в кишки приложения).

Длячтобы приложение снова заработало, мне нужно очистить симулятор и снова запустить его.

Редактировать: Забыл упомянуть, если мне удалось открыть его и перезагрузить трески, пока приложение открыто в симуляторе, оно продолжает работать.

Edit2:это начинает выглядеть как проблема 6.0.Так как, если я открою его в симуляторе 7.0, все будет красиво.

Информация о приложении:

package ca.dftr.lib.persistables;

import java.util.Hashtable;

import net.rim.device.api.system.ApplicationDescriptor;
import net.rim.device.api.util.ContentProtectedHashtable;
import net.rim.device.api.util.Persistable;

/**
 * Basic class for storing application specific information. 
 * Information such as application settings or whether the license agreement was accepted.
 * For more complex and specific classes they should be implemented separately and implement persistable 
 * @author deforbes
 */
public class AppInfo extends ContentProtectedHashtable  implements Persistable {

    private String _appName = null;
    private String _version = null;

    /**
     * Constructs the application info, creates and persists a hashtable for application settings.
     * @param uniqueHexAppIdentifier Can be automatically created in resource class (BUNDLE_ID) or generated using other unique information.
     */
    public AppInfo() {    
        ApplicationDescriptor appDesc = ApplicationDescriptor.currentApplicationDescriptor();
        _appName = appDesc.getName();
        _version = appDesc.getVersion();
    }

    /**
     * Get the Name of the application
     * @return The application name from the app descriptor
     */
    public String getName()
    {
        return _appName;
    }

    /**
     * Get the Version of the application
     * @return The application version from the app descriptor
     */
    public String getVersion()
    {
        return _version;
    }
}

Помощник постоянного хранилища:

package ca.dftr.main;

import ca.dftr.lib.persistables.AppInfo;
import net.rim.device.api.system.PersistentObject;
import net.rim.device.api.system.PersistentStore;

/**
 * Persistant store helper class. 
 * Thanks to Max Gontar of Stack Overflow
 * @author deforbes
 */
public class PersistentStoreHelper{

    static PersistentObject appInfoStore = PersistentStore
        .getPersistentObject( Global.GUID );

    public static void saveAppInfo( AppInfo appInfo ){
        saveObject( appInfoStore, appInfo );
    }

    public static AppInfo retrieveAppInfo(){
        return ( AppInfo )retrieveObject( appInfoStore );
    }



    public static void saveObject( PersistentObject store, Object object ){
        synchronized( store ){
            store.setContents( object );
            store.commit();
        }
    }
    public static Object retrieveObject( PersistentObject store ){
        Object result = null;
        synchronized( store ){
            result = store.getContents();
        }
        return result;
    }
}

Получение переменной информации приложения в классе, в котором я ее использую.

public static AppInfo AppData;
    static{
        AppData = PersistentStoreHelper.retrieveAppInfo();
        if (AppData == null){
            AppData = new AppInfo();
            PersistentStoreHelper.saveAppInfo(AppData);
        }
    }

Первые строки моей программы после создания приложения в рамках функции "main".

Object acceptedLicense = Global.AppData.get("isLicenseAccepted");
        if (acceptedLicense == null){
            Global.AppData.put("isLicenseAccepted", new Boolean(false));
            acceptedLicense = Global.AppData.get("isLicenseAccepted");
        }
        if (!((Boolean) acceptedLicense).booleanValue()){

//..... ETC. It crashes before this

Буду признателен за любую помощь.Это проблема симулятора или это моя проблема?

1 Ответ

1 голос
/ 13 августа 2011

Это ошибка симулятора. При отладке постоянного хранилища на других устройствах он работает нормально. Это факел 6.0.0.246 и т. Д., Которые имеют проблемы. Он не удаляет должным образом предыдущее постоянное хранилище после «горячей замены» файлов cod. При установке на обычное устройство, если вам нужно обновить приложение и выбрать «перезапустить позже», а затем попытаться открыть приложение, вы получите эту ошибку.

Ошибка симулятора разработки.

...