2012-05-18 2 views
0

사용자가 히스토리 목록에서 특정 제품을 선택할 때 이미지를 표시하기 위해 영구 저장소에 이미지의 경로를 저장하려고합니다 (제품 당 하나의 이미지, 사용자). 이제 내가 겪고있는 문제는 처음 앱을 휴대 전화에로드하고 영구 저장소에 항목을 추가하려고하면 잠시 후에 오류가 발생하고 앱이 정지됩니다. 그러나 다시 돌아와 이미지를 다시 추가하면 각 특정 제품을 선택할 때 이미지가 항상로드됩니다.BlackBerry 6의 영구 저장소 버그에 데이터 저장

이것은 내가 무슨 일이 있어도 예외를 throw하는 최초의 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); 
} 
} 

그래서 그 이미지를 저장 내 메소드를 포함하는 클래스입니다 : 여기 내 코드입니다. 이제 다른 클래스의 어디를 조작하고있다 :이 클래스의 많은 부분이 긴 경우 유감을 제거

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(); 
    this.setTitle(new LabelField("Add An Image", Field.FIELD_HCENTER)); 
    if(ToolbarManager.isToolbarSupported()) 
    { 
     Toolbar tb = new Toolbar(); 
     setToolbar(tb.createToolBar()); 
    } 
    else{ 
     Toolbar tb = new Toolbar(); 
     add(tb.createNavBar()); 
    } 

    try{ 
     Storage.loadPicture(); 
    }catch(NullPointerException e){ 
     e.printStackTrace(); 
    } 


    newImage = new ButtonField("Take Photo", ButtonField.CONSUME_CLICK){ 
     public int getPreferredWidth() { 
      return (int) (net.rim.device.api.system.Display.getWidth()); 
     } 
    }; 
    chooseExisting= new ButtonField("Change Image", ButtonField.CONSUME_CLICK){ 
     public int getPreferredWidth() { 
      return (int) (net.rim.device.api.system.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(); 
    UiApplication.getUiApplication().pushScreen(fps); 

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

      String path= "file:///" + theFile; 
      byte[] data = getData(path); 
      //Encode and Resize image 
      EncodedImage eImage = EncodedImage.createEncodedImage(data,0,data.length); 

      if(Display.getHeight()>Display.getWidth()){ 
       int scaleFactorX = Fixed32.div(Fixed32.toFP(eImage.getWidth()), 
        Fixed32.toFP(Display.getWidth())); 
       int scaleFactorY = Fixed32.div(Fixed32.toFP(eImage.getHeight()), 
        Fixed32.toFP((Display.getWidth()*Display.getWidth())/Display.getHeight())); 
       eImage=eImage.scaleImage32(scaleFactorX, scaleFactorY); 
      } 
      else{ 
       int scaleFactorX = Fixed32.div(Fixed32.toFP(eImage.getWidth()), 
         Fixed32.toFP(Display.getWidth())); 
        int scaleFactorY = Fixed32.div(Fixed32.toFP(eImage.getHeight()), 
         Fixed32.toFP(Display.getHeight())); 
        eImage=eImage.scaleImage32(scaleFactorX, scaleFactorY); 
      } 
      UiApplication.getUiApplication().popScreen(fps); 
      takenPicture.setBitmap(eImage.getBitmap()); 

      Storage.setPicture(new Pics(currentProduct, path)); 

      try{ 
       Storage.savePicture(); 
      }catch(Exception e){ 
       e.printStackTrace(); 
      } 

     } 
     catch(Exception e){ 

     }  
     Dialog.alert("Picture Saved"); 
    } 

} 
public void showPicture(){ 
    if(currentPicture != ""){ 
     try{ 

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

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





      takenPicture.setBitmap(eImage.getBitmap()); 

     } 
     catch(Exception e){ 

     } 
    } 
} 

public void fieldChanged(Field field, int context) { 

    if(field == logo){ 

    } 
    else if(field == newImage){ 
     takePicture(); 
    } 
    else if(field == chooseExisting){ 
     choosePicture(); 
    } 
} 

} 

, 거기에 기본적으로있는 4 보관 방법이 코드에서 호출 나는 그들이 모든 믿는 바로 장소 ..하지만 다시 첫 번째 하중에 문제가있는, 나중에 없습니다.

아무도 내가 여기서 잘못하고있는 것을 볼 수 있습니까? 1 주일 동안이 문제가 발생했습니다.

도움을 주셔서 감사합니다! 이 같은

+0

'--i' 또는'--j'없이'pics.removeElementAt'를하면 다음 항목을 건너 뜁니다. –

+0

이들을 추가하려고 시도했지만 출력을 변경하지 않았습니다. –

+1

@JoopEggen :'--i' 또는'--j'를 사용하는 대신, 루프는 일치하는 것이 발견되었을 때 대신'break'를 사용해야합니다. –

답변

1

시도 뭔가 :

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();  
     }  
    }  
}  
+0

여전히 운이 없다 : (처음로드시 충돌하지만 이후에 작동 함) –

+0

디버거에서 앱을 실행하여 충돌이 정확히 볼 수 있도록 시도 했습니까? –

+0

Storage.savePicture()의 commit()에서 충돌합니다. 하지만 Stack Trace가 없다는 예외를 출력한다. 그러나 처음로드시에만 다시 호출한다. –