对象

Q: 为什么我修改表中的某个Number类型的字段,其他Number类型的都变为0呢?

A: 继承自BmobObject的类不要用int类型,用Integer。


Q: 定义类名必须和表中的名一致?

A: 类名和表名一致,表内字段名和类变量名一致。


Q: 插入一条数据之后怎么获得该数据的id

A:

  1. GameScore gameScore = new GameScore();
  2. //注意:不能调用gameScore.setObjectId("")方法
  3. gameScore.setPlayerName("比目");
  4. gameScore.setScore(89);
  5. gameScore.setIsPay(false);
  6. gameScore.save(mContext, new SaveListener() {
  7. @Override
  8. public void onSuccess() {
  9. toast("添加数据成功,返回objectId为:"+gameScore.getObjectId() + ”,数据在服务端的创建时间为:“ + gameScore.getCreatedAt());
  10. }
  11. @Override
  12. public void onFailure(int code, String arg0) {
  13. // 添加失败
  14. }
  15. });

请看代码,成功后gameScore使用getObjectId()就可以获取objectId了。


Q: success方法中获取的数据,用全局变量接收,但是在方法外就接受不到,变量为空

A: 请先理解同步和异步的概念,回调中的onsuccess是异步方法,是不能用全局变量接收的,可以直接在onsuccess方法中做ui层面的更新


Q: 缓存路径能指定吗?

A: 不可以


Q: 我在User表中增加了一个Number类型的字段,设置为以1自增,但几天过去了,里面的值并未自动增加,这个自增是怎样自增的,还要去哪里设置吗?

A: 添加字段的时候选择num类型,有一个自增的checkbox和初始值的input,填一下就可以了


Q: 场景是多个客户端共同操作同一个数据表,更新该表的一个字段的值,如何做到一个客户端更新时锁定该数据表,操作结束时解锁?

A: 目前没有该功能,只有Number类型可以使用原子计算器达到该效果


Q: 一次查询多条数据 算是调用了几次API?

A: 一次调用算一次


Q: 请问每条数据的objectId都是唯一的吗,我的意思是,假设有个user表,有userName和level两个属性。如果两个对象的这两个属性都相同,其objectId是否就相同?

A: objectId是每一条数据的唯一标示,不会出现重复的。


Q: String 数据类型最大可支持多大数据?

A: 最大为16M


Q: 求问怎么获取上传数据后生成的objectid

A: 保存数据成功后,你的BmobObject对象就有objectId了的。
或者你按条件查询得到的数据对象中也是包含objectId的。


Q: 数据查询必须要objectId吗?在用户数据表中,在无法获取用户objectId的情况下,如何查询一个用户是否存在,是否可以通过其他字段查询?

A: 单条查询必须使用ObjectId,多条查询时可以添加条件来进行查询。


查询

Q: 查询成功,但是list只能在onSuccess方法中使用,如何在本类中的其他地方使用?

A: 网路请求都是异步独立线程的,你用handler把数据传递出来就可以。


Q: 如果不知道objectId,是否可以通过表中的元素获得数据?

A:添加数据的时候,onSuccess中可以得到objectId。也可以通过条件查询得到对应的objectId的。


Q: 在Activity关闭的时候如何动态关闭查询?

A: 查询都是一次性的,并不需要取消


Q: bmob怎么查询一列数据并合并相同数据?

A: 可以使用统计查询中的groupby


Q: bmob的数据库操作方法save insert这些都有开线程吗

A: bmob sdk提供的操作都是在线程中运行的,对外都是提供异步的回调方法,其回调方法,比如onsuccess和onFailure等是可以再UI线程中运行的,开发者不需要额外再开线程。


Q: Bmob查询数据结束标志

A: 在查询的回调方法中的onSuccess或onFailure触发时都是代表这个查询结束。


Q: Bmob能否进行多表查询?

A: 无法用一条语句查多张表,只能单独一个一个查


Q: 怎么设置缓存 让缓存数据在listView显示

A: 可以使用缓存查询,具体可以查看官方文档


Q: 怎么通过BmobUser的一个属性列来获取其他列的信息

A: 使用bmob的查询功能,查询Username 等于名称的用户信息即可,使用的是addWhereEqualTo方法


Q: 我的应用想只查询最新上传的一组数据,请问该如何操作呢

