【问题标题】:Android best way to save settings and dataAndroid 保存设置和数据的最佳方式
【发布时间】:2015-10-15 05:25:20
【问题描述】:

我需要保存一些intboolean 用于设置,现在我正在使用SharedPreference 进行设置,我想知道这种方式是否有问题,我可以确定这些数据不会被触摸或丢失?使用这种方式有禁忌吗?

现在真正的问题是:我需要保存一些字符串,基本上类似于... 一些 url 和 url 的文本描述,但我真的不认为 SharedPreference 会起作用,因为我没有'不知道这些项目有多少,可能是5、8、10,我不知道,这些数据将通过互联网下载,所以:我该如何保存它们?

我不是很擅长 Android 编程,但我很久以前学习过 Java,我可以将它保存为文件并解析它吗?我想我可以创建一个Serializable 包装类并将项目写入文件但是......它真的安全吗?用户可以编辑这些文件或删除它们,我认为如果我可以将它们保存在一些......“仅限应用程序锁定”文件夹中可能会更好,这样的东西是否存在?如果是,我如何访问它?

【问题讨论】:

  • 所有非常有趣和有用的答案,我只选择了一个解释了 SharedPreference 如何工作以及如何保存其他东西的答案,还有另一个答案与相同的东西,但它是 2一分钟后,这就是为什么,无论如何你们都帮了我很多,所以谢谢

标签: android file sharedpreferences settings serializable


【解决方案1】:

SharedPreference 基于存储在 app 文件夹中的 xml 文件。就像在另一个 xml 文件上写入信息一样安全。它主要用于应用程序配置。对于其他类型的数据,最好使用数据库(SQLite)或json(比xml性能更好)。

在 android 中,您将使用许多您已经在桌面版 Java 上学习过的概念。但平台却大不相同,尤其是在性能方面。

【讨论】:

    【解决方案2】:

    Android 应用就像 Linux 系统中的用户一样,每个用户都有自己的私人空间,应用程序也是如此,每个应用程序都有自己的存储空间,而应用程序相关的数据将存放在此处。 默认情况下,SharedPreferences 存储在MODE_PRIVATE,因此它们只能由您的应用程序访问,其他外部应用程序将无法访问它们。如果您想分享您的一些偏好,您可以选择其他存储模式MODE_APPENDMODE_WORLD_READABLEMODE_WORLD_WRITEABLE

    关于MODE_PRIVATE 的所有内容都适用于没有根设备的情况。

    有关 Android 安全性的更多详细信息,您可以查看这些resources

    【讨论】:

      【解决方案3】:

      sharedPreferences 使用起来是完全安全的,加上您声明要实例化的类的隐私,只能由您的应用程序使用,也可以授予其他应用程序使用的权限,以提供属性 Context.MODE_PRIVATE。任何人都可以看到您的设置的唯一方法是成为 root 用户,并且该用户知道根据您的偏好查找 .XML 的路径,个人 SharedPreferences 是完全可行的。另一种方法是使用 SQLite 数据库,但作为 root 用户首选项可以访问您的 .DB 并修改任何数据库管理器数据,例如 navicat

      【讨论】:

        【解决方案4】:

        我强烈推荐使用Facebook Conceal。 SharedPreferences 可以由 root 用户在使用的 MODE 上独立修改,隐藏钥匙串文件不能。

        Conceal 会创建只有应用才能访问的加密文件,并且您的设置是安全的。当然用户可以删除这个文件,但是你不能阻止删除数据,只能修改。

        非常容易使用:

        // Creates a new Crypto object with default implementations of 
        // a key chain as well as native library.
        Crypto crypto = new Crypto(
          new SharedPrefsBackedKeyChain(context),
          new SystemNativeCryptoLibrary());
        
        FileOutputStream fileStream = new FileOutputStream(file);
        
        // Creates an output stream which encrypts the data as
        // it is written to it and writes it out to the file.
        OutputStream outputStream = crypto.getCipherOutputStream(
          fileStream,
          entity);
        
        // Write plaintext to it.
        outputStream.write(plainText);
        outputStream.close();
        

        享受;)

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-08-08
          • 2011-12-02
          • 2021-11-16
          • 2022-12-21
          • 1970-01-01
          • 1970-01-01
          • 2021-04-19
          • 1970-01-01
          相关资源
          最近更新 更多