使用哪种Android数据存储技术?

49

安卓文档提供以下选项,但没有解释每种选项最适合哪种情况。每种方法的优缺点是什么?例如,在什么情况下使用 SQL 比共享首选项更好?

  • 共享首选项
  • 内部存储
  • 外部存储
  • SQLite 数据库
  • 网络连接

对于信息,了解到onSavedInstanceState也是Android中的一种数据持久化技术可能会很有用,尽管它不能在应用程序或手机重新启动时保留。它可以用于在活动被销毁并稍后重新启动时恢复活动状态。一些细节 - 请参考如何使用onSavedInstanceState示例onSaveInstanceState()和onRestoreInstanceState()何时被调用? - RBT
4个回答

110
the device and hence can be accessed by different applications.

  • So, once I login to my Face book App, I can save my username and password in the shared preferences xml file. Now next time when I open my Face book App, it will automatically fetch my credentials from the xml file and log me in without having to enter my details again.


  • Internal Storage

    enter image description here

    • Internal storage is private to the application which means data added by one application is not accessible to other applications. This storage is always available to the application and data stored in it remains even if the app is uninstalled.

    • The maximum amount of data that can be stored in internal storage is limited and varies from device to device.


    External Storage

    enter image description here

    • External storage is used to store data that should be available to other apps and to the user as well. It can be removed or replaced by the user (e.g. an SD card).

    • The maximum amount of data that can be stored in external storage is larger than that of internal storage.

    • However, external storage is not always available, because the user may remove it or the device may not have a removable external storage slot.

    在我的手机中安装了Android应用,即使关闭应用程序也不会被销毁。在这里我们可以保存当前应用的用户偏好数据。

  • 因此,下次我打开手机上的应用程序时,可以自动填写必要字段并设置显示。


  • 文件存储

    进入图像描述

    • 在Android中,我们可以使用设备存储空间来存储应用程序中的数据。这些数据类型包括文本文件、图像文件、视频文件、音频文件等。

    • 如图所示,我们可以看到有两种方法可以实现这一点。一种方法是将原始文件写入主/次存储器。另一种方法是将缓存文件写入主/次存储器。

    • 在存储原始数据和缓存数据之间也有区别,用户存储在内存中的原始数据必须由用户显式地删除,否则它将一直存在。存储在内存中的缓存数据不是永久性数据,因为系统会在感觉到存储器短缺时自动删除它。

    进入图像描述

    内部存储:

    • 考虑一个用户在一个应用程序中存储了数据,那么只有该应用程序的用户可以访问该数据,并且当用户卸载该应用程序时,该数据会自动删除。说到这里,内部存储是私有的。

    • 应用程序的内部存储目录使用特定的位置在Android文件系统中以包名存储。

    • 除非显式地为用户提供可读/可写访问权限,否则其他应用程序或当前应用程序的用户不能访问某个特定用户和特定应用程序设置的文件。

    enter image description here


    SQLite

    enter image description here

    • Sqlite用于在移动设备上存储更结构化的数据,其中运行Android应用程序。 结构化数据涉及如图所示的内容,例如以行列形式显示的学生信息。

    • Sqlite提供了与Mysql和oracle类似的功能,但功能受到限制。 其中一些操作涉及对表执行查询操作。 虽然有创建视图等功能,但也有一些不可用的功能,例如存储过程。

    • Sqlite非常有助于存储复杂和大量的数据,这些数据可以下载一次并一直使用,直到应用程序停止运行。 当应用程序关闭时,sqlite数据库也将被销毁。


    将所有元素组合起来

    enter image description here


    11
    只有在应用程序被卸载或者按下“设置>清除数据”按钮时,SQLite 数据才会被销毁,而不是在应用程序关闭时。 - blizzard
    根据@b1izzard的说法,如果存储了任何数据,它还会从内存中删除数据。 - sandeep_kosta
    9
    我认为这可以成为一份指南,或类似于“如何回答 StackOverflow 的问题”的东西。它不是一个答案,而是一堂课。非常感谢兄弟! - atapi19
    阿门,这就像是在Android中存储数据的圣经一样。 - MRodrigues
    1
    这是一个很好的答案。图片有来源吗? - MGDavies
    @MGDavies...我是用MS PowerPoint创建的这些图像 :) - Devrath

    38
    • Shared preferences 适用于存储应用程序的偏好设置和其他小数据。它是一个非常简单的持续性字符串键值存储,适用于几个数据类型:boolean, float, int, long 和 string。例如,如果我的应用程序有登录功能,我可以考虑将会话密钥存储为字符串在SharedPreferences中。
    • Internal storage 适用于存储用户不需要访问的应用程序数据,因为用户无法轻松访问内部存储。这可能适用于缓存、日志和其他仅供应用程序进行创建读取更新或删除的东西。
    • External storage。非常适合上述相反情况。Dropbox 应用程序可能使用外部存储来存储用户的 Dropbox 文件夹,以便用户可以轻松地在 Dropbox 应用程序之外访问这些文件,例如使用文件管理器。

    • SQLite 数据库非常适合管理大量结构化数据和相对严格的模式。简单来说,SQLite 就像 MySQL 或 PostgreSQL,但数据库不像服务器守护进程那样接收 CGI 脚本(如 PHP)的查询,而是存储在 .db 文件中,并通过应用程序内的简单库进行访问和查询。虽然 SQLite 不能像专用数据库那样扩展得很大,但对于像 Android 应用程序这样的小型应用程序非常快速和方便。如果我正在制作一个聚合和下载食谱的应用,我会使用 SQLite 数据库,因为这种类型的数据相对结构化,并且数据库可以让其扩展性良好。数据库很好,因为将所有数据写入文件,然后在自己的专有格式中解析它不是一件好事。不过,将数据存储在 XML 或 JSON 中也不会那么糟糕。

    • Network connection 是指将数据存储在云上。HTTP 或 FTP 文件和内容传输通过 java.net.* 包来实现。


    2
    内容提供者怎么样? - magicianiam
    7
    ContentProvider 是一种用于向其他应用程序提供数据的方案/接口;它并不直接涉及实际数据的存储,尽管通常它们将由数据库支持。 - matt5784
    感谢您这么详细地解释(也感谢matt5784提供的ContentProvider提示) - Ankit Aggarwal
    1
    关于XML或JSON用于存储文件中的结构化数据的评论:如果使用XML,请参见android.util.xml类。 如果使用JSON,请搜索“Java中的JSON”。如果您计划一次读取/写入相对复杂的数据到Java对象中,则两者都很有用。(如果数据量太大无法一次全部加载到内存中,则改用SQLite数据库。同样,如果数据的某些部分经常更改,则最好将每个更改的部分写回DB。) 对于某些程序员来说,XML或JSON比数据库模式+ SQL查询更为舒适。 - ToolmakerSteve

    16

    SharedPreferences主要用于应用程序特定设置,您可以通过“设置”菜单访问这些设置 - 如应用程序设置。在这里保持简单是个好主意,大多数都是布尔标志、短字符串或整数。SharedPreferences数据会在设备重启时持久化,并随着应用卸载而删除。数据保存为键值对。

    内部存储主要用于较大的非永久性数据存储。如果您想处理图像、短视频剪辑、大型文本文件等,则需要使用内部存储。但您不会将处理后的数据存储在内部存储中 - 它的功能更像是CPU的RAM。可供应用程序使用的内部存储容量取决于设备,但始终保持任何文件大小在1MB以下是个好主意。数据通过其文件路径引用。

    外部存储不仅指SD卡存储,对于高端手机,这可能意味着内部可挂载存储(例如Galaxy Nexus或S2)。这是存储大型视频文件、高分辨率图像和您想在应用程序中解析的20兆字节文本文件的位置。如果您交换SD卡,这也是存储想要在设备间共享的数据的地方。数据也通过其文件路径引用。

    SQLite数据库是您存储几乎任何想在常规数据库中存储的东西的地方 - 通过将事物组织成表、行和列的优势。它最适合与您想要显示为列表的UI一起使用 - 最好的例子就是众所周知的CursorAdapter。存储在此处的数据也会在设备重启时持续存在,并随着应用卸载而删除。如果将其连接到内容提供程序,还可以跨应用程序共享数据。数据是使用游标(Cursor)访问的,您可以调用方法来执行sql语句。

    网络连接并不是一种数据存储技术,但可以通过某种身份验证方式,为特定用户提供持久化数据的方式,只要设备与互联网连接。您需要在下载应用程序每次需要数据或进行一次数据同步之间取得平衡,后者最终将导致上述存储选项之一。


    4

    共享首选项是键/值对,没有其他内容。因此,如果您想跟踪学生及其考试成绩,那么这种方法并不适用。

    数据库就是一个数据库。您可以定义尽可能多的列(和表)来完成工作。

    如果是应用程序的首选项,请使用共享首选项(我能想到的几乎所有首选项都可以通过这种方式完成),如果是其他更复杂的内容,请使用数据库。


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