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
13final 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 | // send the record to patch, need to include record id inside each ContactRecord instance |
增加记录
1 | // only need to send the group name inside GroupRecord instance |
其他资料
更详细的DreamFactory REST API 资料看这里.
管理员控制台页面的live API文档对了解DreamFactory REST API是非常有帮助的。