新增数据记录

操作步骤

1.通过 tableName 实例化一个 Table 对象,操作该对象即相当于操作对应的数据表

  1. Table product = new Table("product");

2.本地创建一条空记录

Record record = product.createRecord()

3.为上面创建的空记录赋值

record.put("name", "new arrived")

该方法支持两种类型的赋值操作:

a.一次性赋值:

  1. Record template = new Record();
  2. template.put("category_id", 999);
  3. template.put("location", "sxz");
  4. Record red = product.createRecord();
  5. red.putAll(template);
  6. Record blue = product.createRecord();
  7. blue.putAll(template);

b.逐个赋值

  1. record.put("name", "new arrived");
  2. record.put("price", 999);

对同一字段进行多次 put 操作,后面的数据会覆盖掉前面的数据

4.将创建的记录保存到服务器

record.save() or record.saveInBackground(callback)

通过上面的四个步骤,即完成了一条记录的插入,具体操作阅读以下内容。

添加普通数据

请求示例

  1. Table fruits = new Table("fruits");
  2. // 设置方式一,每个属性逐个赋值
  3. Record apple = fruits.createRecord().put("name", "apple");
  4. // 设置方式二,构造一个模板保存通用属性,批量赋值
  5. Record template = new Record();
  6. template.put("category_id", 999);
  7. template.put("location", "sxz");
  8. Record banana = fruits.createRecord().put("name", "banana").putAll(template);
  9. // 同步版本的保存
  10. try {
  11. red.save();
  12. blue.save();
  13. // 操作成功
  14. } catch (Exception e) {
  15. // 操作失败
  16. }
  17. // 异步回调版本
  18. apple.saveInBackground(new Callback<Record>() {
  19. @Override
  20. public void onSuccess(@Nullable Record record) {
  21. // 保存成功
  22. @Override
  23. public void onFailure(Exception e) {
  24. // 保存失败
  25. }
  26. });
  27. banana.saveInBackground(new Callback<Record>() {
  28. @Override
  29. public void onSuccess(@Nullable Record record) {
  30. // 保存成功
  31. }
  32. @Override
  33. public void onFailure(Exception e) {
  34. // 保存失败
  35. }
  36. });

操作结果

没有异常抛出则表示操作成功,此时 record 的值已同步至最新。

异常请参考异常

当抛出 HttpException 时,code 是 http code,常见的有:

http code可能的原因
4001. 提交的 ACL 权限不合法 、2. 提交的数据的字段类型不匹配、 3. 提交的数据中没有包含必填项 4. 重复创建数据(设置了唯一索引)
403没有权限写入数据
404写入的数据表不存在

对于不合法的数据,知晓云会进行过滤。比如开发者尝试在 integer 类型的字段写入 string 类型的数据,该操作不会报错而是会忽略对该字段的修改。执行 save() 后,本地的 record 会同步至服务器上的最新版本,因此可以检查本地 record 中对应的字段来判断某些字段是否添加成功。

添加日期时间 Calendar 类型的数据

数据表允许添加时间日期类型的列,为该类型的记录赋值,需要使用 Calendar,如 Product 表定义一个时间日期类型的列 expiration_time,创建一条记录时,该字段的赋值操作如下:

  1. Calendar expiration = Calendar.getInstance();
  2. expiration.set(Calendar.YEAR, 2021);
  3. record.put("expiration_time", expiration);

添加 file 类型数据

  1. try {
  2. ...
  3. CloudFile file = Storage.uploadFile(filename, bytes);
  4. record.put("avatar", file);
  5. record.save();
  6. // 操作成功
  7. } catch (Exception e) {
  8. // 操作失败
  9. }

注: 添加记录时为字段设置的数据,要与预先在知晓云平台设定的字段的数据类型一致,当仅更新一个字段,并且使用的数据不合法时,将无法成功保存,请求返回 Failed to save record, type conflict on fields 错误,如果更新多个字段,其中有一个或一个以上字段数据合法,则请求成功,但其中数据不合法的字段将不会成功保存,如下示例:

  1. /*
  2. * 同时设置 amount 和 date 字段,其中 date 为日期类型,这里为其赋了一个 string 类型的值,
  3. * 该请求会返回 200,但只有 amount 被成功设置为 10
  4. */
  5. record.put("amout", 10);
  6. record.put("date", "abc");
  7. record.save();

添加 geojson 类型数据

查看 地理位置操作 章节

添加 object 类型数据

对于未知的类型(比如用户自定义的 Product),sdk 会直接通过 gson 序列化为 json 字符串,所以类型的属性不能被混淆(或者添加 @SerializedName)

对象内的属性名只能包含字母、数字和下划线,必须以字母开头,比如 {$ifanr.x: 123}{知晓云: "test"} 是错误的

添加 array 类型数据

添加 array 类型数据的方法与添加其他类型数据的方法基本一致。区别在于,array 类型数据是将一个的数组赋值给某个字段。

array 类型数据中的元素类型,要与预先在知晓云平台设定的字段类型一致。否则创建的数据将不包含该 array 类型的字段。

  1. record.put("tags", Arrays.asList("phone", "company", "branch"));

添加 pointer 类型数据

每张表最多能建立 3 个 pointer 类型的字段。如有更多需求,请提交工单说明pointer 指向的数据表,不能改名或删除

假设现在有一张 Article 表, Article 表部分字段如下:

字段名字段类型说明
commentpointer指向了 Comment
userpointer指向了 _userprofile

现在在 Article 表中新增一条数据,其中:

comment 字段指向了 Comment 表中 id 为 5bad87ab0769797b4fb27a1b 的数据行

user 字段指向了 _userprofile 表中 id 为 69147880 的数据行

  1. try {
  2. Table comments = new Table("Comment");
  3. Table articles = new Table("Article");
  4. // 5bad87ab0769797b4fb27a1b 为 Comment 表中某行数据的 id
  5. Record comment = comments.fetchWithoutData("5bad87ab0769797b4fb27a1b");
  6. // 69147880 为 _userprofile 表中某行数据的 id
  7. User user = Users.userWithoutData(69147880);
  8. Record article = articles.createRecord();
  9. article.put("comment", comment);
  10. article.put("user", user);
  11. article.save();
  12. // 操作成功
  13. } catch (Exception e) {
  14. // 操作失败
  15. }

批量新增数据项

Table.batchSave(records)

请求示例

  1. Table fruits = new Table("fruits");
  2. Record apple = fruits.createRecord().put("name", "apple");
  3. Record banana = fruits.createRecord().put("name", "banana");
  4. // 同步版本
  5. try {
  6. fruits.batchSave(Arrays.listOf(apple, banana));
  7. // 操作成功
  8. } catch (Exception e) {
  9. // 操作失败
  10. }
  11. // 异步回调版本
  12. fruits.batchSaveInBackground(Arrays.listOf(apple, banana), new Callback<BatchResult>() {
  13. @Override
  14. public void onSuccess(@Nullable BatchResult batchResult) {
  15. // 批量保存成功,拿到结果
  16. }
  17. @Override
  18. public void onFailure(Exception e) {
  19. // 批量保存失败了
  20. }
  21. });

异常异常

当返回 HttpException 时,常见的 code 为:

http code可能的原因
4001. 提交的 ACL 权限不合法 、2. 提交的数据的字段类型不匹配、 3. 提交的数据中没有包含必填项 4. 重复创建数据(设置了唯一索引)
403没有权限写入数据
404写入的数据表不存在

批量创建时不触发触发器

  1. // 知晓云后台设置的触发器将不会被触发
  2. Query query = new Query();
  3. query.enableTrigger(false);
  4. table.batchSaveInBackground(list, query, new BaseCallback<BatchResult>() {
  5. @Override
  6. public void onSuccess(BatchResult batchResult) {
  7. // success
  8. }
  9. @Override
  10. public void onFailure(Throwable e) {
  11. // fail
  12. }
  13. });