Bmob

Bmob创建应用的 AppId可以和我们本地的应用不同哦,包名都不需要写,但是退送服务必须填写包名MyUser user = BmobUser.getCurrentUser(this, MyUser.class);该方法只需用户登陆成功后(只要不卸载应用),从内存中得到User对象(包含objectId,username,password等等)增删改查 原理其实都是根据 id 改变的(和 Sqlite,设置Hibernate其实是一样的)所以做这些操作时候一定要保证 id不为NULL当一个用户的邮件被新添加或者修改过的话,emailVerified会被默认设为false,如果应用设置中开启了邮箱认证功能,Bmob会对用户填写的邮箱发送一个链接,这个链接可以把emailVerified设置为 true.email还没有验证成功的情况下,用户或者邮箱 也可以登录成功,仅仅emailVerified为false而已BmobQuery 查询单条数据使用 query.getObject(context, objectId, callback)BmobQuery 查询 多条数据使用 query.findObjects(this, new FindListener() { ....}User bmobUser = (User) User.getCurrentUser(this);抛出错误,不能转换看来本地缓存对象只保存了 BmobUser查询语句查询单条数据例子```BmobQueryquery = new BmobQuery();query.getObject(this, "b343b9d4f7", new GetListener() {            @Override            public void onFailure(int code, String reason) {                Toast.makeText(MainActivity.this, "code"+code +" "+reason, Toast.LENGTH_SHORT).show();            }            @Override            public void onSuccess(MyUser user) {                Toast.makeText(MainActivity.this, user.getUsername(), Toast.LENGTH_SHORT).show();            }        });#### 查询多条数据 > 例子BmobQueryquery = new BmobQuery();query.findObjects(this, new FindListener() {            @Override            public void onSuccess(Listlist) {                Toast.makeText(MainActivity.this, "得到的用户数是:"+list.size(), Toast.LENGTH_SHORT).show();            }            @Override            public void onError(int code, String msg) {                // TODO Auto-generated method stub                Toast.makeText(MainActivity.this, "code"+code +" "+msg, Toast.LENGTH_SHORT).show();            }        });> 注意 :query.getObject(this, "b343b9d4f7", new GetCallback() //查询单条query.findObjects(this, new FindCallback() {} //查询多条//这 两个回调函数什么也查不到,故不要使用官方说 应该在使用 自定义表名 的情况下使用上面两个方法(上面两个回调返回的参数是Json格式的,需要自己解析)## 更新用户信息1.需要用户先登录成功2. MyUser user = BmobUser.getCurrentUser(this,MyUser.class);3. 例子:MyUser myuser = BmobUser.getCurrentUser(this, MyUser.class);myuser.setNickName("稻草人2");myuser.setAddress("北京市");myuser.update(this, new UpdateListener() {            @Override            public void onSuccess() {                // TODO Auto-generated method stub                toast("更新用户信息成功");            }            @Override            public void onFailure(int arg0, String arg1) {                // TODO Auto-generated method stub            }        });## 登录功能只需要 开启邮箱验证,或者手机验证等等,那么MyUser user = new MyUser();user.setUsername("可填用户名或者邮箱号"); //开启邮箱验证的情况下user.setPassword("abc");user.setEmail("这里可填可不填");    user.login(this, new SaveListener() {        @Override        public void onSuccess() {            Toast.makeText(MainActivity.this, "登录成功", Toast.LENGTH_SHORT).show();                        }        @Override        public void onFailure(int arg0, String arg1) {            // TODO Auto-generated method stub            Toast.makeText(MainActivity.this, "登录失败:"+arg1, Toast.LENGTH_SHORT).show();        }    });## 重置密码(该方法直接发送更新密码的邮件,不需要登陆用户就可以使用)> 因为如果用户真的使用 xx邮箱注册过,那么他就可以直接登陆xx邮箱 修改 密码,这是安全的做法,请放心使用final String email = "xx@qq.com";BmobUser.resetPasswordByEmail(this, email, new ResetPasswordByEmailListener() {            @Override            public void onSuccess() {                // TODO Auto-generated method stub                Toast.makeText(MainActivity.this,"重置密码请求成功,请到" + email + "邮箱进行密码重置操作",Toast.LENGTH_SHORT).show();            }            @Override            public void onFailure(int arg0, String arg1) {                // TODO Auto-generated method stub            }        });## 等价关系>MyUser user = BmobUser.getCurrentUser(this, MyUser.class);user.setValue("age", "10000");//等价于 user.setAge("10000");// user.setAge(null);等价于 user.setValue("age",null); //测试对数据无效,故删除age字段数据使用`user.setAge(""); 或者 user.remove("age");`user.update(this);## 保存对象和数组的功能 (很强大)            MyUser user = BmobUser.getCurrentUser(this,MyUser.class);        Listhobbys = new ArrayList();        hobbys.add("阅读");        hobbys.add("篮球");        hobbys.add("唱歌");        user.setHobbys(hobbys);        BankCard bankCard = new BankCard();        bankCard.setTitle("中南银行");            user.setBankCard(bankCard); //等价user.setValue("bankCard",bankCard);        user.update(this);//查看云端 数据 发现 存储形式是:> hobbys(Array) ["阅读","篮球","唱歌"]> bankCard(Object) {"title":"中南银行"} 对象以 json格式存储>> 删除hobbys中的数据 //删除user用户的hobby属性中含有  阅读","唱歌","游泳的 字符串user.removeAll("hobby", Arrays.asList("阅读","唱歌","游泳"));//成功删除阅读,游泳(唱歌在云端原本不存在哦)user.update(this, new UpdateListener() {  .....}>> 说明数组 数据的添加 对于数组类型数据add addAll (在一个数组字段的后面添加一些指定的对象(包装在一个数组内)如 : user.add("hobbys","泡妞"); user.update(this);更新之后  云端数据是: ["篮球","唱歌","泡妞"]如 : user.addAll("hobbys", Arrays.asList("打架", "斗殴"));云端数据 : ["篮球","唱歌","泡妞","打架","斗殴"]当然了: 数组里面不仅可以放String类型,也可以放Object类型哦 如: user.add("hobbys",new XingQu("泡妞"));addUnique、addAllUnique(只会在原本数组字段中没有这些对象的情形下才会添加入数组,插入数组的位置随机)>删除数组数据 同理我们也可以使用removeAll从数组字段中移除某些值:Person p = new Person();p.removeAll("hobby", Arrays.asList("阅读","唱歌","游泳"));p.update(this, new UpdateListener() { .......}> 查询数组数据 BmobQueryquery = new BmobQuery();String [] hobby = {"阅读","唱歌"};query.addWhereContainsAll("hobby", Arrays.asList(hobby));query.findObjects(this, new FindListener() {  ...}## 分页查询 query.setLimit(10); // 限制最多10条数据结果作为一页query.setSkip(10); // 忽略前10条数据(即第一页数据结果)类似 mysql 的limit## 排序// 根据score字段升序显示数据query.order("score");// 根据score字段降序显示数据query.order("-score");// 多个排序字段可以用(,)号分隔query.order("-score,createdAt");说明:多个字段排序时,先按第一个字段进行排序,再按第二个字段进行排序,依次进行。## 批量操作注意:1.任何一种批量操作每次只支持最大50条记录的操作。2.批量操作不支持对User表的操作。new BmobObject().insertBatchnew BmobObject().updateBatchnew BmobObject().deleteBatch批量上传Bmob.uploadBatch(context, filePaths, new UploadBatchListener() {BmobProFile.getInstance(context).uploadBatch(files, new UploadBatchListener() {....}## 关联关系## 问题:关联关系映射## 问题代码 (下面成功创建两张表,且创建了关联关系,但是 user.setDepartment(department);失败,因为本地对象还没有赋值objectId)结果:    User表objectId        name          department Pointer8cb0fd1660      "经理部"          null错误代码如下Department department = new Department();department.setName("网购部门");        department.save(this);        User user = new User();        user.setName("王立");        user.setAge("20");        user.setDepartment(department);        user.save(this);```注:include的查询对象只能为BmobPointer类型,而不能是BmobRelation类型。 一对一知道一个Department depart,查询该 depar下所有的User(User方设置外键 )Bmob的做法:Department depart = findDepartmentById(d9330d061c);BmobQueryquery = new BmobQuery();query.addWhereEqualTo("depart",depart); //query.include("depart"); //查询得到的Users里面含有 depart(外键属性)query.findObjects(this,new FindListener(){.......} );总结: 上面的方式就如同Hibernate中 Department表Setusers = new HashSetusers();Department depart = findDepartmentById(d9330d061c);depart.getUsers();一对多查询评论(很像上面查询 用户)//Conmment评论 ,Post帖子,User用户Post post = findDepartmentById(1ffegca); //这个对象只需要 objectId即可BmobQueryquery = new BmobQuery();query.addWhereEqualTo("post",new BmobPointer(post));//希望同时查询该评论的发布者的信息,以及该帖子的作者的信息,这里用到上面include的并列对象查询和 内嵌对象的查询query.include("user,post.author");query.findObjects(this, new FindListener(){....}知道了一个User user,查询 该User对应的DepartmentUser user = findById(0ffg034);BmobQueryquery = new BmobQuery();query.include("depart");query.getObject(); //query.findObjects(); 和 [知道一个Department depart,查询该 depar下所有的User]用法完全一样,仅仅addWhereEqualTo不一样而已啦多对多关系一个帖子可以被很多用户所喜欢,一个用户也可能会喜欢很多帖子,那么可以使用Relation类型来表示这种多对多关联关系。Relation本质上可以理解为其存储的是一个对象,而这个对象中存储的是多个指向其它记录的指针。(中间关系表 )内部查询 (非常类似于 mysql中的 子查询)如: 查询带有图片的帖子的评论列表:(mysql的做法是 1.先查询所有带图片的帖子2.从这些帖子里面查询所有评论)BmobQueryquery = new BmobQuery();BmobQueryinnerQuery = new BmobQuery();innerQuery.addWhereExists("image", true);// 第一个参数为评论表中的帖子字段名post(我理解为外键名)// 第二个参数为Post字段的表名,也可以直接用"Post"字符串的形式(我理解为One方的表名)// 第三个参数为内部查询条件query.addWhereMatchesQuery("post", "Post", innerQuery);//反之,不想匹配某个子查询,你可以使用addWhereDoesNotMatchQuery方法(查询不带图片的帖子的评论列表)query.findObjects(this, new FindListener() {@Overridepublic void onSuccess(Listobject) {// TODO Auto-generated method stubtoast("查询成功:");}@Overridepublic void onError(int code, String msg) {// TODO Auto-generated method stubtoast("查询失败:"+msg);}});内部查询实例2:BmobQueryuserQuery = new BmobQuery();BmobQueryinnerQuery = new BmobQuery();innerQuery.addWhereEqualTo("name", "经理部");        userQuery.addWhereMatchesQuery("department", "Department", innerQuery);        userQuery.findObjects(this, new FindListener() {            @Override            public void onSuccess(Listarg0) {

Toast.makeText(MainActivity.this, "查询成功"+arg0.size(), Toast.LENGTH_SHORT).show();

}

