我应该在我的应用程序中使用Android SharedReferences或SQLite进行持久化吗?

我应该在我的应用程序中使用Android SharedReferences或SQLite进行持久化吗?,android,multithreading,sqlite,sharedpreferences,android-sharedpreferences,Android,Multithreading,Sqlite,Sharedpreferences,Android Sharedpreferences,当用户登录到我正在开发的应用程序时,后端会发回有关该用户的信息。我希望保留这些信息,以便在没有网络访问的情况下将其用于其他活动 我知道Android的两个主要持久性选项是SharedPreferes和SQLite,我正在尝试确定哪个更适合我的用例。有三个要求: 要存储的数据大多是少量的基本数据类型或简单引用类型,但也可能需要存储派生类型的数组或对象 读取和写入数据应尽可能简单 写入的数据必须在任何后续读取时可用 下面是我试图比较SharedReferences和SQLite在这些维度上的差异。(

当用户登录到我正在开发的应用程序时,后端会发回有关该用户的信息。我希望保留这些信息,以便在没有网络访问的情况下将其用于其他活动

我知道Android的两个主要持久性选项是SharedPreferes和SQLite,我正在尝试确定哪个更适合我的用例。有三个要求:

  • 要存储的数据大多是少量的基本数据类型或简单引用类型,但也可能需要存储派生类型的数组或对象
  • 读取和写入数据应尽可能简单
  • 写入的数据必须在任何后续读取时可用
  • 下面是我试图比较SharedReferences和SQLite在这些维度上的差异。(请注意,关于StackOverflow还有其他一些问题需要比较SharedReferences和SQLite-,但答案并没有涉及所有三个维度。)

    共享引用

  • 最自然地使用原始引用类型和简单引用类型,但GSON可以用于存储任何类型的数据
  • 可以从UI线程写入和读取数据
  • 由于竞争条件,无法保证写入SharedReferences的数据在任何后续读取时都可用
  • SQLite

  • 可以以自然的方式使用它来存储任何复杂程度的结构化数据
  • 数据应该在与UI线程分离的线程中写入和读取
  • 使用singleton DatabaseHelper可以保证写入数据库的数据在任何后续读取时都可用
  • 如果我的评估是正确的,那么SharedPreferences竞争条件似乎意味着我必须使用SQLite来满足需求,尽管这样做更复杂。但是我的评估正确吗?

    你说:

    少量基本数据类型或简单引用类型

    当然,共享参考是首选。如果可以将图像转换为具有许多相似的数据行,这些数据行都是唯一的行,那么可以使用SQLite。您有三个需求,其中没有一个需要存储大量相似但独特的数据

    另一方面:

    可能还需要存储派生类型的数组或对象


    我建议将这些数据存储在私人文本文件中,并在每次应用程序启动时尝试解码数据(如果存在)

    谢谢你,阿巴斯。但是SharedReference的写入延迟仍然是一个问题(如果我说的没错的话)。我编辑这个问题是为了强调这一点。@stevehs17,当您想写入SharedReferences时,可以使用
    Editor.apply()
    而不是
    Editor.commit()
    <代码>编辑器.apply()方法是异步的,不会给您带来太多麻烦。阿巴斯:无论我使用commit()还是apply(),如果我随后尝试检索我保存的值,我不清楚如果我尝试检索得太快,它是否可以保证可用。这是我关心的。@stevehs17如果使用
    commit()
    ,则不必担心检索已保存的数据,因为它不是异步方法,并且在该方法完成之前,UI线程不会向前移动。我相信它会像你期望的那样工作。只要运行一个小测试,您就会看到。谢谢,阿巴斯。但是如果我必须等待commit()返回,那么我认为不应该从UI线程调用它。