Storage
RTM 的 Storage 功能提供了一套动态数据库机制,可以让开发者动态设置、存储、更新、删除 Channel Metadata 和 User Metadata 等数据。
setChannelMetadata
接口描述
setChannelMetadata
方法可以为频道(Message Channel 或 Stream Channel)设置 Channel Metadata。一个频道只能有一组 Metadata,但每组 Metadata 可以有一个或多个 Metadata Item。如果多次调用该方法,SDK 会依次检索 Metadata Item 的 key
值,并按如下规则处理:
- 如果设置的 Metadata Item
key
值不同,则会根据调用顺序依次增加。 - 如果设置的 Metadata Item
key
值相同,则最后一次设置的 Metadata 的value
会覆盖之前的值。
成功设置 Channel Metadata 后,订阅该频道且开启事件监听的用户会收到 CHANNEL
类型的 onStorageEvent
事件通知。详见事件监听。
Channel Metadata 同时也引进了版本控制逻辑 CAS(Compare And Set),该方法提供两种独立的版本控制字段,你可以根据实际业务场景设置任意一种或多种:
- 通过
Metadata
中的setMajorRevision
方法设置majorRevision
属性开启整组 Channel Metadata 的版本号校验。 - 通过
MetadataItem
中的revision
属性开启某个 Metadata Item 的版本号校验。
设置 Channel Metadata 或 Metadata Item 时,配合版本属性可以控制本次调用是否开启版本号校验,逻辑如下:
- 版本属性为
-1
时,本次调用不开启 CAS 验证。如果 Channel Metadata 或 Metadata Item 已存在,则该值会被最新值覆盖;如果 Channel Metadata 或 Metadata Item 不存在,则 SDK 会创建该值。 - 版本属性为正整数时,本次调用开启 CAS 验证。如果 Channel Metadata 或 Metadata Item 已存在,则 SDK 会在版本号验证成功后更新对应的值;如果 Channel Metadata 或 Metadata Item 不存在,则 SDK 会返回错误码。
接口方法
你可以通过以下方式调用 setChannelMetadata
方法:
void rtmClient.getStorage().setChannelMetadata(
String channelName,
RtmChannelType channelType,
Metadata data,
MetadataOptions options,
String lockName,
ResultCallback<Void> resultCallback
);
参数 | 类型 | 是否必填 | 默认值 | 描述 |
---|---|---|---|---|
channelName | String | 必填 | - | 频道名称。 |
channelType | RtmChannelType | 必填 | - | 频道类型。详见 RtmChannelType 。 |
data | Metadata | 必填 | - | Metadata Item。详见 Metadata 。 |
options | MetadataOptions | 必填 | - | Channel Metadata 配置选项。 |
lockName | String | 必填 | - | Lock 名称。设置后,只有调用 acquireLock 方法获取该锁的用户才能执行操作。 |
resultCallback | ResultCallback<Void> | 必填 | - | 调用结果回调:onSuccess 方法。onFailure 方法。 |
MetadataOptions
数据类型包含以下属性:
属性 | 类型 | 是否必填 | 默认值 | 描述 |
---|---|---|---|---|
recordTs | boolean | 选填 | false | 是否记录编辑的时间戳。 |
recordUserId | boolean | 选填 | false | 是否记录编辑者的用户 ID。 |
基本用法
// Create a metadata instance
Metadata metadata = rtmClient.getStorage().createMetadata();
// Set the Major Revision
metadata.setMajorRevision(174298270);
// Add a metadata item
metadata.setMetadataItem(new MetadataItem("Apple", "100", 174298270));
// Add another metadata item
metadata.setMetadataItem(new MetadataItem("Banana", "200", 174298270));
// Record who and when set the metadata
MetadataOptions options = new MetadataOptions();
options.setRecordTs(true);
options.setRecordUserId(true);
rtmClient.getStorage().setChannelMetadata("channel_name", RtmChannelType.MESSAGE, metadata, options, "lockName", new ResultCallback<Void>() {
@Override
public void onSuccess(Void responseInfo) {
log(CALLBACK, "update channel metadata success");
}
@Override
public void onFailure(ErrorInfo errorInfo) {
log(ERROR, errorInfo.toString());
}
});
getChannelMetadata
接口描述
getChannelMetadata
方法可以获取指定频道的 Metadata。
接口方法
你可以通过以下方式调用 getChannelMetadata
方法:
void rtmClient.getStorage().getChannelMetadata(
String channelName,
RtmChannelType channelType,
ResultCallback<Metadata> resultCallback
);
参数 | 类型 | 是否必填 | 默认值 | 描述 |
---|---|---|---|---|
channelName | String | 必填 | - | 频道名称。 |
channelType | RtmChannelType | 必填 | - | 频道类型。详见 RtmChannelType 。 |
resultCallback | ResultCallback<Metadata> | 必填 | - | 调用结果回调:onSuccess 方法并返回 Metadata 查询结果。onFailure 方法。 |
基本用法
rtmClient.getStorage().getChannelMetadata("channelName", RtmChannelType.MESSAGE, new ResultCallback<Metadata>() {
@Override
public void onSuccess(Metadata data) {
log(CALLBACK, "get channel metadata success");
log(INFO, "metadata major revision: " + data.getMajorRevision());
MetadataItem[] metadataItems = data.getMetadataItems();
for (MetadataItem item : metadataItems) {
log(INFO, item.toString);
}
}
@Override
public void onFailure(ErrorInfo errorInfo) {
log(ERROR, errorInfo.toString());
}
});
removeChannelMetadata
接口描述
removeChannelMetadata
方法可以删除 Channel Metadata 或 Channel Metadata Item 数组。
删除时,配合版本属性可以控制本次调用是否开启版本号校验,逻辑如下:
- 版本属性为
-1
时,本次调用不开启 CAS 验证。如果 Channel Metadata 或 Metadata Item 已存在,则 SDK 会删除该值;如果 Channel Metadata 或 Metadata Item 不存在,则 SDK 会返回错误码。 - 版本属性为正整数时,本次调用开启 CAS 验证。如果 Channel Metadata 或 Metadata Item 已存在,则 SDK 会在版本号验证成功后删除对应值;如果 Channel Metadata 或 Metadata Item 不存在,则 SDK 会返回错误码。
成功删除 Channel Metadata 或 Metadata Item 后,订阅该频道且开启事件监听的用户会收到 CHANNEL
类型的 onStorageEvent
事件通知。详见事件监听。
接口方法
你可以通过以下方式调用 removeChannelMetadata
方法:
void rtmClient.getStorage().removeChannelMetadata(
String channelName,
RtmChannelType channelType,
Metadata data,
MetadataOptions options,
String lockName,
ResultCallback<Void> resultCallback
);
参数 | 类型 | 是否必填 | 默认值 | 描述 |
---|---|---|---|---|
channelName | String | 必填 | - | 频道名称。 |
channelType | RtmChannelType | 必填 | - | 频道类型。详见 RtmChannelType 。 |
data | Metadata | 必填 | - | Metadata Item。详见 Metadata 。 |
options | MetadataOptions | 必填 | - | Channel Metadata 配置选项。 |
lockName | String | 必填 | - | Lock 名称。设置后,只有调用 acquireLock 方法获取该锁的用户才能执行操作。 |
resultCallback | ResultCallback<Void> | 必填 | - | 调用结果回调:onSuccess 方法。onFailure 方法。 |
MetadataOptions
数据类型包含以下属性:
属性 | 类型 | 是否必填 | 默认值 | 描述 |
---|---|---|---|---|
recordTs | boolean | 选填 | false | 是否记录编辑的时间戳。 |
recordUserId | boolean | 选填 | false | 是否记录编辑者的用户 ID。 |
基本用法
// Create a metadata instance
Metadata metadata = rtmClient.getStorage().createMetadata();
// Set the Major Revision
metadata.setMajorRevision(174298270);
// Add a metadata item
MetadataItem item = new MetadataItem();
item.setKey("Apple");
item.setRevision(174298270);
metadata.setMetadataItem(item);
//Record who and when set the metadata
MetadataOptions options = new MetadataOptions();
options.setRecordTs(true);
options.setRecordUserId(true);
rtmClient.getStorage().removeChannelMetadata("channel_name", RtmChannelType.MESSAGE, metadata, options, "", new ResultCallback<Void>() {
@Override
public void onSuccess(Void responseInfo) {
log(CALLBACK, "remove channel metadata success");
}
@Override
public void onFailure(ErrorInfo errorInfo) {
log(ERROR, errorInfo.toString());
}
});
updateChannelMetadata
接口描述
updateChannelMetadata
方法可以更新已有的 Channel Metadata。每次调用该方法,你可以更新一个 Channel Metadata,也可以更新一个或多个 Channel Metadata Item 数组。
成功更新后,订阅该频道且开启事件监听的用户会收到 CHANNEL
类型的 onStorageEvent
事件通知。详见事件监听。
该方法不能对不存在的 Metadata Item 进行操作。
接口方法
你可以通过以下方式调用 updateChannelMetadata
方法:
void rtmClient.getStorage().updateChannelMetadata(
String channelName,
RtmChannelType channelType,
Metadata data,
MetadataOptions options,
String lockName,
ResultCallback<Void> resultCallback
);
参数 | 类型 | 是否必填 | 默认值 | 描述 |
---|---|---|---|---|
channelName | String | 必填 | - | 频道名称。 |
channelType | RtmChannelType | 必填 | - | 频道类型。详见 RtmChannelType 。 |
data | Metadata | 必填 | - | Metadata Item。详见 Metadata 。 |
options | MetadataOptions | 必填 | - | Channel Metadata 配置选项。 |
lockName | String | 必填 | - | Lock 名称。设置后,只有调用 acquireLock 方法获取该锁的用户才能执行操作。 |
resultCallback | ResultCallback<Void> | 必填 | - | 调用结果回调:onSuccess 方法。onFailure 方法。 |
options
参数包含以下属性:
属性 | 类型 | 是否必填 | 默认值 | 描述 |
---|---|---|---|---|
recordTs | boolean | 选填 | false | 是否记录编辑的时间戳。 |
recordUserId | boolean | 选填 | false | 是否记录编辑者的用户 ID。 |
基本用法
// Create a metadata instance
Metadata metadata = rtmClient.getStorage().createMetadata();
// Set the Major Revision
metadata.setMajorRevision(174298270);
// Add a metadata item
metadata.setMetadataItem(new MetadataItem("Apple", "120", 174298270));
// Add another metadata item
metadata.setMetadataItem(new MetadataItem("Banana", "220", 174298270));
rtmClient.getStorage().updateChannelMetadata("channel_name", RtmChannelType.MESSAGE, metadata, new MetadataOptions(true, true), "", new ResultCallback<Void>() {
@Override
public void onSuccess(Void responseInfo) {
log(CALLBACK, "update channel metadata success");
}
@Override
public void onFailure(ErrorInfo errorInfo) {
log(ERROR, errorInfo.toString());
}
});
setUserMetadata
接口描述
setUserMetadata
方法可以设置 User Metadata。如果多次调用该方法时,SDK 会依次检索 User Metadata Item 的 key
值,并按如下规则处理:
- 如果设置的 Metadata Item key 值不同,则会根据调用顺序依次增加。
- 如果设置的 Metadata Item key 值相同,则最后一次设置的 Metadata 的 value 会覆盖之前的值。
成功设置 User Metadata 后,订阅该用户 Metadata 且开启事件监听的用户会收到 USER
类型的 onStorageEvent
事件通知。详见事件监听。
User Metadata 同时也引进了版本控制逻辑 CAS,该方法提供两种独立的版本控制字段,你可以根据实际业务场景设置任意一种或多种:
- 通过
Metadata
中的setMajorRevision
方法设置majorRevision
属性开启整组 Channel Metadata 的版本号校验。 - 通过
MetadataItem
中的revision
属性开启某个 Metadata Item 的版本号校验。
设置 User Metadata 时,配合版本属性可以控制本次调用是否开启版本号校验,逻辑如下:
- 版本属性为
-1
时,本次调用不开启 CAS 验证。如果 User Metadata 或 Metadata Item 已存在,则该值会被最新值覆盖;如果 User Metadata 或 Metadata Item 不存在,则会创建该值。 - 版本属性为正整数时,本次调用开启 CAS 验证。如果 User Metadata 或 Metadata Item 已存在,则 SDK 会在版本号验证成功后更新对应的值;如果 User Metadata 或 Metadata Item 不存在,则 SDK 会返回错误码。
接口方法
你可以通过以下方式调用 setUserMetadata
方法:
void rtmClient.getStorage().setUserMetadata(
String userId,
Metadata data,
MetadataOptions options,
ResultCallback<Void> resultCallback
);
参数 | 类型 | 是否必填 | 默认值 | 描述 |
---|---|---|---|---|
userId | String | 必填 | - | 用户 ID。 |
data | Metadata | 必填 | - | Metadata Item。详见 Metadata 。 |
options | MetadataOptions | 必填 | - | Channel Metadata 配置选项。 |
resultCallback | ResultCallback<Void> | 必填 | - | 调用结果回调:onSuccess 方法。onFailure 方法。 |
options
参数包含以下属性:
属性 | 类型 | 是否必填 | 默认值 | 描述 |
---|---|---|---|---|
recordTs | boolean | 选填 | false | 是否记录编辑的时间戳。 |
recordUserId | boolean | 选填 | false | 是否记录编辑者的用户 ID。 |
基本用法
// Create a metadata instance
Metadata metadata = mRtmClient.getStorage().createMetadata();
// Set the Major Revision
metadata.setMajorRevision(174298270);
// Add a metadata item
metadata.setMetadataItem(new MetadataItem("Name", "Tony", 174298270));
// Add another metadata item
metadata.setMetadataItem(new MetadataItem("Mute", "true", 174298270));
rtmClient.getStorage().setUserMetadata(userName, mMetadata, new MetadataOptions(true, true), new ResultCallback<Void>() {
@Override
public void onSuccess(Void responseInfo) {
log(CALLBACK, "set user metadata success");
}
@Override
public void onFailure(ErrorInfo errorInfo) {
log(ERROR, errorInfo.toString());
}
});
getUserMetadata
接口描述
getUserMetadata
方法可以获取指定用户的 Metadata 和 User Metadata Item。
接口方法
你可以通过以下方式调用 getUserMetadata
方法:
void rtmClient.getStorage().getUserMetadata(
String userId,
ResultCallback<Metadata> resultCallback
);
参数 | 类型 | 是否必填 | 默认值 | 描述 |
---|---|---|---|---|
userId | String | 必填 | - | 用户 userId 。 |
resultCallback | ResultCallback<Metadata> | 必填 | - | 调用结果回调:onSuccess 方法并返回 Metadata 查询结果。onFailure 方法。 |
基本用法
rtmClient.getStorage().getUserMetadata("userName", new ResultCallback<Metadata>() {
@Override
public void onSuccess(Metadata data) {
log(CALLBACK, "get user metadata success");
MetadataItem[] items = data.getMetadataItems();
log(INFO, "major revision: " + data.getMajorRevision());
for (MetadataItem item : items) {
log(INFO, item.toString());
}
}
@Override
public void onFailure(ErrorInfo errorInfo) {
log(ERROR, errorInfo.toString());
}
});
removeUserMetadata
接口描述
removeUserMetadata
方法可以删除 User Metadata 或某几个 User Metadata Item。
成功删除后,订阅该用户 Metadata 且开启事件监听的用户会收到 USER
类型的 onStorageEvent
事件通知。详见事件监听。
接口方法
你可以通过以下方式调用 removeUserMetadata
方法:
void rtmClient.getStorage().removeUserMetadata(
String userId,
Metadata data,
MetadataOptions options,
ResultCallback<Void> resultCallback
);
参数 | 类型 | 是否必填 | 默认值 | 描述 |
---|---|---|---|---|
userId | String | 必填 | - | 用户 ID。 |
data | Metadata | 必填 | - | Metadata Item。详见 Metadata 。 |
options | MetadataOptions | 必填 | - | Channel Metadata 配置选项。 |
resultCallback | ResultCallback<Void> | 必填 | - | 调用结果回调:onSuccess 方法。onFailure 方法。 |
options
参数包含以下属性:
属性 | 类型 | 是否必填 | 默认值 | 描述 |
---|---|---|---|---|
recordTs | boolean | 选填 | false | 是否记录编辑的时间戳。 |
recordUserId | boolean | 选填 | false | 是否记录编辑者的用户 ID。 |
基本用法
// Create a metadata instance
Metadata metadata = rtmClient.getStorage().createMetadata();
// Set the Major Revision
metadata.setMajorRevision(174298270);
// Add a metadata item
MetadataItem item = new MetadataItem();
item.setKey("Mute");
item.setRevision(174298270);
metadata.setMetadataItem(item);
// Record who and when set the metadata
MetadataOptions options = new MetadataOptions();
options.setRecordTs(true);
options.setRecordUserId(true);
rtmClient.getStorage().removeUserMetadata("Tony", metadata, options, new ResultCallback<Void>() {
@Override
public void onSuccess(Void responseInfo) {
log(CALLBACK, "remove user metadata success");
}
@Override
public void onFailure(ErrorInfo errorInfo) {
log(ERROR, errorInfo.toString());
}
});
updateUserMetadata
接口描述
updateUserMetadata
方法可以更新已有的 User Metadata 或 Metadata Item。成功更新后,订阅该 User Metadata 且开启事件监听的用户会收到 USER
类型的 onStorageEvent
事件通知。详见事件监听。
该方法不能对不存在的 Metadata Item 进行操作。
接口方法
你可以通过以下方式调用 updateUserMetadata
方法:
void rtmClient.getStorage().updateUserMetadata(
String userId,
Metadata data,
MetadataOptions options,
ResultCallback<Void> resultCallback
);
参数 | 类型 | 是否必填 | 默认值 | 描述 |
---|---|---|---|---|
userId | String | 必填 | - | 用户 ID。 |
data | Metadata | 必填 | - | Metadata Item。详见 Metadata 。 |
options | MetadataOptions | 必填 | - | Channel Metadata 配置选项。 |
resultCallback | ResultCallback<Void> | 必填 | - | 调用结果回调:onSuccess 方法。onFailure 方法。 |
MetadataOptions
数据类型包含以下属性:
属性 | 类型 | 是否必填 | 默认值 | 描述 |
---|---|---|---|---|
recordTs | boolean | 选填 | false | 是否记录编辑的时间戳。 |
recordUserId | boolean | 选填 | false | 是否记录编辑者的用户 ID。 |
基本用法
// Create a metadata instance
Metadata metadata = mRtmClient.getStorage().createMetadata();
// Set the Major Revision
metadata.setMajorRevision(174298270);
// Add a metadata item
metadata.setMetadataItem(new MetadataItem("Name", "Tony", 174298270));
// Record who and when set the metadata
MetadataOptions options = new MetadataOptions();
options.setRecordTs(true);
options.setRecordUserId(true);
rtmClient.getStorage().updateUserMetadata("Tony", metadata, options, new ResultCallback<Void>() {
@Override
public void onSuccess(Void responseInfo) {
log(CALLBACK, "update user metadata success");
}
@Override
public void onFailure(ErrorInfo errorInfo) {
log(ERROR, errorInfo.toString());
}
});
subscribeUserMetadata
接口描述
subscribeUserMetadata
方法可以订阅指定用户的 Metadata。成功订阅且开启事件监听后,当该用户的 Metadata 发生变更时会收到 USER
类型的 onStorageEvent
事件通知。详见事件监听。
接口方法
你可以通过以下方式调用 subscribeUserMetadata
方法:
void rtmClient.getStorage().subscribeUserMetadata(
String userId,
ResultCallback<Void> resultCallback
);
参数 | 类型 | 是否必填 | 默认值 | 描述 |
---|---|---|---|---|
userId | String | 必填 | - | 用户 ID。 |
resultCallback | ResultCallback<Void> | 必填 | - | 调用结果回调:onSuccess 方法。onFailure 方法。 |
基本用法
rtmClient.getStorage().subscribeUserMetadata("Tony", new ResultCallback<Void>() {
@Override
public void onSuccess(Void responseInfo) {
log(CALLBACK, "subscribe user metadata success");
}
@Override
public void onFailure(ErrorInfo errorInfo) {
log(ERROR, errorInfo.toString());
}
});
unsubscribeUserMetadata
接口描述
如果你不需要接收某个用户 User Metadata 的变更通知,调用unsubscribeUserMetadata
方法取消订阅。
接口方法
你可以通过以下方式调用 unsubscribeUserMetadata
方法:
void rtmClient.getStorage().unsubscribeUserMetadata(
String userId,
ResultCallback<Void> resultCallback
);
参数 | 类型 | 是否必填 | 默认值 | 描述 |
---|---|---|---|---|
userId | String | 必填 | - | 用户 ID。 |
resultCallback | ResultCallback<Void> | 必填 | - | 调用结果回调:onSuccess 方法。onFailure 方法。 |
基本用法
rtmClient.getStorage().unsubscribeUserMetadata("Tony", new ResultCallback<Void>() {
@Override
public void onSuccess(Void responseInfo) {
log(CALLBACK, "unsubscribe user metadata success");
}
@Override
public void onFailure(ErrorInfo errorInfo) {
log(ERROR, errorInfo.toString());
}
});
Metadata
接口描述
Metadata
数据类型提供设置和获取 Metadata Item 及其版本的方法。
接口方法
你可以通过以下方式调用相关方法:
class Metadata {
void setMajorRevision(long revision);
long getMajorRevision();
void setMetadataItem(MetadataItem item);
MetadataItem[] getMetadataItems();
void clearMetadata();
}
方法 | 描述 |
---|---|
createMetadata | |
setMajorRevision | 设置版本控制开关: -1 : 关闭版本校验。0 : 开启版本校验,只有目标版本号与此值相符才能执行操作。 |
getMajorRevision | 获取 Major Revision。 |
setMetadataItem | |
getMetadataItems | |
clearMetadata |
MetadataItem
数据类型包含以下属性:
属性 | 类型 | 是否必填 | 默认值 | 描述 |
---|---|---|---|---|
key | String | 选填 | - | 键。 |
value | String | 选填 | - | 值。 |
authorUserId | String | 选填 | - | 编辑者的用户 ID。该值为只读,不支持写入。 |
revision | long | 选填 | -1 |
|
updateTs | long | 选填 | 0 | 更新时间戳。该值为只读,不支持写入。 |
基本用法
// Set metadata
Metadata metadata = mRtmClient.getStorage().createMetadata();
metadata.setMajorRevision(174298270);
// new MetadataItem
MetadataItem item1 = new MetadataItem();
item1.setKey("Name");
item1.setValue("Tony");
item1.setRevision(174298270);
// or MetadataItem item1 = new MetadataItem("Name", "Tony", 174298270);
metadata.setMetadataItem(item1);
// Get metadata
long majorRevision = metadata.getMajorRevision();
MetadataItem[] items = metadata.getMetadataItems();
for (MetadataItem item : items) {
log(INFO, item.toString());
}