You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Xamarin-安卓设备内存数据持久化存储的实现方法及示例获取

嘿,我来帮你搞定Xamarin.Android里的游戏数据持久化问题——毕竟重启后数据不丢可是游戏的基本操作嘛!下面给你几种实用的方案,附完整示例代码,你可以根据自己的需求选:

方案一:SharedPreferences(轻量键值对存储)

适合存储键值对类型的轻量数据,比如玩家昵称、最高分、音量设置这类小数据,系统会自动把数据存在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 10:18:45