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