如何解决带有 Room 数据库的 Google Play 游戏服务
我们有一个简单的问答游戏,它目前使用 Room 数据库来存储包括用户进度在内的所有数据。我们现在想要集成 Google Play 游戏服务以将进度存储在云端,以便用户在更换设备或重新安装游戏时可以查看进度。
目前,我们在 xml 文件中有游戏类别和级别详细信息,然后在第一次运行应用程序时对其进行解析并将数据存储在 Room 数据库中。
我们查看了游戏服务的文档,知道有这个方法可以保存游戏。
private Task<SnapshotMetadata> writeSnapshot(Snapshot snapshot,byte[] data,Bitmap coverImage,String desc) {
// Set the data payload for the snapshot
snapshot.getSnapshotContents().writeBytes(data);
// Create the change operation
SnapshotMetadataChange metadataChange = new SnapshotMetadataChange.Builder()
.setCoverImage(coverImage)
.setDescription(desc)
.build();
SnapshotsClient snapshotsClient =
Games.getSnapshotsClient(this,GoogleSignIn.getLastSignedInAccount(this));
// Commit the operation
return snapshotsClient.commitAndClose(snapshot,metadataChange);
}
但问题是,这种方法需要字节来写入快照,而我们在Room数据库中有数据,我们可以从Room db传递数据还是必须更改本地数据库?
解决方法
在写问题时,完全不清楚 byte[] data
到底是什么。
将 SnapshotsClient
与 SnapshotMetadata
一起使用(如文档所示,还有更多的属性需要设置)。 String
可以轻松转换为 byte[]
。您需要某种类型的 SaveGame
模型,开始时可能是房间 @Entity
;那么 String
和 GSON 可以提供 byte[]
个 getter/setter:
@Entity(tableName = "savegames")
public class SaveGame {
@PrimaryKey
public int id;
...
/** return a byte-array representation (this is probably what you're asking for). */
public byte[] toByteArray() {
return new Gson().toJson(this).getBytes();
}
/** TODO: initialize instance of {@link SaveGame} from a byte-array representation - so that it will work both ways. */
public void fromByteArray(byte[] bytes) {
SaveGame data = new Gson().fromJson(new String(bytes,StandardCharsets.UTF_8),SaveGame.class);
...
}
}
或者将 byte[]
传入构造函数:
@Entity(tableName = "savegames")
public class SaveGame {
@PrimaryKey
public int id;
...
public SaveGame() {}
@Ignore
public SaveGame(byte[] bytes) {
SaveGame data = new Gson().fromJson(new String(bytes,SaveGame.class);
...
}
...
}
同样,从 SaveGame
或 Room
负载加载 SnapshotsClient
没有问题。即使不使用 Room,仍然需要编码/解码快照有效载荷的方法 - 无论保存游戏参数或格式如何。相反,可以定义一个 byte[]
,其中每个数字都可以代表另一个保存游戏参数;这可能取决于要保存和恢复的有效负载的复杂程度。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。