Xamarin-安卓设备内存数据持久化存储的实现方法及示例获取
嘿,我来帮你搞定Xamarin.Android里的游戏数据持久化问题——毕竟重启后数据不丢可是游戏的基本操作嘛!下面给你几种实用的方案,附完整示例代码,你可以根据自己的需求选:
适合存储键值对类型的轻量数据,比如玩家昵称、最高分、音量设置这类小数据,系统会自动把数据存在APP的私有沙盒目录里,完全不用担心重启后丢失。
可以封装一个工具类来简化操作:
using Android.Content; public class GamePrefsHelper { private readonly ISharedPreferences _gamePrefs; // 构造函数传入上下文(Activity/Fragment都可以) public GamePrefsHelper(Context context) { // 创建或获取名为"GameCoreData"的SharedPreferences文件,私有模式只有当前APP能访问 _gamePrefs = context.GetSharedPreferences("GameCoreData", FileCreationMode.Private); } // 保存字符串(比如玩家昵称) public void SaveString(string key, string value) { var editor = _gamePrefs.Edit(); editor.PutString(key, value); editor.Apply(); // 异步保存,不阻塞主线程,推荐用这个 // 如果需要立即生效可以用editor.Commit()(同步操作) } // 读取字符串,支持默认值 public string GetString(string key, string defaultValue = "") { return _gamePrefs.GetString(key, defaultValue); } // 保存整数(比如最高分、关卡数) public void SaveInt(string key, int value) { var editor = _gamePrefs.Edit(); editor.PutInt(key, value); editor.Apply(); } // 读取整数 public int GetInt(string key, int defaultValue = 0) { return _gamePrefs.GetInt(key, defaultValue); } }
使用示例(在Activity里):
// 初始化工具类 var prefsHelper = new GamePrefsHelper(this); // 游戏结束后保存最高分 prefsHelper.SaveInt("PlayerHighScore", 1234); // 重启游戏后读取 int savedHighScore = prefsHelper.GetInt("PlayerHighScore");
方案二:SQLite(结构化复杂数据存储)
如果你的游戏有大量结构化数据,比如玩家的道具列表、角色属性、关卡进度详情,那SQLite绝对是最佳选择。Xamarin可以用sqlite-net-pcl这个NuGet包来快速实现。
首先安装NuGet包:sqlite-net-pcl
第一步:定义数据实体类
using SQLite; // 指定表名 [Table("PlayerProfiles")] public class PlayerProfile { // 主键,自增 [PrimaryKey, AutoIncrement] public int Id { get; set; } public string PlayerName { get; set; } public int CurrentLevel { get; set; } public int TotalScore { get; set; } // SQLite不直接支持List,我们可以把列表序列化为JSON字符串存储 [Ignore] // 告诉SQLite忽略这个属性 public List<string> Inventory { get; set; } // 实际存储到数据库的JSON字段 [Column("InventoryJson")] public string InventoryJson { get => Newtonsoft.Json.JsonConvert.SerializeObject(Inventory); set => Inventory = Newtonsoft.Json.JsonConvert.DeserializeObject<List<string>>(value); } }
第二步:封装数据库操作工具类
using SQLite; using System.IO; public class GameDbHelper { private SQLiteConnection _dbConn; public GameDbHelper() { // 获取APP私有存储目录的数据库路径 string dbPath = Path.Combine( System.Environment.GetFolderPath(System.Environment.SpecialFolder.Personal), "GameDatabase.db3" ); // 创建数据库连接 _dbConn = new SQLiteConnection(dbPath); // 如果表不存在则创建 _dbConn.CreateTable<PlayerProfile>(); } // 保存或更新玩家数据(Id为0则插入,否则更新) public void SaveOrUpdatePlayer(PlayerProfile profile) { if (profile.Id == 0) { _dbConn.Insert(profile); } else { _dbConn.Update(profile); } } // 根据玩家名称查询数据 public PlayerProfile GetPlayerByName(string playerName) { return _dbConn.Table<PlayerProfile>().FirstOrDefault(p => p.PlayerName == playerName); } }
使用示例:
// 初始化数据库工具类 var dbHelper = new GameDbHelper(); // 创建玩家数据 var newPlayer = new PlayerProfile { PlayerName = "WarriorX", CurrentLevel = 8, TotalScore = 5678, Inventory = new List<string> { "Fire Sword", "Magic Shield", "Health Potion" } }; // 保存数据 dbHelper.SaveOrUpdatePlayer(newPlayer); // 重启游戏后读取 var savedPlayer = dbHelper.GetPlayerByName("WarriorX");
方案三:自定义文件存储(JSON格式)
如果不想用SQLite,也可以把游戏数据序列化为JSON,直接存在文件里,适合中等复杂度的非结构化数据。
封装文件存储工具类
using System.IO; using Newtonsoft.Json; public class GameFileStorageHelper { private readonly string _saveFilePath; public GameFileStorageHelper() { // 私有存储目录下的保存文件路径 _saveFilePath = Path.Combine( System.Environment.GetFolderPath(System.Environment.SpecialFolder.Personal), "GameSaveData.json" ); } // 保存任意类型的数据到文件 public void SaveGameData<T>(T data) { string jsonContent = JsonConvert.SerializeObject(data); File.WriteAllText(_saveFilePath, jsonContent); } // 从文件读取数据,不存在则返回默认实例 public T LoadGameData<T>() where T : new() { if (File.Exists(_saveFilePath)) { string jsonContent = File.ReadAllText(_saveFilePath); return JsonConvert.DeserializeObject<T>(jsonContent); } return new T(); } }
使用示例:
// 定义你的游戏存档类 public class GameSave { public string PlayerName { get; set; } public int HighScore { get; set; } public Dictionary<string, bool> LevelUnlocked { get; set; } } // 初始化工具类 var fileHelper = new GameFileStorageHelper(); // 保存存档 var currentSave = new GameSave { PlayerName = "NinjaMaster", HighScore = 9876, LevelUnlocked = new Dictionary<string, bool> { { "Level1", true }, { "Level2", true }, { "Level3", false } } }; fileHelper.SaveGameData(currentSave); // 重启后读取存档 var loadedSave = fileHelper.LoadGameData<GameSave>();
内容的提问来源于stack exchange,提问作者Ian Gallegos
相关产品推荐
相关产品推荐

