Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/blackberry/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将数据保存到BlackBerry 6中的持久存储错误_Blackberry_Java Me - Fatal编程技术网

将数据保存到BlackBerry 6中的持久存储错误

将数据保存到BlackBerry 6中的持久存储错误,blackberry,java-me,Blackberry,Java Me,我试图在持久性存储中保存图像的路径,以便在用户从历史记录列表中选择特定产品时显示图像(每个产品一个图像,由用户拍摄)。现在我遇到的问题是,当我第一次将应用程序加载到手机并尝试向持久存储添加条目时,它会在稍后抛出一个错误,应用程序冻结。然而,当我回来,并再次添加一个图像,它的工作刚刚好,图像总是加载时,我选择每个特定的产品 这让我相信罪魁祸首是我正在做的第一个store8.commit(),出于某种原因,它抛出了一个异常:调试时没有堆栈跟踪。这是我的密码: public class Storage

我试图在持久性存储中保存图像的路径,以便在用户从历史记录列表中选择特定产品时显示图像(每个产品一个图像,由用户拍摄)。现在我遇到的问题是,当我第一次将应用程序加载到手机并尝试向持久存储添加条目时,它会在稍后抛出一个错误,应用程序冻结。然而,当我回来,并再次添加一个图像,它的工作刚刚好,图像总是加载时,我选择每个特定的产品

这让我相信罪魁祸首是我正在做的第一个store8.commit(),出于某种原因,它抛出了一个异常:调试时没有堆栈跟踪。这是我的密码:

public class Storage extends Application {

private static final long PERSISTENT_KEY8 = 0x2c4c45c139ee9728L;
static PersistentObject store8 = PersistentStore.getPersistentObject(PERSISTENT_KEY8);
private static Vector pics;

/**
 * Picture Section ***********************************************************
 */
public static void savePicture(){

    store8.setContents(new Vector());
    store8.commit();

    if(pics == null){
        pics = new Vector();
    }
    synchronized(store8) {

        store8.setContents(pics); 
        store8.commit();
    }

}
public static String getPicture(String productName){

    if(pics.size()==0){
        return "";
    }else{
        for(int i = 0; i < pics.size(); i++){
            Pics product = (Pics)pics.elementAt(i);
            if(product.getProductName().equals(productName)){
                return product.getPic();
            }
        }
        return "";
    }   
}
public static void removePicture(String productName){

    if(pics.size()==0){
        return;
    }else{
        for(int i = 0; i < pics.size(); i++){
            Pics product = (Pics)pics.elementAt(i);
            if(product.getProductName().equals(productName)){
                pics.removeElementAt(i);
            }
        }
    }   
}   
public static void loadPicture(){

    pics = (Vector)store8.getContents();

    if(pics == null){
        pics = new Vector();
    }
}
public static void setPicture(Pics pro){
    if(pics.size()!=0){
        for(int j = 0; j< pics.size() ; j++){
            Pics product = (Pics)pics.elementAt(j);
            if(pro.getProductName().equals(product.getProductName())){
                pics.removeElementAt(j);
            }
        }
    }
    pics.addElement(pro);
}
}
我删除了这个类的许多部分,如果它太长,很抱歉,在这段代码中基本上有4个存储方法调用,我相信它们都在正确的位置。。但我还是在第一次加载时遇到了问题,而不是之后

有人能看出我做错了什么吗?这个问题我已经有一个星期了


谢谢你的帮助

试试这样的方法:

public class Storage extends Application{ 

    private static final long PERSISTENT_KEY8 = 0x2c4c45c139ee9728L; 
    static PersistentObject store8 = null; 
    private static Vector pics = null; 

    static{
        store8 = PersistentStore.getPersistentObject(PERSISTENT_KEY8)
        pics = (Vector)store8.getContents(); 
        if(pics == null){ 
            pics = new Vector(); 
            store8.setContents(pics);
            store8.commit();
        } 
    }

