如何在我的Xamarin Forms应用程序中本地保存一些用户数据?

70

我有一个简单的Xamarin Forms应用程序。现在我有一个简单的POCO对象(例如实例或最近的推文或订单列表等)。

我该如何将此对象存储在设备本地?假设我将其序列化为JSON。

此数据有多安全?它是否是Keychains的一部分?自动备份了吗?

谢谢!

5个回答

92

您有几个选项。

  1. SQLite。如果您有大量数据,则此选项跨平台并且效果很好。您还可以获得事务支持和异步支持的额外奖励。EDIT:过去我建议使用SQLite.Net-PCL。由于涉及Android 7.0支持的问题(以及对支持的明显停止),我现在建议利用最初从中分叉的项目:sqlite-net
  2. 本地存储。有一个很棒的NuGet支持跨平台存储。有关更多信息,请参见PCLStorage
  3. 还有在Xamarin.Forms中实现的Application.Current.Properties,允许简单的键值对数据。

我认为您需要调查并找出哪种方法最适合您的需求。

至于安全性,这取决于您将数据放置在每个设备的位置。 Android默认情况下将应用程序数据存储在安全的应用程序文件夹中(如果您已经rooted,这并不那么安全)。 iOS有几个不同的文件夹,用于基于不同需求的数据存储。阅读更多信息:iOS Data Storage


1
对于非常简单的数据,我也建议使用Application.Current.Properties。但请记住,在设置属性后调用Application.Current.SavePropertiesAsync();。否则,您无法确定它们是否会在应用程序重新启动后继续存在。 - Tillito
11
请记住,Application.Current.Properties 用于暂停-恢复场景。该值通常在应用程序重新启动时不会保留。 - Tillito

25

另一个选择是Xamarin Forms设置插件

例如,如果您需要存储用户实例,只需在存储时将其序列化为JSON,然后在读取时对其进行反序列化。

使用本地设置管理

  • Android:SharedPreferences
  • iOS:NSUserDefaults
  • Windows Phone:IsolatedStorageSettings
  • Windows RT / UWP:ApplicationDataContainer

  public User CurrentUser
  {
     get
     {
        User user = null;
        var serializedUser = CrossSettings.Current.GetValueOrDefault<string>(UserKey);
        if (serializedUser != null)
        {
           user = JsonConvert.DeserializeObject<User>(serializedUser);
        }

        return user;
     }
     set
     {
        CrossSettings.Current.AddOrUpdateValue(UserKey, JsonConvert.SerializeObject(value));
     }
  }

编辑: 现在有一个新的解决方案。只需使用Xamarin.Essentials。

Preferences.Set(UserKey, JsonConvert.SerializeObject(value));
var user= JsonConvert.DeserializeObject<User>(Preferences.Get(UserKey, "default_value");

22

请使用Xamarin.Essentials

Preferences类有助于在键/值存储中存储应用程序首选项。

要保存值:

Preferences.Set("my_key", "my_value");

获取一个值:

var myValue = Preferences.Get("my_key", "default_value");

你能保存一个项目列表吗? - Pxaml
1
@Pxaml,您可以访问https://stackoverflow.com/questions/54903226/how-to-store-lists-in-xamarin-forms-settings-plugin,查看第二个答案。 - chunhunghan

0
如果您想存储一个简单的值,比如字符串,请按照以下示例代码操作。
将"totalSeats.Text"的值设置为来自page1的"SeatNumbers"键。
Application.Current.Properties["SeatNumbers"] = totalSeats.Text;
await Application.Current.SavePropertiesAsync();

然后,您可以从任何其他页面(page2)简单地获取该值

var value = Application.Current.Properties["SeatNumbers"].ToString();

此外,您可以将该值设置为另一个标签或输入框等。
SeatNumbersEntry.Text = value;

-1
如果是键值(一个值)数据存储,请按照以下代码进行操作: Application.Current.Properties["AppNumber"] = "123" await Application.Current.SavePropertiesAsync(); 获取相同的值: var value = Application.Current.Properties["AppNumber"];

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接