安卓文档提供以下选项,但没有解释每种选项最适合哪种情况。每种方法的优缺点是什么?例如,在什么情况下使用 SQL 比共享首选项更好?
- 共享首选项
- 内部存储
- 外部存储
- SQLite 数据库
- 网络连接
安卓文档提供以下选项,但没有解释每种选项最适合哪种情况。每种方法的优缺点是什么?例如,在什么情况下使用 SQL 比共享首选项更好?
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 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 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文件系统中以包名存储。
除非显式地为用户提供可读/可写访问权限,否则其他应用程序或当前应用程序的用户不能访问某个特定用户和特定应用程序设置的文件。
Sqlite用于在移动设备上存储更结构化的数据,其中运行Android应用程序。 结构化数据涉及如图所示的内容,例如以行列形式显示的学生信息。
Sqlite提供了与Mysql和oracle类似的功能,但功能受到限制。 其中一些操作涉及对表执行查询操作。 虽然有创建视图等功能,但也有一些不可用的功能,例如存储过程。
Sqlite非常有助于存储复杂和大量的数据,这些数据可以下载一次并一直使用,直到应用程序停止运行。 当应用程序关闭时,sqlite数据库也将被销毁。
External storage。非常适合上述相反情况。Dropbox 应用程序可能使用外部存储来存储用户的 Dropbox 文件夹,以便用户可以轻松地在 Dropbox 应用程序之外访问这些文件,例如使用文件管理器。
SQLite 数据库非常适合管理大量结构化数据和相对严格的模式。简单来说,SQLite 就像 MySQL 或 PostgreSQL,但数据库不像服务器守护进程那样接收 CGI 脚本(如 PHP)的查询,而是存储在 .db 文件中,并通过应用程序内的简单库进行访问和查询。虽然 SQLite 不能像专用数据库那样扩展得很大,但对于像 Android 应用程序这样的小型应用程序非常快速和方便。如果我正在制作一个聚合和下载食谱的应用,我会使用 SQLite 数据库,因为这种类型的数据相对结构化,并且数据库可以让其扩展性良好。数据库很好,因为将所有数据写入文件,然后在自己的专有格式中解析它不是一件好事。不过,将数据存储在 XML 或 JSON 中也不会那么糟糕。
Network connection 是指将数据存储在云上。HTTP 或 FTP 文件和内容传输通过 java.net.* 包来实现。
SharedPreferences主要用于应用程序特定设置,您可以通过“设置”菜单访问这些设置 - 如应用程序设置。在这里保持简单是个好主意,大多数都是布尔标志、短字符串或整数。SharedPreferences数据会在设备重启时持久化,并随着应用卸载而删除。数据保存为键值对。
内部存储主要用于较大的非永久性数据存储。如果您想处理图像、短视频剪辑、大型文本文件等,则需要使用内部存储。但您不会将处理后的数据存储在内部存储中 - 它的功能更像是CPU的RAM。可供应用程序使用的内部存储容量取决于设备,但始终保持任何文件大小在1MB以下是个好主意。数据通过其文件路径引用。
外部存储不仅指SD卡存储,对于高端手机,这可能意味着内部可挂载存储(例如Galaxy Nexus或S2)。这是存储大型视频文件、高分辨率图像和您想在应用程序中解析的20兆字节文本文件的位置。如果您交换SD卡,这也是存储想要在设备间共享的数据的地方。数据也通过其文件路径引用。
SQLite数据库是您存储几乎任何想在常规数据库中存储的东西的地方 - 通过将事物组织成表、行和列的优势。它最适合与您想要显示为列表的UI一起使用 - 最好的例子就是众所周知的CursorAdapter。存储在此处的数据也会在设备重启时持续存在,并随着应用卸载而删除。如果将其连接到内容提供程序,还可以跨应用程序共享数据。数据是使用游标(Cursor)访问的,您可以调用方法来执行sql语句。
网络连接并不是一种数据存储技术,但可以通过某种身份验证方式,为特定用户提供持久化数据的方式,只要设备与互联网连接。您需要在下载应用程序每次需要数据或进行一次数据同步之间取得平衡,后者最终将导致上述存储选项之一。
共享首选项是键/值对,没有其他内容。因此,如果您想跟踪学生及其考试成绩,那么这种方法并不适用。
数据库就是一个数据库。您可以定义尽可能多的列(和表)来完成工作。
如果是应用程序的首选项,请使用共享首选项(我能想到的几乎所有首选项都可以通过这种方式完成),如果是其他更复杂的内容,请使用数据库。
onSavedInstanceState
也是Android中的一种数据持久化技术可能会很有用,尽管它不能在应用程序或手机重新启动时保留。它可以用于在活动被销毁并稍后重新启动时恢复活动状态。一些细节 - 请参考如何使用onSavedInstanceState示例和onSaveInstanceState()和onRestoreInstanceState()何时被调用? - RBT