    public static void savePicture(){
        try{
            synchronized(store8){ 
                store8.setContents(pics);  
                store8.commit(); 
            }
        }
        catch(Exception e){       
            e.printStackTrace();       
        }       
    } 

    public static int findPicture(String productName){
        for(int i = 0; i < pics.size(); i++){ 
            Pics product = (Pics)pics.elementAt(i); 
            if(product.getProductName().equals(productName)){ 
                return i; 
            } 
        } 
        return -1; 
    } 

    public static String getPicture(String productName){
        int idx = findPicture(productName);
        if(idx != -1){
            return ((Pics)pics.elementAt(idx)).getPic(); 
        } 
        return ""; 
    } 

    public static void removePicture(String productName){
        int idx = findPicture(productName);
        if(idx != -1){
            pics.removeElementAt(idx); 
        }    
    }    

    public static void setPicture(Pics pro){ 
        removePicture(pro.getProductName());
        pics.addElement(pro); 
    } 
}

您在没有
--i
--j
的情况下删除了
pics.removeElementAt
,因此跳过了下一个条目。尝试添加这些内容时,并没有改变输出。@JoopEggen:没有使用
--i
--j
,当找到匹配项时,循环应该使用
break
。@RemyLebeau yes也这么认为。您是否尝试在调试器中运行应用程序,以便准确地看到崩溃的原因?它在存储中的commit()上崩溃。savePicture();当我打印异常时,它会显示:无堆栈跟踪。但同样,只有在第一次加载时,
commit()
抛出的异常类型是什么?它被记录为引发
非持久性ObjectException
持久性ContentException
。我猜是前者,因为
Vector
没有实现
Persistable
接口,而
commit()
需要这个接口。您只能在
PersistentStore
中存储持久化对象。我收到一条消息:net.rim.device.api.system.NonPersistableObjectException但是为什么它在第一次崩溃后工作?看起来这只是在第一次加载时抛出的好吧,我在向量中保存了一个我自己创建的类,但没有在这些类中实现持久接口。我会这样试的。
public class Storage extends Application{ 

    private static final long PERSISTENT_KEY8 = 0x2c4c45c139ee9728L; 
    static PersistentObject store8 = null; 
    private static Vector pics = null; 

    static{
        store8 = PersistentStore.getPersistentObject(PERSISTENT_KEY8)
        pics = (Vector)store8.getContents(); 
        if(pics == null){ 
            pics = new Vector(); 
            store8.setContents(pics);
            store8.commit();
        } 
    }

    public static void savePicture(){
        try{
            synchronized(store8){ 
                store8.setContents(pics);  
                store8.commit(); 
            }
        }
        catch(Exception e){       
            e.printStackTrace();       
        }       
    } 

    public static int findPicture(String productName){
        for(int i = 0; i < pics.size(); i++){ 
            Pics product = (Pics)pics.elementAt(i); 
            if(product.getProductName().equals(productName)){ 
                return i; 
            } 
        } 
        return -1; 
    } 

    public static String getPicture(String productName){
        int idx = findPicture(productName);
        if(idx != -1){
            return ((Pics)pics.elementAt(idx)).getPic(); 
        } 
        return ""; 
    } 

    public static void removePicture(String productName){
        int idx = findPicture(productName);
        if(idx != -1){
            pics.removeElementAt(idx); 
        }    
    }    

    public static void setPicture(Pics pro){ 
        removePicture(pro.getProductName());
        pics.addElement(pro); 
    } 
}
public class ProductImage extends MainScreen implements FieldChangeListener, AppLaunchResource {       
    private ImageButtonField logo;       
    private ButtonField newImage, chooseExisting;       
    public static BitmapField takenPicture;       
    //public static String picPath ="";        
    private String currentPicture = "";       
    private String currentProduct = "";       

