我使用以下代码将ParseObject与ParseFile一起存储。我在Application子类中启用了Parse本地数据存储区。当应用程序连接到Internet时,此代码在本地数据存储区和解析服务器中存储ParseObject的实例。
final ParseFile file = new ParseFile(position + ".mp4", data);
file.saveInBackground(new SaveCallback() {
@Override
public void done(ParseException e) {
ParseObject po = new ParseObject("Recordings");
po.put("code", position);
po.put("name", myname);
po.put("file", file);
po.saveEventually();
}
});
当应用未连接到互联网时,相同的代码会抛出以下异常。 java.lang.IllegalStateException:无法编码未保存的ParseFile。应用程序崩溃了。对象未存储在本地数据存储中。
那么在没有互联网的情况下,如何在解析本地数据存储区时将ParseFile与ParseFile一起存储?
答案 0 :(得分:7)
我通过简单地用ParseObject存储文件的字节来解决这个问题。当我需要我的文件时,我将这些字节写回文件。
我的要求是在分析中存储带有名字的录音文件。 我按照以下步骤操作: 1.获取文件的字节数组 2.将字节数组放入ParseObject 3.调用ParseObject#saveEventually()
代码:
File file = new File(filePath);
FileInputStream fis = null;
try {
fis = new FileInputStream(file);
byte data[] = new byte[(int) file.length()];
fis.read(data);
ParseObject obj = new ParseObject("Recordings");
obj.put("name", name);
obj.put("data", data);
obj.saveEventually();
} catch (IOException e) {
e.printStackTrace();
}
答案 1 :(得分:1)
我真的很喜欢ashokgujju的解决方案。在我的情况下,我想在离线模式下从Android设备保存图片,所以这就是我发生的事情:
1.-只有通过这样做(ashokgujju'解决方案)才会在你的解析表中添加一个文件,正如SAndroidD指出的那样,如果你想要,你可以使用一个aftersave Parse Cloud函数,就像这样:
Parse.Cloud.afterSave("Recordings_or_WhatEverYourTableIs", function(request){
bytes = request.object.get("data"); //"data" is the name given by ashokgujju at "obj.put("data", data);"
if(bytes){
var file = new Parse.File("myFile.png", bytes); //png or whatever you want
file.save().then(function(success){
request.object.set("record_or_MyColumnWithParseFile", file);
request.object.unset("data"); //optional, if you are not going to use this data, it has no meaning keep it there anymore and you will save some space
request.object.save();
},function(error){
//error
});
}
}
这就像一个魅力!但...
2.-但仅限于缩略图,我的意思是,一张非常小的图片,一旦我想用大图片做同样的事情,我就面对这个:
com.parse.ParseRequest$ParseRequestException: The object is too large -- should be less than 128 kB
我花了一段时间才意识到这一点,因为没有出现任何错误,就像SAndroidD所说的那样。我不得不添加一个回调来保存以便查看它。
File file = new File(filePath);
FileInputStream fis = null;
try {
fis = new FileInputStream(file);
byte data[] = new byte[(int) file.length()];
fis.read(data);
ParseObject obj = new ParseObject("Recordings");
obj.put("name", name);
obj.put("data", data);
obj.saveEventually(new SaveCallback() {
@Override
public void done(ParseException e) {
Log.i(MyClass.logName," is it everything ok boy? "+e);
}
});
} catch (IOException e) {
e.printStackTrace();
}
原来如此!总结一下:ashokgujju的酷解决方法加上我的afterSave功能会将所有parseFile保存在离线模式下,只要文件本身不是那么大。
答案 2 :(得分:0)
我找到了这个问题的解决方案
ckeckout此代码
File file = new File(imagePath);
FileInputStream fis = null;
try {
fis = new FileInputStream(file);
byte data[] = new byte[(int) file.length()];
fis.read(data);
final ParseFile f=new ParseFile("img", data);
f.saveInBackground(new SaveCallback() {
@Override
public void done(ParseException arg0) {
//if (arg0.equals(null)) {
ParseObject oImg=new ParseObject("Image");
oImg.put("img", f);
oImg.put("name", edtUN.getText().toString());
oImg.saveEventually(new SaveCallback() {
@Override
public void done(ParseException arg1) {
System.out
.println("img save...");
}
});
//}
}
}, new ProgressCallback() {
@Override
public void done(Integer arg0) {
//display img upload progress
}
});
然后当net打开并打开时,然后写入第一个活动的onResume()方法
ParseQuery<ParseObject> queryImg = ParseQuery.getQuery("Image");
queryImg.fromPin(ApplicationParse.TODO_GROUP_NAME);
queryImg.whereEqualTo("isDraft", true);
queryImg.findInBackground(new FindCallback<ParseObject>() {
@Override
public void done(List<ParseObject> todos, ParseException e) {
if (e == null) {
for (final ParseObject todo : todos) {
// Set is draft flag to false before syncing to Parse
// todo.setDraft(false);
todo.saveInBackground(new SaveCallback() {
@Override
public void done(ParseException e) {
//if (e == null) {
// Let adapter know to update view
if (!isFinishing()) {
//refresh list data
System.out.println("Image DATA is saved ..... ");
}
}
});
}
} else {
Log.i("MainActivity","syncTodosToParse: Error finding pinned todos: "+ e.getMessage() );
e.printStackTrace();
}
}
});