@Override

public void onError(int arg0, String arg1) {

// TODO Auto-generated method stub

Toast.makeText(MainActivity.this, "查询失败", Toast.LENGTH_SHORT).show();

}

});

文件上传操作

文件上传操作:

先上传文件,上传成功后,像普通对象一样,

再进行数据的添加操作。

insertObject(new MyUser("wangli",bmobFile)); //

注意: MyUser表结构是 String | BmobFile类型

BmobFile icon = bmobFile.getIcon();

icon.loadImage(TestFileActivity.this, iv_icon);// iv_icon是ImageView

BmobFile icon = bmobFile.getIcon();

icon.loadImageThumbnail(TestFileActivity.this, iv_icon, 100, 100, 100); //iv_icon是ImageView

文件操作详解

旧版 BmobFile 文件下载的具体代码实现需要大家自行实现

新版 BmobProFile文件下载已经实现

虽然新版上传下载更好,但是 云端字段最好还是设置成 BmobFile类型的;

如 User表 name(String) icon(BmobFile)

新版: 文件的单一上传、批量上传、文件下载、生成缩略图等功能

单一上传 BmobProFile.getInstance(context).upload(filePath, new UploadListener() {

@Override

public void onSuccess(String fileName,String url,BmobFile file) {

Log.i("bmob","文件上传成功:"+fileName+",可访问的文件地址:"+file.getUrl());

// TODO Auto-generated method stub

// fileName :文件名(带后缀),这个文件名是唯一的,开发者需要记录下该文件名,方便后续下载或者进行缩略图的处理

// url :文件地址

// file :BmobFile文件类型,V3.4.1版本开始提供,用于兼容新旧文件服务。

注:若上传的是图片,url地址并不能直接在浏览器查看(会出现404错误),需要经过URL签名得到真正的可访问的URL地址,当然,V3.4.1的版本可直接从'file.getUrl()'中获得可访问的文件地址。

}

}

批量上传 :BmobProFile.getInstance(context).uploadBatch(files, new UploadBatchListener() {}

文件下载: BmobProFile.getInstance(context).download(fileName, new DownloadListener() {}//这个filename参数是 使用BmobProFile上传成功的 fileName,自行保存

获取文件地址: BmobProFile.getInstance(context).getAccessURL(fileName, new GetAccessUrlListener() {} //fileName也是 BmobProFile上传成功的fileName

文件删除:BmobProFile.getInstance(context).deleteFile(fileName, new DeleteFileListener() {}//fileName也是 BmobProFile上传成功的fileName

缓存目录:(里面存储了BmobProFile下载下来的文件)

1.可以自定义缓存目录名称,可在Apllication中对其进行初始化配置(下载文件前调用哦)

BmobConfiguration config = new BmobConfiguration.Builder(context).customExternalCacheDir("目录名").build();

BmobPro.getInstance(context).initConfig(config);

2.注:

1)、缓存总目录下,包含上面两个分目录,分别用于保存下载文件和缩略图(这个缩略图我们都不需要,自己写算了)。

2)、因为Android手机系统的高定制度和复杂性,此方法只允许定义缓存目录的名称,并不支持自定义缓存路径,缓存路径由SDK根据手机系统进行分配。

3.获取各分目录的完整路径:

通过如下方法可获取保存下载文件的完整路径:

//可自行打印此路径,通过文件管理器查看文件是否下载成功

BmobPro.getInstance(context).getCacheDownloadDir()

4、获取缓存大小:

//文件大小(单位:字节)

String cacheSize = String.valueOf(BmobPro.getInstance(context).getCacheFileSize());

//对文件大小进行格式化,转化为'B'、'K'、'M'、'G'等单位

String formatSize = BmobPro.getInstance(context).getCacheFormatSize();

5.清除缓存:

BmobPro.getInstance(context).clearCache();

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,607评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,047评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,496评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,405评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,400评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,479评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,883评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,535评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,743评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,544评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,612评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,309评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,881评论 3 306
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,891评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,136评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,783评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,316评论 2 342

推荐阅读更多精彩内容

  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,556评论 18 399
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,579评论 18 139
  • ¥开启¥ 【iAPP实现进入界面执行逐一显】 〖2017-08-25 15:22:14〗 《//首先开一个线程,因...
    小菜c阅读 6,344评论 0 17
  • 我没从想过,一个人是有怎样的丹青妙手,轻轻挥洒一笔便点染出最动人的良辰美景。更没想过,一个人会因为一首诗“孤篇横绝...
    而川文艺阅读 361评论 0 0
  • 下午把两个月没见面的小朋友带回家,早差不多坐10个小时的车才能到,还是各种转车。也许是因为路途遥远,或者是一下...
    我是dolly阅读 135评论 0 0