    public ProductImage(String productName){       
        super(VERTICAL_SCROLL|VERTICAL_SCROLLBAR);       
        currentProduct = productName;       
        createGUI();        
    }       

    public void createGUI(){       
        deleteAll();       
        setTitle(new LabelField("Add An Image", Field.FIELD_HCENTER));       
        Toolbar tb = new Toolbar();       
        if(ToolbarManager.isToolbarSupported()){       
            setToolbar(tb.createToolBar());       
        }       
        else{       
            add(tb.createNavBar());       
        }       

        newImage = new ButtonField("Take Photo", ButtonField.CONSUME_CLICK){       
            public int getPreferredWidth() {       
                return (int) Display.getWidth();       
            }       
        };       

        chooseExisting = new ButtonField("Change Image", ButtonField.CONSUME_CLICK){       
            public int getPreferredWidth() {       
                return (int) Display.getWidth();       
            }       
        };       

        newImage.setChangeListener(this);       
        chooseExisting.setChangeListener(this);       

        EncodedImage enc = EncodedImage.getEncodedImageResource("camera.png");       
        EncodedImage sizeEnc = ImageResizer.sizeImage(enc, Display.getHeight(), Display.getHeight());       

        takenPicture = new BitmapField(enc.getBitmap());       

        VerticalFieldManager vfMain = new VerticalFieldManager();       
        vfMain.add(new SeparatorField());       
        vfMain.add(newImage);       
        vfMain.add(chooseExisting);       
        vfMain.add(takenPicture);       
        add(vfMain);       

        currentPicture = Storage.getPicture(currentProduct);       
        showPicture();       
    }          

    public void choosePicture(){       
        String imageExtensions[] = {"jpg", "jpeg", "bmp", "png", "gif"};       

        FileSelectorPopupScreen fps = new FileSelectorPopupScreen(null, imageExtensions);       
        fps.pickFile();       
        String theFile = fps.getFile();       

        if (theFile == null){       
            Dialog.alert("Screen was dismissed. No file was selected.");       
            return;
        }       

        EncodedImage eImage = loadImage("file:///" + theFile);
        if(eImage != null){
            takenPicture.setBitmap(eImage.getBitmap());       
            Storage.setPicture(new Pics(currentProduct, path));       
            Storage.savePicture();       
            Dialog.alert("Picture Saved");       
        }       
    }       

    private EncodedImage loadImage(String path){
        try{       
            byte[] data = getData(path);       
            //Encode and Resize image        
            EncodedImage  eImage = EncodedImage.createEncodedImage(data,0,data.length);       

            int scaleFactorX, scaleFactorY;

            if(Display.getHeight()>Display.getWidth()){       
                scaleFactorX = Fixed32.div(Fixed32.toFP(eImage.getWidth()), Fixed32.toFP(Display.getWidth()));       
                scaleFactorY = Fixed32.div(Fixed32.toFP(eImage.getHeight()), Fixed32.toFP((Display.getWidth()*Display.getWidth())/Display.getHeight()));       
            }       
            else{       
                scaleFactorX = Fixed32.div(Fixed32.toFP(eImage.getWidth()), Fixed32.toFP(Display.getWidth()));       
                scaleFactorY = Fixed32.div(Fixed32.toFP(eImage.getHeight()), Fixed32.toFP(Display.getHeight()));       
            }       

            return eImage.scaleImage32(scaleFactorX, scaleFactorY);
        }
        catch (Exception e){
            return null;
        }
    }

    public void showPicture(){       
        if(currentPicture != ""){       
            EncodedImage eImage = loadImage(currentPicture);
            if (eImage != null){
                takenPicture.setBitmap(eImage.getBitmap());       
           }
        }       
    }       

    public void fieldChanged(Field field, int context){       
        if(field == logo){       
        }       
        else if(field == newImage){       
            takePicture();       
        }       
        else if(field == chooseExisting){       
            choosePicture();       
        }       
    }       
}