GS2-Datastore SDK for Game Engine API リファレンス
モデル
EzDataObject
データオブジェクト
データオブジェクトはゲームプレイヤーがアップロードしたデータです。
データは世代管理され、30日分の過去のデータも保管されます。
データにはアクセス権限を設定できます。
スコープには3種類あり、だれでもアクセスできる public。指定したユーザーIDのゲームプレイヤーのみがアクセスできる protected。自身のみがアクセスできる private があります。
| 型 | 必須 | デフォルト | 値の制限 | 説明 |
---|
dataObjectId | string | ✓ | | ~ 1024文字 | データオブジェクトGRN |
name | string | ✓ | UUID | ~ 128文字 | データの名前 |
userId | string | ✓ | | ~ 128文字 | ユーザーID |
scope | enum [‘public’, ‘protected’, ‘private’] | ✓ | “private” | ~ 128文字 | ファイルのアクセス権 |
allowUserIds | List<string> | {scope} != none and {scope} == “protected” | [] | | 公開するユーザIDリスト |
status | enum [‘ACTIVE’, ‘UPLOADING’, ‘DELETED’] | ✓ | | ~ 128文字 | 状態 |
generation | string | | | ~ 128文字 | データの世代 |
createdAt | long | ✓ | | | 作成日時 |
updatedAt | long | ✓ | | | 最終更新日時 |
EzDataObjectHistory
データオブジェクト履歴
データオブジェクトの更新履歴が確認できます。
| 型 | 必須 | デフォルト | 値の制限 | 説明 |
---|
dataObjectHistoryId | string | ✓ | | ~ 1024文字 | データオブジェクト履歴GRN |
generation | string | ✓ | | ~ 128文字 | 世代ID |
contentLength | long | ✓ | | ~ 10485760 | データサイズ |
createdAt | long | ✓ | | | 作成日時 |
メソッド
deleteDataObject
アップロードしたデータを削除
Request
| 型 | 必須 | デフォルト | 値の制限 | 説明 |
---|
namespaceName | string | ✓ | | ~ 32文字 | ネームスペース名 |
accessToken | string | ✓ | | ~ 128文字 | ユーザーID |
dataObjectName | string | ✓ | UUID | ~ 128文字 | データの名前 |
Result
Error
このAPIには特別な例外が定義されています。
GS2-SDK for GameEngine ではゲーム内でハンドリングが必要そうなエラーは一般的な例外から派生した特殊化した例外を用意することでハンドリングしやすくしています。
一般的なエラーの種類や、ハンドリング方法は こちら のドキュメントを参考にしてください。
型 | 基底クラス | 説明 |
---|
InvalidStatusException | BadRequestException | DataObject が操作可能な状態ではありません |
実装例
try {
var domain = gs2.Datastore.Namespace(
namespaceName: "namespace-0001"
).Me(
gameSession: GameSession
).DataObject(
dataObjectName: "dataObject-0001"
);
var result = await domain.DeleteDataObjectAsync(
);
var item = await result.ModelAsync();
} catch(Gs2.Gs2Datastore.Exception.InvalidStatus e) {
// DataObject is not in operable state.
}
var domain = gs2.Datastore.Namespace(
namespaceName: "namespace-0001"
).Me(
gameSession: GameSession
).DataObject(
dataObjectName: "dataObject-0001"
);
var future = domain.DeleteDataObject(
);
yield return future;
if (future.Error != null)
{
if (future.Error is Gs2.Gs2Datastore.Exception.InvalidStatusException)
{
// DataObject is not in operable state.
}
onError.Invoke(future.Error, null);
yield break;
}
var future2 = future.Result.Model();
yield return future2;
if (future2.Error != null)
{
onError.Invoke(future2.Error, null);
yield break;
}
var result = future2.Result;
const auto Domain = Gs2->Datastore->Namespace(
"namespace-0001" // namespaceName
)->Me(
AccessToken
)->DataObject(
"dataObject-0001" // dataObjectName
);
const auto Future = Domain->DeleteDataObject(
);
Future->StartSynchronousTask();
if (Future->GetTask().IsError())
{
if (Gs2::Datastore::Error::FInvalidStatusError::TypeString == Task->GetTask().Error()->Type())
{
// DataObject is not in operable state.
}
return false;
}
// obtain changed values / result values
const auto Future2 = Future->GetTask().Result()->Model();
Future2->StartSynchronousTask();
if (!TestFalse(WHAT, Future2->GetTask().IsError())) return false;
const auto Result = Future2->GetTask().Result();
doneUpload
データのアップロード完了を報告
Request
| 型 | 必須 | デフォルト | 値の制限 | 説明 |
---|
namespaceName | string | ✓ | | ~ 32文字 | ネームスペース名 |
accessToken | string | ✓ | | ~ 128文字 | ユーザーID |
dataObjectName | string | ✓ | UUID | ~ 128文字 | データの名前 |
Result
Error
このAPIには特別な例外が定義されています。
GS2-SDK for GameEngine ではゲーム内でハンドリングが必要そうなエラーは一般的な例外から派生した特殊化した例外を用意することでハンドリングしやすくしています。
一般的なエラーの種類や、ハンドリング方法は こちら のドキュメントを参考にしてください。
型 | 基底クラス | 説明 |
---|
InvalidStatusException | BadRequestException | DataObject が操作可能な状態ではありません |
NotUploadedException | BadRequestException | DataObject がアップロードされていません |
実装例
try {
var domain = gs2.Datastore.Namespace(
namespaceName: "namespace-0001"
).Me(
gameSession: GameSession
).DataObject(
dataObjectName: "dataObject-0001"
);
var result = await domain.DoneUploadAsync(
);
var item = await result.ModelAsync();
} catch(Gs2.Gs2Datastore.Exception.InvalidStatus e) {
// DataObject is not in operable state.
} catch(Gs2.Gs2Datastore.Exception.NotUploaded e) {
// DataObject is not uploaded.
}
var domain = gs2.Datastore.Namespace(
namespaceName: "namespace-0001"
).Me(
gameSession: GameSession
).DataObject(
dataObjectName: "dataObject-0001"
);
var future = domain.DoneUpload(
);
yield return future;
if (future.Error != null)
{
if (future.Error is Gs2.Gs2Datastore.Exception.InvalidStatusException)
{
// DataObject is not in operable state.
}
if (future.Error is Gs2.Gs2Datastore.Exception.NotUploadedException)
{
// DataObject is not uploaded.
}
onError.Invoke(future.Error, null);
yield break;
}
var future2 = future.Result.Model();
yield return future2;
if (future2.Error != null)
{
onError.Invoke(future2.Error, null);
yield break;
}
var result = future2.Result;
const auto Domain = Gs2->Datastore->Namespace(
"namespace-0001" // namespaceName
)->Me(
AccessToken
)->DataObject(
"dataObject-0001" // dataObjectName
);
const auto Future = Domain->DoneUpload(
);
Future->StartSynchronousTask();
if (Future->GetTask().IsError())
{
if (Gs2::Datastore::Error::FInvalidStatusError::TypeString == Task->GetTask().Error()->Type())
{
// DataObject is not in operable state.
}
if (Gs2::Datastore::Error::FNotUploadedError::TypeString == Task->GetTask().Error()->Type())
{
// DataObject is not uploaded.
}
return false;
}
// obtain changed values / result values
const auto Future2 = Future->GetTask().Result()->Model();
Future2->StartSynchronousTask();
if (!TestFalse(WHAT, Future2->GetTask().IsError())) return false;
const auto Result = Future2->GetTask().Result();
listMyDataObjects
データオブジェクトの一覧を取得
Request
| 型 | 必須 | デフォルト | 値の制限 | 説明 |
---|
namespaceName | string | ✓ | | ~ 32文字 | ネームスペース名 |
accessToken | string | ✓ | | ~ 128文字 | ユーザーID |
status | enum [‘ACTIVE’, ‘UPLOADING’, ‘DELETED’] | | | ~ 128文字 | 状態 |
pageToken | string | | | ~ 1024文字 | データの取得を開始する位置を指定するトークン |
limit | int | ✓ | 30 | 1 ~ 1000 | データの取得件数 |
Result
実装例
var domain = gs2.Datastore.Namespace(
namespaceName: "namespace-0001"
).Me(
gameSession: GameSession
);
var items = await domain.DataObjectsAsync(
).ToListAsync();
var domain = gs2.Datastore.Namespace(
namespaceName: "namespace-0001"
).Me(
gameSession: GameSession
);
var it = domain.DataObjects(
);
List<EzDataObject> items = new List<EzDataObject>();
while (it.HasNext())
{
yield return it.Next();
if (it.Error != null)
{
onError.Invoke(it.Error, null);
break;
}
if (it.Current != null)
{
items.Add(it.Current);
}
else
{
break;
}
}
const auto Domain = Gs2->Datastore->Namespace(
"namespace-0001" // namespaceName
)->Me(
AccessToken
);
const auto It = Domain->DataObjects( // status
);
for (auto Item : *It)
{
}
値の変更イベントハンドリング
var domain = gs2.Datastore.Namespace(
namespaceName: "namespace-0001"
).Me(
gameSession: GameSession
);
// イベントハンドリングを開始
var callbackId = domain.SubscribeDataObjects(
() => {
// リストの要素が変化した時に呼び出される
}
);
// イベントハンドリングを停止
domain.UnsubscribeDataObjects(callbackId);
var domain = gs2.Datastore.Namespace(
namespaceName: "namespace-0001"
).Me(
gameSession: GameSession
);
var it = domain.DataObjects(
);
List<EzDataObject> items = new List<EzDataObject>();
while (it.HasNext())
{
yield return it.Next();
if (it.Error != null)
{
onError.Invoke(it.Error, null);
break;
}
if (it.Current != null)
{
items.Add(it.Current);
}
else
{
break;
}
}
const auto Domain = Gs2->Datastore->Namespace(
"namespace-0001" // namespaceName
)->Me(
AccessToken
);
// イベントハンドリングを開始
const auto CallbackId = Domain->SubscribeDataObjects(
[]() {
// リストの要素が変化した時に呼び出される
}
);
// イベントハンドリングを停止
Domain->UnsubscribeDataObjects(CallbackId);
Warning
このイベントはSDKがもつローカルキャッシュの値が変更された時に呼び出されます。
ローカルキャッシュは SDK が持つ API の実行、または GS2-Gateway の通知を有効にした GS2-Distributor 経由でのスタンプシートの実行、または GS2-Gateway の通知を有効にした GS2-JobQueue の実行によって変化したもののみが対象となります。
そのため、これらの方法以外で値が変更されてもコールバックは呼び出されません。
prepareDownload
データをダウンロード準備
Request
| 型 | 必須 | デフォルト | 値の制限 | 説明 |
---|
namespaceName | string | ✓ | | ~ 32文字 | ネームスペース名 |
dataObjectId | string | ✓ | | ~ 1024文字 | データオブジェクトGRN |
accessToken | string | ✓ | | ~ 128文字 | ユーザーID |
Result
| 型 | 説明 |
---|
item | EzDataObject | データオブジェクト |
fileUrl | string | ファイルをダウンロードするためのURL |
contentLength | long | ファイルの容量 |
実装例
var domain = gs2.Datastore.Namespace(
namespaceName: "namespace-0001"
).Me(
gameSession: GameSession
);
var result = await domain.PrepareDownloadAsync(
dataObjectId: "grn:dataObject-0001"
);
var item = await result.ModelAsync();
var fileUrl = result.FileUrl;
var contentLength = result.ContentLength;
var domain = gs2.Datastore.Namespace(
namespaceName: "namespace-0001"
).Me(
gameSession: GameSession
);
var future = domain.PrepareDownload(
dataObjectId: "grn:dataObject-0001"
);
yield return future;
if (future.Error != null)
{
onError.Invoke(future.Error, null);
yield break;
}
var future2 = future.Result.Model();
yield return future2;
if (future2.Error != null)
{
onError.Invoke(future2.Error, null);
yield break;
}
var result = future2.Result;
var fileUrl = future.Result.FileUrl;
var contentLength = future.Result.ContentLength;
const auto Domain = Gs2->Datastore->Namespace(
"namespace-0001" // namespaceName
)->Me(
AccessToken
);
const auto Future = Domain->PrepareDownload(
"grn:dataObject-0001"
);
Future->StartSynchronousTask();
if (Future->GetTask().IsError())
{
return false;
}
// obtain changed values / result values
const auto Future2 = Future->GetTask().Result()->Model();
Future2->StartSynchronousTask();
if (!TestFalse(WHAT, Future2->GetTask().IsError())) return false;
const auto Result = Future2->GetTask().Result();
const auto FileUrl = Result->FileUrl;
const auto ContentLength = Result->ContentLength;
prepareDownloadByUserIdAndDataObjectName
ユーザIDとデータ名を指定してデータをダウンロード準備
Request
| 型 | 必須 | デフォルト | 値の制限 | 説明 |
---|
namespaceName | string | ✓ | | ~ 32文字 | ネームスペース名 |
userId | string | ✓ | | ~ 128文字 | ユーザーID |
dataObjectName | string | ✓ | UUID | ~ 128文字 | データの名前 |
Result
| 型 | 説明 |
---|
item | EzDataObject | データオブジェクト |
fileUrl | string | ファイルをダウンロードするためのURL |
contentLength | long | ファイルの容量 |
実装例
var domain = gs2.Datastore.Namespace(
namespaceName: "namespace-0001"
).User(
userId: "user-0001"
).DataObject(
dataObjectName: "dataObject-0001"
);
var result = await domain.PrepareDownloadByUserIdAndDataObjectNameAsync(
);
var item = await result.ModelAsync();
var fileUrl = result.FileUrl;
var contentLength = result.ContentLength;
var domain = gs2.Datastore.Namespace(
namespaceName: "namespace-0001"
).User(
userId: "user-0001"
).DataObject(
dataObjectName: "dataObject-0001"
);
var future = domain.PrepareDownloadByUserIdAndDataObjectName(
);
yield return future;
if (future.Error != null)
{
onError.Invoke(future.Error, null);
yield break;
}
var future2 = future.Result.Model();
yield return future2;
if (future2.Error != null)
{
onError.Invoke(future2.Error, null);
yield break;
}
var result = future2.Result;
var fileUrl = future.Result.FileUrl;
var contentLength = future.Result.ContentLength;
const auto Domain = Gs2->Datastore->Namespace(
"namespace-0001" // namespaceName
)->User(
"user-0001" // userId
)->DataObject(
"dataObject-0001" // dataObjectName
);
const auto Future = Domain->PrepareDownloadByUserIdAndDataObjectName(
);
Future->StartSynchronousTask();
if (Future->GetTask().IsError())
{
return false;
}
// obtain changed values / result values
const auto Future2 = Future->GetTask().Result()->Model();
Future2->StartSynchronousTask();
if (!TestFalse(WHAT, Future2->GetTask().IsError())) return false;
const auto Result = Future2->GetTask().Result();
const auto FileUrl = Result->FileUrl;
const auto ContentLength = Result->ContentLength;
prepareDownloadOwnData
自分のデータをダウンロード準備
Request
| 型 | 必須 | デフォルト | 値の制限 | 説明 |
---|
namespaceName | string | ✓ | | ~ 32文字 | ネームスペース名 |
dataObjectName | string | ✓ | UUID | ~ 128文字 | データの名前 |
accessToken | string | ✓ | | ~ 128文字 | ユーザーID |
Result
| 型 | 説明 |
---|
item | EzDataObject | データオブジェクト |
fileUrl | string | ファイルをダウンロードするためのURL |
contentLength | long | ファイルの容量 |
実装例
var domain = gs2.Datastore.Namespace(
namespaceName: "namespace-0001"
).Me(
gameSession: GameSession
).DataObject(
dataObjectName: "dataObject-0001"
);
var result = await domain.PrepareDownloadOwnDataAsync(
);
var item = await result.ModelAsync();
var fileUrl = result.FileUrl;
var contentLength = result.ContentLength;
var domain = gs2.Datastore.Namespace(
namespaceName: "namespace-0001"
).Me(
gameSession: GameSession
).DataObject(
dataObjectName: "dataObject-0001"
);
var future = domain.PrepareDownloadOwnData(
);
yield return future;
if (future.Error != null)
{
onError.Invoke(future.Error, null);
yield break;
}
var future2 = future.Result.Model();
yield return future2;
if (future2.Error != null)
{
onError.Invoke(future2.Error, null);
yield break;
}
var result = future2.Result;
var fileUrl = future.Result.FileUrl;
var contentLength = future.Result.ContentLength;
const auto Domain = Gs2->Datastore->Namespace(
"namespace-0001" // namespaceName
)->Me(
AccessToken
)->DataObject(
"dataObject-0001" // dataObjectName
);
const auto Future = Domain->PrepareDownloadOwnData(
);
Future->StartSynchronousTask();
if (Future->GetTask().IsError())
{
return false;
}
// obtain changed values / result values
const auto Future2 = Future->GetTask().Result()->Model();
Future2->StartSynchronousTask();
if (!TestFalse(WHAT, Future2->GetTask().IsError())) return false;
const auto Result = Future2->GetTask().Result();
const auto FileUrl = Result->FileUrl;
const auto ContentLength = Result->ContentLength;
prepareReUpload
データの再アップロード準備
Request
| 型 | 必須 | デフォルト | 値の制限 | 説明 |
---|
namespaceName | string | ✓ | | ~ 32文字 | ネームスペース名 |
accessToken | string | ✓ | | ~ 128文字 | ユーザーID |
dataObjectName | string | ✓ | UUID | ~ 128文字 | データの名前 |
contentType | string | ✓ | “application/octet-stream” | ~ 256文字 | アップロードするデータの MIME-Type |
Result
| 型 | 説明 |
---|
item | EzDataObject | データオブジェクト |
uploadUrl | string | アップロード処理の実行に使用するURL |
実装例
var domain = gs2.Datastore.Namespace(
namespaceName: "namespace-0001"
).Me(
gameSession: GameSession
).DataObject(
dataObjectName: "dataObject-0001"
);
var result = await domain.PrepareReUploadAsync(
contentType: null
);
var item = await result.ModelAsync();
var uploadUrl = result.UploadUrl;
var domain = gs2.Datastore.Namespace(
namespaceName: "namespace-0001"
).Me(
gameSession: GameSession
).DataObject(
dataObjectName: "dataObject-0001"
);
var future = domain.PrepareReUpload(
contentType: null
);
yield return future;
if (future.Error != null)
{
onError.Invoke(future.Error, null);
yield break;
}
var future2 = future.Result.Model();
yield return future2;
if (future2.Error != null)
{
onError.Invoke(future2.Error, null);
yield break;
}
var result = future2.Result;
var uploadUrl = future.Result.UploadUrl;
const auto Domain = Gs2->Datastore->Namespace(
"namespace-0001" // namespaceName
)->Me(
AccessToken
)->DataObject(
"dataObject-0001" // dataObjectName
);
const auto Future = Domain->PrepareReUpload(
nullptr // contentType
);
Future->StartSynchronousTask();
if (Future->GetTask().IsError())
{
return false;
}
// obtain changed values / result values
const auto Future2 = Future->GetTask().Result()->Model();
Future2->StartSynchronousTask();
if (!TestFalse(WHAT, Future2->GetTask().IsError())) return false;
const auto Result = Future2->GetTask().Result();
const auto UploadUrl = Result->UploadUrl;
prepareUpload
データのアップロード準備
Request
| 型 | 必須 | デフォルト | 値の制限 | 説明 |
---|
namespaceName | string | ✓ | | ~ 32文字 | ネームスペース名 |
accessToken | string | ✓ | | ~ 128文字 | ユーザーID |
name | string | | | ~ 128文字 | データの名前 |
scope | enum [‘public’, ‘protected’, ‘private’] | ✓ | “private” | ~ 128文字 | ファイルのアクセス権 |
contentType | string | ✓ | “application/octet-stream” | ~ 256文字 | アップロードするデータの MIME-Type |
allowUserIds | List<string> | {scope} != none and {scope} == “protected” | [] | | 公開するユーザIDリスト |
updateIfExists | bool | ✓ | false | | 既にデータが存在する場合にエラーとするか、データを更新するか |
Result
| 型 | 説明 |
---|
item | EzDataObject | データオブジェクト |
uploadUrl | string | アップロード処理の実行に使用するURL |
実装例
var domain = gs2.Datastore.Namespace(
namespaceName: "namespace-0001"
).Me(
gameSession: GameSession
);
var result = await domain.PrepareUploadAsync(
name: "dataObject-0001",
scope: "public",
contentType: null,
allowUserIds: null,
updateIfExists: null
);
var item = await result.ModelAsync();
var uploadUrl = result.UploadUrl;
var domain = gs2.Datastore.Namespace(
namespaceName: "namespace-0001"
).Me(
gameSession: GameSession
);
var future = domain.PrepareUpload(
name: "dataObject-0001",
scope: "public",
contentType: null,
allowUserIds: null,
updateIfExists: null
);
yield return future;
if (future.Error != null)
{
onError.Invoke(future.Error, null);
yield break;
}
var future2 = future.Result.Model();
yield return future2;
if (future2.Error != null)
{
onError.Invoke(future2.Error, null);
yield break;
}
var result = future2.Result;
var uploadUrl = future.Result.UploadUrl;
const auto Domain = Gs2->Datastore->Namespace(
"namespace-0001" // namespaceName
)->Me(
AccessToken
);
const auto Future = Domain->PrepareUpload(
"dataObject-0001", // name
"public", // scope
nullptr, // contentType
nullptr, // allowUserIds
nullptr // updateIfExists
);
Future->StartSynchronousTask();
if (Future->GetTask().IsError())
{
return false;
}
// obtain changed values / result values
const auto Future2 = Future->GetTask().Result()->Model();
Future2->StartSynchronousTask();
if (!TestFalse(WHAT, Future2->GetTask().IsError())) return false;
const auto Result = Future2->GetTask().Result();
const auto UploadUrl = Result->UploadUrl;
restoreDataObject
データの管理情報を修復
Request
| 型 | 必須 | デフォルト | 値の制限 | 説明 |
---|
namespaceName | string | ✓ | | ~ 32文字 | ネームスペース名 |
dataObjectId | string | ✓ | | ~ 1024文字 | データオブジェクトGRN |
Result
Error
このAPIには特別な例外が定義されています。
GS2-SDK for GameEngine ではゲーム内でハンドリングが必要そうなエラーは一般的な例外から派生した特殊化した例外を用意することでハンドリングしやすくしています。
一般的なエラーの種類や、ハンドリング方法は こちら のドキュメントを参考にしてください。
型 | 基底クラス | 説明 |
---|
InvalidStatusException | BadRequestException | DataObject が操作可能な状態ではありません |
実装例
try {
var domain = gs2.Datastore.Namespace(
namespaceName: "namespace-0001"
);
var result = await domain.RestoreDataObjectAsync(
dataObjectId: "grn:dataObject-0001"
);
var item = await result.ModelAsync();
} catch(Gs2.Gs2Datastore.Exception.InvalidStatus e) {
// DataObject is not in operable state.
}
var domain = gs2.Datastore.Namespace(
namespaceName: "namespace-0001"
);
var future = domain.RestoreDataObject(
dataObjectId: "grn:dataObject-0001"
);
yield return future;
if (future.Error != null)
{
if (future.Error is Gs2.Gs2Datastore.Exception.InvalidStatusException)
{
// DataObject is not in operable state.
}
onError.Invoke(future.Error, null);
yield break;
}
var future2 = future.Result.Model();
yield return future2;
if (future2.Error != null)
{
onError.Invoke(future2.Error, null);
yield break;
}
var result = future2.Result;
const auto Domain = Gs2->Datastore->Namespace(
"namespace-0001" // namespaceName
);
const auto Future = Domain->RestoreDataObject(
"grn:dataObject-0001"
);
Future->StartSynchronousTask();
if (Future->GetTask().IsError())
{
if (Gs2::Datastore::Error::FInvalidStatusError::TypeString == Task->GetTask().Error()->Type())
{
// DataObject is not in operable state.
}
return false;
}
// obtain changed values / result values
const auto Future2 = Future->GetTask().Result()->Model();
Future2->StartSynchronousTask();
if (!TestFalse(WHAT, Future2->GetTask().IsError())) return false;
const auto Result = Future2->GetTask().Result();
updateDataObject
データオブジェクトを更新
Request
| 型 | 必須 | デフォルト | 値の制限 | 説明 |
---|
namespaceName | string | ✓ | | ~ 32文字 | ネームスペース名 |
accessToken | string | ✓ | | ~ 128文字 | ユーザーID |
scope | enum [‘public’, ‘protected’, ‘private’] | ✓ | “private” | ~ 128文字 | ファイルのアクセス権 |
allowUserIds | List<string> | {scope} != none and {scope} == “protected” | [] | | 公開するユーザIDリスト |
Result
実装例
var domain = gs2.Datastore.Namespace(
namespaceName: "namespace-0001"
).Me(
gameSession: GameSession
).DataObject(
dataObjectName: "dataObject-0001"
);
var result = await domain.UpdateDataObjectAsync(
scope: "public",
allowUserIds: null
);
var item = await result.ModelAsync();
var domain = gs2.Datastore.Namespace(
namespaceName: "namespace-0001"
).Me(
gameSession: GameSession
).DataObject(
dataObjectName: "dataObject-0001"
);
var future = domain.UpdateDataObject(
scope: "public",
allowUserIds: null
);
yield return future;
if (future.Error != null)
{
onError.Invoke(future.Error, null);
yield break;
}
var future2 = future.Result.Model();
yield return future2;
if (future2.Error != null)
{
onError.Invoke(future2.Error, null);
yield break;
}
var result = future2.Result;
const auto Domain = Gs2->Datastore->Namespace(
"namespace-0001" // namespaceName
)->Me(
AccessToken
)->DataObject(
"dataObject-0001" // dataObjectName
);
const auto Future = Domain->UpdateDataObject(
"public", // scope
nullptr // allowUserIds
);
Future->StartSynchronousTask();
if (Future->GetTask().IsError())
{
return false;
}
// obtain changed values / result values
const auto Future2 = Future->GetTask().Result()->Model();
Future2->StartSynchronousTask();
if (!TestFalse(WHAT, Future2->GetTask().IsError())) return false;
const auto Result = Future2->GetTask().Result();
listDataObjectHistories
データオブジェクト履歴の一覧を取得
Request
| 型 | 必須 | デフォルト | 値の制限 | 説明 |
---|
namespaceName | string | ✓ | | ~ 32文字 | ネームスペース名 |
accessToken | string | ✓ | | ~ 128文字 | ユーザーID |
dataObjectName | string | ✓ | | ~ 128文字 | データオブジェクト名 |
pageToken | string | | | ~ 1024文字 | データの取得を開始する位置を指定するトークン |
limit | int | ✓ | 30 | 1 ~ 1000 | データの取得件数 |
Result
実装例
var domain = gs2.Datastore.Namespace(
namespaceName: "namespace-0001"
).Me(
gameSession: GameSession
).DataObject(
dataObjectName: "dataObject-0001"
);
var items = await domain.DataObjectHistoriesAsync(
).ToListAsync();
var domain = gs2.Datastore.Namespace(
namespaceName: "namespace-0001"
).Me(
gameSession: GameSession
).DataObject(
dataObjectName: "dataObject-0001"
);
var it = domain.DataObjectHistories(
);
List<EzDataObjectHistory> items = new List<EzDataObjectHistory>();
while (it.HasNext())
{
yield return it.Next();
if (it.Error != null)
{
onError.Invoke(it.Error, null);
break;
}
if (it.Current != null)
{
items.Add(it.Current);
}
else
{
break;
}
}
const auto Domain = Gs2->Datastore->Namespace(
"namespace-0001" // namespaceName
)->Me(
AccessToken
)->DataObject(
"dataObject-0001" // dataObjectName
);
const auto It = Domain->DataObjectHistories(
);
for (auto Item : *It)
{
}
値の変更イベントハンドリング
var domain = gs2.Datastore.Namespace(
namespaceName: "namespace-0001"
).Me(
gameSession: GameSession
).DataObject(
dataObjectName: "dataObject-0001"
);
// イベントハンドリングを開始
var callbackId = domain.SubscribeDataObjectHistories(
() => {
// リストの要素が変化した時に呼び出される
}
);
// イベントハンドリングを停止
domain.UnsubscribeDataObjectHistories(callbackId);
var domain = gs2.Datastore.Namespace(
namespaceName: "namespace-0001"
).Me(
gameSession: GameSession
).DataObject(
dataObjectName: "dataObject-0001"
);
var it = domain.DataObjectHistories(
);
List<EzDataObjectHistory> items = new List<EzDataObjectHistory>();
while (it.HasNext())
{
yield return it.Next();
if (it.Error != null)
{
onError.Invoke(it.Error, null);
break;
}
if (it.Current != null)
{
items.Add(it.Current);
}
else
{
break;
}
}
const auto Domain = Gs2->Datastore->Namespace(
"namespace-0001" // namespaceName
)->Me(
AccessToken
)->DataObject(
"dataObject-0001" // dataObjectName
);
// イベントハンドリングを開始
const auto CallbackId = Domain->SubscribeDataObjectHistories(
[]() {
// リストの要素が変化した時に呼び出される
}
);
// イベントハンドリングを停止
Domain->UnsubscribeDataObjectHistories(CallbackId);
Warning
このイベントはSDKがもつローカルキャッシュの値が変更された時に呼び出されます。
ローカルキャッシュは SDK が持つ API の実行、または GS2-Gateway の通知を有効にした GS2-Distributor 経由でのスタンプシートの実行、または GS2-Gateway の通知を有効にした GS2-JobQueue の実行によって変化したもののみが対象となります。
そのため、これらの方法以外で値が変更されてもコールバックは呼び出されません。