A: 可以根据时间来设置条件,再进行查询


Q: 查询中findListener中的onerror方法不执行,两次测试均是数据库无该数据的,但是程序均不执行onerror方法

A: 没有数据不代表查询出错,当没有数据符合你的查询条件时,就会返回空,此时还是执行onSuccess的


Q: 想问问查询的时候排序有多个关键字怎么解决?

A: 数据服务的文档中有的,在开发文档的查询数据->查询条件->排序那里:

排序

对应数据的排序,如数字或字符串,你可以使用升序或降序的方式来控制查询数据的结果顺序:

// 根据score字段升序显示数据
query.order(“score”);
// 根据score字段降序显示数据
query.order(“-score”);
// 多个排序字段可以用(,)号分隔
query.order(“-score,createdAt”);
说明:多个字段排序时,先按第一个字段进行排序,再按第二个字段进行排序,依次进行。


数据关联

Q: 我有个Relation字段,想用它来记录喜欢这篇文章的用户,我该怎么添加里面的数据呢?

A: 这个问题请看 数据关联 相关文档。


Q: Relation字段 能否像pointer一样在查询的时候一并把关联的记录也查询下来,不需要二次查询

A: 目前并没有这个功能,建议使用pointer


Q: activity是一个表,里面有一个BmobPointer org指向BmobUser,activity.getOrg.getObjectId总是为空呢?

A: 查询的时候应该没有用includ查询进去


Q: 查询数据时,表中的一个字段是pointer字段,如何将这个pointer字段的一个属性作为查询匹配条件?

A:

  1. BmobQuery<Comment> query = new BmobQuery<Comment>();
  2. BmobQuery<Post> innerQuery = new BmobQuery<Post>();
  3. innerQuery.addWhereExists("image", true);
  4. // 第一个参数为评论表中的帖子字段名post
  5. // 第二个参数为Post字段的表名,也可以直接用"Post"字符串的形式
  6. // 第三个参数为内部查询条件
  7. query.addWhereMatchesQuery("post", "Post", innerQuery);
  8. query.findObjects(this, new FindListener<Comment>() {
  9. @Override
  10. public void onSuccess(List<Comment> object) {
  11. // TODO Auto-generated method stub
  12. toast("查询成功:");
  13. }
  14. @Override
  15. public void onError(int code, String msg) {
  16. // TODO Auto-generated method stub
  17. toast("查询失败:"+msg);
  18. }
  19. });

如上,就是使用内部查询就可以实现你的需求了,只需要将查询条件和表名换成你需要的就可以了~


Q: 如果一个用户要收藏一个产品应该怎么定义对象

A: 可以使用pointer类型


Q: 删除关联关系

我现在有评论类如下:

  1. public class Comment extends BmobObject {
  2. private String comment;
  3. private Found found;
  4. private Lost lost;
  5. private MyUser user;
  6. }

如果我想删除Lost类或者Found类的某条数据

其对应的Comment会被同时删除吗?

如果不能应该怎么实现同时删除?

A: 不能同时删除,对于不同数据表的数据只能分别执行删除操作。


Q: 查询时 include 两个Pointer字段后会把前一个的数据冲掉
对表 AaaaEntity 查询时 include 两个Pointer字段后会把前一个的数据冲掉,如:

  1. bmobQuery.include("userAuthor");
  2. bmobQuery.include("xxxxEntity");
  3. 则:
  4. aaaaEntity.getUserAuthor.getName()返回空
  5. 如果去掉后一行
  6. bmobQuery.include("userAuthor");
  7. //bmobQuery.include("xxxxEntity");
  8. 移到后面:
  9. bmobQuery.include("xxxxEntity");
  10. bmobQuery.include("userAuthor");
  11. aaaaEntity.getUserAuthor.getName() 就能正常返回值

