DreamFactory安卓示例app(Address Book)部署流程

仓库地址

Address Book-安卓版

本仓库包含了一个简单的Address Book安卓应用,演示了如何使用DreamFactory REST API。其中包括新用户注册,用户登录以及对相关数据表的增删改查操作。

在你的本地机器上搭建DreamFactory

要下载并安装DreamFactory,请参考这里。另外,如果你不想在本地安装DreamFactory,你也可以在 www.dreamfactory.com上创建一个 免费的在线托管开发账户

配置你的DreamFactory实例来运行你的app

  • 配置 CORS(跨域资源共享)

    • 在管理员控制台页面中,点击导航栏上的Config标签,然后点击侧边栏的CORS选项;
    • 点击添加按钮;
    • 在Origin, Paths, Headers 栏位中填入 *;
    • Max Age栏位填 0;
    • Methods下拉项全部选中,并勾上Enabled选框;
    • 完成后点击Save;
    • 如需要了解更多关于配置CORS的信息请点击 这里.
  • 为新注册的用户创建一个默认的角色

    • 在管理员控制台页面,点击Roles标签,然后点击侧边栏的Create按钮;
    • 输入角色名称并勾上Activie选框;
    • 然后点击Access标签;
    • 在Service Access(以后你可以使它更严格)下面添加一个新条目:
      • Service:All;
      • Component:*;
      • Access:全部选中;
      • Requester:API。
    • 回到Basic标签点击Save Role;
    • 点击Services标签,然后编辑名为user的service:点击Services下面的Config选项,并勾上Allow Open Registration;
    • 把Open Reg Role设为之前创建的Role;
    • 确保Open Reg Email Service一栏是空的,这样新用户注册时才不必邮件验证;
    • 点击Save Services。
  • 为app导入包文件.

    • 进入管理员控制台页面的Apps标签,点击侧边的import选项,然后点击示例apps列表中的Address Book for Android前面的select按钮。这个包文件包含了description,schemas以及示例数据;
    • Storage Service一栏选中files;
    • storage folder不填;
    • 点击import按钮。如果导入成功了,这个app将会出现在Apps标签Manage选项下面。也许你需要刷新一下页面才能看见。
  • 确保你有一个名为’db’的SQL数据库。你的DreamFactory实例可能有也可能没有一个名叫’db’的可用打的数据库,这取决于你如何安装的DreamFactory。你可以在管理员控制台的Services标签下面创建一个新的SQL service来添加一个SQL数据库,确保这个数据库的名字是’db’。

运行Address Book app

把这个仓库clone到你的本地机器上,然后将其中的android-sdk/android-sdk目录导入成Android Studio的Project。

在运行这个项目之前,你需要在AndroidManifest.xml文件中编辑apikey为你自己的app设置一个相匹配的key。这个key你可以在管理员控制台页面的Apps标签下找到。

如果你的DreamFactory实例是运行在本地主机localhost上的,将AndroidManifest.xml文件中的instanceUrl设置为你的模拟器localhost IP:10.0.2.2,并确保端口正确,例如:
<meta-data android:name="instanceUrl" android:value="http://10.0.2.2:8080/api/v2/" />

如果你的实例是运行在真实的服务器上的,则instanceUrl设为你的服务器上合适的位置,例如:
<meta-data android:name="instanceUrl" android:value="http://my-df-instance.example.com/api/v2/" />

当app运行在你的手机上时,你可以注册一个新用户或用一个已经存在的用户登录。目前该app还不支持管理员账户的注册与登录。

API调用示例

该app使用Retrofit2库来发送REST请求。

通常DreamFactory REST API 调用形式像下面这样:
<请求方法> http[s]://<服务器名>/api/v2/[<service-api-name>]/[<resource-path>][?<param-name>=<param-value>]

一次安卓端的调用像下面这样:

1
2
3
4
5
6
7
8
9
10
11
12
13
final ContactGroupService service = DreamFactoryAPI.getInstance().getService(ContactGroupService.class);

service.getGroupList().enqueue(new Callback<Resource<GroupRecord>>() {
@Override
public void onResponse(Call<Resource<GroupRecord>> call, Response<Resource<GroupRecord>> response) {
// Handle response on main thread
}

@Override
public void onFailure(Call<Resource<GroupRecord>> call, Throwable t) {
// Handle error on main thread
}
});

更多关于使用Retrofit2库发送REST请求的信息在这里http://square.github.io/retrofit/

数据库操作

查询记录(to get or delete)
  • 使用过滤器

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15

    // filter param should be like "contact_id=2"
    @GET("db/_table/contact_info")
    Call<Resource<ContactInfoRecord>> getContactInfo(@Query(value = "filter") String filter);

    ```

    - 相关记录
    ```Java

    // filter to only get the contact_group_relationships we want, filter should be like "contact_group_id=1"
    // request without related would return just {id, contact_group_id, contact_id}
    // set the related field to go get the contact records referenced by
    // each contact_group_relationship record
    @GET("db/_table/contact_group_relationship?related=contact_by_contact_id")
    Call<Resource<ContactsRelationalRecord>> getGroupContacts(@Query(value = "filter") String filter);
  • 使用id_fields

    1
    2
    3
    // since we don't know the contact_group_relationship ids, change the id field to id
    @GET("db/_table/contact_group_relationship?id_field=id")
    Call<Resource<ContactsRelationalRecord>> getGroupContacts(@Body Resource<Long> ids);
  • 通过id记录

    1
    2
    3
    4
    // delete contact records by record ids
    // ids is comma separated list of contact ids
    @DELETE("db/_table/contact")
    Call<Resource<ContactRecord>> removeContacts(@Query(value = "ids") String ids);
更新记录
1
2
3
// send the record to patch, need to include record id inside each ContactRecord instance
@PATCH("db/_table/contact")
Call<Resource<ContactRecord>> updateContacts(@Body Resource<ContactRecord> contactRecords);
增加记录
1
2
3
4
// only need to send the group name inside GroupRecord instance
// we don't have a group ID yet, so we can't provide one here
@POST("db/_table/contact_group")
Call<Resource<GroupRecord>> createContactGroups(@Body Resource<GroupRecord> records);

其他资料

更详细的DreamFactory REST API 资料看这里.

管理员控制台页面的live API文档对了解DreamFactory REST API是非常有帮助的。

(本文为绝世盗草人原创,转载请声明出处:http://iamding.cn)