课设终于做完了,总结一下这个过程中遇到的问题。
Bmob的上传、下载文件。
说实话,Bmob的开发文档实在是坑,就写了点最简单的用法,而且当时去网上找资料也是找了好久,没几篇能看的,最后我也不知道怎么的就把上传、下载搞好了。。。现在来总结一下:
我这个方法的目的是给Bmob数据库内的User表的某一个用户设置对应头像。
先上代码:
private void uploadPic() {
final String imagePath = getExternalCacheDir()+ "/output_image.ipg";
final BmobFile icon = new BmobFile(new File(imagePath));
icon.uploadblock(new UploadFileListener() {
@Override
public void done(BmobException e) {
if (e == null){
Log.w(TAG, "上传成功。。。。。。。。。。。。。。。");
iconStringUrl = icon.getFileUrl();
User user = new User();
BmobQuery query = new BmobQuery();
query.addWhereEqualTo("UserName", name);
query.findObjects(new FindListener() {
@Override
public void done(List list, BmobException e) {
if (e == null){
for (User user1 : list){
objectId = user1.getObjectId();
Log.w(TAG, "获取id成功"+objectId);
}
User user2 = new User();
user2.setIcon(icon);
user2.update(objectId, new UpdateListener() {
@Override
public void done(BmobException e) {
if (e == null){
Toast.makeText(MainActivity.this, "信息更新成功", Toast.LENGTH_SHORT).show();
}else {
Log.w(TAG, "失败"+e.getErrorCode());
}
}
});
}else {
Log.w(TAG, "获取id失败"+e.getErrorCode());
}
}
});
try{
iconUrl = new URL(iconStringUrl);
} catch (IOException e1){
e1.printStackTrace();
}
}else {
Log.w(TAG, "上传失败。。。。。。。。。。。。。"+e.getErrorCode());
}
}
});
}
来解释一下:
String imagePath 是我要上传照片的本地存储路径,getExternalCacheDir()是获得当前应用的缓存目录,使用这个目录可以不用申请SD卡访问权限,”/output_image.ipg”表示在缓存目录下的 output_image.jpg 这个图片文件,记得一定要加上“/”,否则这个路径为空。
final BmobFile icon = new BmobFile(new File(imagePath)); Bmob的文件时以file形式存在的,所有我们得以file形式上传,怎么变成file形式上传呢,就是上面那行代码。固定格式吧,记住就好。
有了BmobFile后,接下来就可以将它上传了。
icon.uploadblock(new UploadFileListener() {
@Override
public void done(BmobException e) {}
这就是上传的固定格式。我们可以在done内进行是否上传成功的判断,就是第一个if、else,如果成功,那么e==null,否则,让e打印错误代码,去官网查看错误代码详情。
接下来,如果上传成功:iconStringUrl = icon.getFileUrl(); iconStringUrl是一个string字符串,用来保存icon上传成功后的url地址(如果要下载,必须要此地址,不下载可以不获取),而 icon.getFileUrl() 则是Bmob提供的获取当前上传文件url地址的方法。
其实到现在就已经上传成功了,只不过我们需要把这个文件和用户名对应起来,所以我们需要将其更新到User表内,使之填入当前用户的头像那一列。所以现在开始更新?不,Bmob很蛋疼的一点是得根据ObjectId来更新对应行(我不知道有没有其他方法了。。。),所以在更新前我们需要获取当前user的name,根据这个name去查他的ObjectId,然后根据这个ObjectId来进行更新。
然后查询ObjectId我就不解释了,基本用法而已。
最后更新:
User user2 = new User();
user2.setIcon(icon);
user2.update(objectId, new UpdateListener() {
@Override
public void done(BmobException e) {
if (e == null){
Toast.makeText(MainActivity.this, “信息更新成功”, Toast.LENGTH_SHORT).show();
}else {
Log.w(TAG, “失败”+e.getErrorCode());
}
}
});
当弹出toast的时候说明更新成功,头像文件和我们当前用户对应起来了。现在看起来还是挺简单的,可当时确实很棘手。。。很烦躁。。。而且头很铁,搞了一个下午,就是把它硬搞出来。。。
然后是从Bmob下载:
还是先上代码:
private void refreshSeasonalFoodList(){
BmobQuery query = new BmobQuery<>();
query.addWhereNotEqualTo("SeasonalName", "空");
query.findObjects(new FindListener() {
@Override
public void done(List list, BmobException e) {
if (e == null) {
Log.w(TAG, "查表成功");
for (TableSeasonalFood tabFood : list) {
titles[ListSize] = tabFood.getTitle();
describes[ListSize] = tabFood.getDescribe();
objectId[ListSize] = tabFood.getObjectId();
BmobFile file = tabFood.getImage();
imageUrl[ListSize] = file.getFileUrl();
Log.w(TAG, titles[ListSize]);
Log.w(TAG, describes[ListSize]);
Log.w(TAG, objectId[ListSize]);
Log.w(TAG, imageUrl[ListSize]);
ListSize++;
File image = new File(getContext().getExternalCacheDir(), tabFood.getObjectId()+".PNG");
String path = getContext().getExternalCacheDir()+"/"+tabFood.getObjectId()+".PNG";
Log.w(TAG, path);
if (image.exists()){
Log.w(TAG, "exists"+ ListSize);
Bitmap exitsBitmap = convertToBitmap(path, 250, 200);
bitmaps[ListSize-1] = exitsBitmap;
}else {
try{
image.createNewFile();
url = new URL(imageUrl[ListSize-1]);
}catch (IOException e2){
e2.printStackTrace();
}
//开始下载
downloadPic(url, image);
}
}
}else {
Log.w(TAG, "查询时令错误:"+e.getErrorCode());
}
for (int i = 0; i < ListSize; i++){
Log.w(TAG, "开始加载数据");
SeasonalOne seasonalOne =new SeasonalOne();
seasonalOne.setTitle(titles[i]);
seasonalOne.setDescribe(describes[i]);
seasonalOne.setBitmap(bitmaps[i]);
seasonalOnes.add(seasonalOne);
}
adapter = new MySeasonalListAdapter(seasonalOnes, getContext());
mListView.setAdapter(adapter);
mFreshVIew.setRefreshing(false);
}
});
}
大致说一下吧。。。
query.addWhereNotEqualTo(“SeasonalName”, “空”); 因为bmob没有直接查询全部的数据方法,所以我在表内加了一行SeasonalName 为 “空”的行,查询所有该列不为“空”的数据,即查询了该表的全部数据(这是一波很有灵性的查表)。
查询成功,遍历该表内数据,并把之存放于数组内,最重要的是这两行:
BmobFile file = tabFood.getImage();
imageUrl[ListSize] = file.getFileUrl();
这里的文件列名是 Image,需要用BmobFile类型来接收,然后再获取它的url。
获取到url后就好办了,我先进行判断该文件是否存在,如果存在就将图片转换成Bitmap形式,否则下载(下载需要URL,所以我把URL作为参数传给了下载函数)。
大致的方法就是这样,一些具体的怎么通过URL下载文件,怎么转换为bitmap等自己查资料把。。。