A: include的用法在文档里面已经说明了的(http://docs.bmob.cn/android/de … clude用法),想include多个就这样用:query.include(“x1,x2”);


用户管理

Q: 打开了邮箱验证功能,注册成功后未验证也能登录成功?

A: Bmob SDK中,邮箱的验证和用户的注册登录是异步的关系,也就是说,即使用户没有点击邮箱验证功能,也是一样可以登录成功的。如果需要限制用户的登录或者只能查看到登录后的部分功能,可以使用BmobUser.getEmailVerified


Q: Bmob如何实现用户登录之后获取数据读写权限,以及如何实现登出操作的?

A: 用户登录之后,我们会把获取到的用户信息保存在本地文件中,你可以通过BmobUser.getCurrentUser方法获取对应的值,当调用 logout方法之后,这些缓存的数据就会清除。如果不调用logout方法,下次重新打开这个应用,还是可以通过BmobUser.getCurrentUser方法获得上次登陆的用户信息,从而判断是否登陆过。


Q: BmobUser.logOut(getApplicationContext()); //清除缓存用户对象
这个只是针对本地缓存,看了源码,只是对本地清除,没有真正向服务端注销登录的账号,请问是怎么去处理这个问题

A: BmobSDK中的BmobUser登录,只是登录成功后缓存用户信息到本地。服务端并没有记录用户的登录状态,所以退出登录并不需要向服务器注销。


Q: Bmob支持第三方登录吗?怎么做?

A: 支持,官方的文档上有介绍。


Q: 为什么邮箱验证还没去验证却可以登录

A: 是可以的,邮箱验证那个字段需要开发者根据需求自行决定要不要使用


Q: 登录时异常退出MyUser declares multiple JSON fields named mobilePhoneNumber

A: MyUser定义了一个Bmob的系统字段呀,你可以看看用户管理那里的文档,里面有介绍说明BmobUser的特有属性,以下摘抄自文档:

BmobUser除了从BmobObject继承的属性外,还有几个特定的属性:

username: 用户的用户名(必需)。

password: 用户的密码(必需)。

email: 用户的电子邮件地址(可选)。

emailVerified:邮箱认证状态(可选)。

mobilePhoneNumber:手机号码(可选)。

mobilePhoneNumberVerified:手机号码的认证状态(可选)。


Q: 第三方登录之后该怎么获得User的objectId呢?

A: 登陆成功之后,系统就会给你生成一个objectId的,你正常的通过 user.getObjectId() 就可以得到了


Q: 如何修改user表中其他用户的数据

A: 直接在web控制台修改或者使用masterkey


Q: 修改数据提示User cannot be altered without sessionToken Error.

A: 这种情况一般都是没有进行用户登录就对用户信息进行更新导致的


Q: 更新用户update时失败,9012错误

A: 9012是context is null,没传上下文对象


Q: 用了getobjectId方法为什么还是显示objectId cant’t be empty。

  1. public void setsj(View v){
  2. final User setUser = new User();
  3. List<String> a=new ArrayList<String>();
  4. a.add("5cd431f659");
  5. a.add("4c2184e8ea");
  6. setUser.setFriends(a);
  7. setUser.update(this, setUser.getObjectId(), new UpdateListener() {
  8. @Override
  9. public void onSuccess() {
  10. // TODO Auto-generated method stub
  11. Log.i("bmob", "更新成功:");
  12. toast("更新成功");
  13. }
  14. @Override
  15. public void onFailure(int code, String msg) {
  16. // TODO Auto-generated method stub
  17. Log.i("bmob","更新失败:"+msg);
  18. toast("更新失败");
  19. }
  20. });
  21. }

这段代码是通过点击一个button然后更新我写好的数据,可一直显示更新失败,查看logcat显示objectId cant’t be empty。可是我有用setUser.getObjectId()啊,为什么还是说ID为空?

A: 你的user并不是通过登录得到的,而是自己生成的,并没有objectid,需要从服务器上获取的数据才有objectid


Q: 更新了用户信息后 服务器都更新了数据 但是本地缓存用户没有更新

A: 更新用户信息后需要从新登陆,本地用户信息才会更新。


Q: 登录后在个人资料中上传头像在用户表,并且要头像和用户要对应。

A: 上传图片成功后,将BmobFile对象更新到当前用户的头像字段中即可。


Q: 在数据下_User 下把email添加后为啥 emailVerified Boolean 这一栏显示的是false 是什么原因呢

A: 该字段需要注册用户点击了验证邮件才会主动设置为true


数据实时功能

Q: 如何实现Bmob服务端向Android应用发送实时通知?如某个数据过高需要提醒APP用户

A: 以使用实时数据监听功能来实现


Q: 登录之后,怎么获取用户的信息并显示出来

A: 登录成功之后就可以通过getCurrentUser方法获取本地用户信息


ACL和角色

Q: 例如我已经有一个角色叫Chief,我怎么用代码给它添加成员?直接new BmobRole(“Chief”)然后再getUsers().add然后再save?
但这个代码不应该是新建一个角色吗?
如果是用BmobQuery获取的话获取失败,返回101错误

A:

  1. //创建HR和Cashier两个用户角色(这里为了举例BmobRole的使用,将这段代码写在这里,正常情况下放在员工管理界面会更合适)
  2. BmobRole hr = new BmobRole("HR");
  3. BmobRole cashier = new BmobRole("Cashier");
  4. //将hr_zhang和hr_luo归属到hr角色中
  5. hr.getUsers().add(hr_zhang);
  6. hr.getUsers().add(hr_luo);
  7. //保存到云端角色表中(web端可以查看Role表)
  8. hr.save(this);
  9. //将cashier_xie归属到cashier角色中
  10. cashier.getUsers().add(cashier_xie);
  11. //保存到云端角色表中(web端可以查看Role表)
  12. cashier.save(this);

Q: 是否可以针一行数据的某一个字段控制读写权限 ?

是否可以针一行数据的某一个字段控制读写权限 ?例如,UserA 发了一条说说,这条说说只有UserA可以写,其它用户可以读,但是其中有一个点赞计数字段,所有用户都可以对这条说说点赞,点赞后,这个点赞计数字段值就加1。

A: 没有针对一个字段控制读写的,如果需要,可以将这些需要控制的另外建一个表,使用pointer字段指向该表来获取


地理位置

Q: 基于地理位置的查询是根据什么排序的

A: 是按照距离从近到远来进行排序的


自动更新

Q: 自动更新生成的表和文档上的不一致

A: 没有调用initAppversion方法


Q: 自动更新,如何实现只获取是否有新版本,不弹出对话框。

A: 目前SDK中暂没有这个功能,后续版本会考虑添加


文件

Q: Bmob如何实现储存和传输图片?

A: 通过BmobFile类上传图片,上传成功之后,会返回一个BmobFile,你从这个BmobFile可以得到文件上传之后的url,把这个url保存到你的对应表中。下载的时候,先查询数据表得到url,然后下载这个图片就可以了。


Q: Bmob如何将整批图片下载在本地呢?

A: 首先先查询,得到全部数据,从而得到图片的url列表,再用一些下载文件的代码把图片批量下载下来。


Q: BmobFile类最多可以保存多少张图片?

A: BmobFile类只能保存一张图片,你可以用BmobFile上传图片,得到图片的url,保存的字段用string或者array。


Q: 怎么让表的某个字段包含多张图片?

A: 用array来存储文件的url


Q: 能把json文件放在bmob里,并配置一个专门的地址,然后APP通过这路径下载或者读取吗?

A: 用文件服务实现即可。


Q: 怎么通过objectID获得文件的下载路径?

A:

  1. // 根据objectId查询数据
  2. BmobQuery<GameScore> query = new BmobQuery<GameScore>();
  3. query.getObject(this, "a203eba875", new GetListener<GameScore>() {
  4. @Override
  5. public void onSuccess(GameScore object) {
  6. // TODO Auto-generated method stub
  7. toast("查询成功:");
  8. //获得playerName的信息
  9. object.getPlayerName();
  10. //获得数据的objectId信息
  11. object.getObjectId();
  12. //获得createdAt数据创建时间(注意是:createdAt,不是createAt)
  13. object.getCreatedAt();
  14. // 假设GameScore对象中有一列是BmobFile类型的icon
  15. // 如下取出查询到的数据中的BmobFile类型,得到下载地址
  16. BmobFile icon = object.getIcon();
  17. String url = icon.getFileUrl();
  18. }
  19. @Override
  20. public void onFailure(int code, String arg0) {
  21. // TODO Auto-generated method stub
  22. toast("查询失败:"+arg0);
  23. }
  24. });

Q: 为什么最新的SDK里面的BmobFile没有loadImageThumbnail方法

A: 最新的SDK已经将图像处理的接口去掉了,需要用户自己在本地处理


Q: 怎么去在批量上完图片之后,取得对应的缩略图呢?

A: 缩略图功能已经取消,请在客户端进行图片的处理


Q: 9015your uploading task is canceled. 安卓文件上传无响应

A: 调用了bmobfile.cancel()方法会出错该提示。


Q: 表中有一列数据为BmobFile类型 ,数据为.TXT格式 ,怎么将文件下载下来

A: 查询这一行数据,在结果中从这一列对应的BmobFile对象中用getFileUrl()得到文件的地址,再进行下载。


Q: listview显示Bmob上的图片怎么实现?

A: 图片上传后会返回相应url给客户端的,可以在表中,在需要显示的时候利用url将图片下载下来进行显示


Q: 我通过软件上传了文件到bmob后端云。怎么获得该文件url。

A: 上传后会有url返回


Q: bmob可以通过客户端下载文件吗?

A: 上传到Bmob之后就会返回文件的地址,至于怎么下载,由你来决定。


Q: 为什么我上传的文件(图片)已经删除了,但是通过url仍然可以访问到图片呢?

A: CDN缓存的,过一段时间就会完全删除


其它问题

Q: Cause: com.android.dex.DexException: Multiple dex files define Landroid/support/v4/accessibilityservice/AccessibilityServiceInfoCompat$AccessibilityServiceInfoVersionImpl;
Error:Execution failed for task ‘:app:transformClassesWithDexForDebug’.

A: Cause: com.android.dex.DexException: Multiple dex files define Landroid/support/v4/accessibilityservice/AccessibilityServiceInfoCompat$AccessibilityServiceInfoVersionImpl;
Error:Execution failed for task ‘:app:transformClassesWithDexForDebug’.

这是重复导包造成的,你用的v4和v7包重复了,你需要去掉报错的那个模块


Q: 我使用BmobUser.login接口,返回onFailure的参数code分别对应什么情况?有说明文档么?

A: android 错误码列表


Q: App_ID is not setted出现什么原因?

A: 初始化BmobSDK时需要传入你自己应用的ApplicationID


Q: Duplicate files copied in APK META-INF/maven/com.squareup.okhttp/okhttp/pom.xml

A: 导了重复的包


Q: bomb_AndroidSDK_V3.4.7_0518 中文乱码

A: SDK的demo的编码格式是gbk,换下格式就行


Q: android Bmobquery 开两个线程 分别查两个不一样的表,返回数据有问题

A: sdk中的很多方法本身就是在子线程中执行的,开发者没必要开子线程(创建子线程和线程池管理SDK都封装好了)。


Q: 查询出了回调函数,List就变空了

A: 请先理解下同步和异步的概念,bmob目前的接口提供的都是异步回调函数,建议在onsucess/onFailure中进行ui操作


Q: Bmob的各个SDK可以使用Application的Context来初始化吗

A: 可以的。最好是用Application的Context来初始化。


Q: bmob的jar包和volley包冲突怎么回事

A: bmob的jar里面包含了volley,无需再次导入


Q: 移动端和WEB端能用BMOB作为云端,实现数据共享么?

A: 可以的,使用同一个app id来进行操作即可


Q: 真机运行时控制台输出 Error:warning: Ignoring InnerClasses attribute for an anonymous inner class

A: 可以试试在你的app的build.gradle的android标签下添加如下:

  1. lintOptions {
  2. ignoreWarnings true
  3. }

Q: 把应用装到手机很慢,一直在Gradle Build

A: 如果你确定你的应用所需的jar包已经下载完了,可以将gradle设置成离线模式


Q: BmobSDK能导入源码开发编译吗

A: BmobSDK目前并未开源


Q: 3.4.7 sdk java.lang.UnsatisfiedLinkError 怎么破

java.lang.UnsatisfiedLinkError: Couldn’t load bmob from loader dalvik.system.PathClassLoader[DexPathList[[zip file “/data/app/top.kiuber.sharemy-1.apk”],nativeLibraryDirectories=[/data/app-lib/top.kiuber.sharemy-1, /vendor/lib, /system/lib]]]: findLibrary returned null

A: 详情移步到博客http://www.kiuber.top/2016/05/24/android-studio-add-so/

问题已经被攻克,原因是so库文件未导入。

解决方法:在project视图下,在main文件夹内新建jniLibs文件夹,把对应so库文件夹及文件复制到jniLibs文件内,然后在MainActivity.java文件


Q: 邮箱验证用哪个SDK

A: 使用数据服务SDK即可


Q: Android studio连接Bmob时报错

  1. java.lang.UnsatisfiedLinkError: com.android.tools.fd.runtime.IncrementalClassLoader$DelegateClassLoader[DexPathList[[dex file "/data/data/com.example.administrator.bmob2/files/instant-run/dex/slice-support-annotations-23.4.0_eff36cb3dd5776bcc7dfe63d3c4af3d7d0b02909-classes.dex", dex file "/data/data/com.example.administrator.bmob2/files/instant-run/dex/slice-slice_9-classes.dex", dex file "/data/data/com.example.administrator.bmob2/files/instant-run/dex/slice-slice_8-classes.dex", dex file "/data/data/com.example.administrator.bmob2/files/instant-run/dex/slice-slice_7-classes.dex", dex file "/data/data/com.example.administrator.bmob2/files/instant-run/dex/slice-slice_6-classes.dex", dex file "/data/data/com.example.administrator.bmob2/files/instant-run/dex/slice-slice_5-classes.dex", dex file "/data/data/com.example.administrator.bmob2/files/instant-run/dex/slice-slice_4-classes.dex", dex file "/data/data/com.example.administrator.bmob2/files/instant-run/dex/slice-slice_3-classes.dex", dex file "/data/data/com.example.administrator.bmob2/files/instant-run/dex/slice-slice_2-classes.dex", dex file "/data/data/com.example.administrator.bmob2/files/instant-run/dex/slice-slice_1-classes.dex", dex file "/data/data/com.example.administrator.bmob2/files/instant-run/dex/slice-slice_0-classes.dex", dex file "/data/data/com.example.administrator.bmob2/files/instant-run/dex/slice-okio-1.7.0_16f89fb230458d29c309937f6ab11ce75258c504-classes.dex", dex file "/data/data/com.example.administrator.bmob2/files/instant-run/dex/slice-okhttp-3.2.0_8f755226a0726d7921fa90d83c674c16a1bd0ee3-classes.dex", dex file "/data/data/com.example.administrator.bmob2/files/instant-run/dex/slice-internal_impl-23.4.0_2c4831db21059d6465959fb999a28d5a6fe10599-classes.dex", dex file "/data/data/com.example.administrator.bmob2/files/instant-run/dex/slice-com.android.support-support-vector-drawable-23.4.0_eb28b4ae1a0615e1130648d3b547db30e6e89fd0-classes.dex", dex file "/data/data/com.example.administrator.bmob2/files/instant-run/dex/slice-com.android.support-support-v4-23.4.0_c594c96eba293bbb78cda22a0502566240fb4409-classes.dex", dex file "/data/data/com.example.administrator.bmob2/files/instant-run/dex/slice-com.android.support-appcompat-v7-23.4.0_39e8b9d21669eb9eb3df764bcd49eb0facc75e07-classes.dex", dex file "/data/data/com.example.administrator.bmob2/files/instant-run/dex/slice-com.android.support-animated-vector-drawable-23.4.0_613291d2784b41eebf3800d518847e90b2efa55b-classes.dex", dex file "/data/data/com.example.administrator.bmob2/files/instant-run/dex/slice-bmob-sdk-3.4.7_3bb8e20fe85419a97fea506c0c8a8a8fe18f45d5-classes.dex", dex file "/data/data/com.example.administrator.bmob2/files/instant-run/dex/slice-bmob-push-0.9_35e71e7e49d7888481221634e134fec14816f381-classes.dex"],nativeLibraryDirectories=[/data/app/com.example.administrator.bmob2-2/lib/arm, /vendor/lib, /system/lib]]] couldn't find "libbmob.so

A: 使用aar格式的SDK,这样就不用导入so库


Q: sdk怎么和Retrofit这些库一起使用呢

A: 出现这个问题的原因是retrofit依赖的okhttp和sdk的远程aar包中的okhttp重复导致的,将会导致编译不过,解决方式有:

1 下载Retrofit的jar包,采用本地依赖的方式;

2 compile Retrofit的配置加下exclude,把重复的okhttp除去,如下:

  1. compile ('com.squareup.retrofit2:retrofit:2.1.0'){
  2. exclude group : 'com.squareup.okhttp3'
  3. }