使用哪种Android数据存储技术?
Android文档在下面有以下选项,但不能解释每种情况最适合哪种情况。 每种方法的优缺点是什么? 例如在什么情况下SQL比Shared Preferences更好?
- 共享首选项
- 内部存储器
- 外置储存
- SQLite数据库
- networking连接
Android中的不同存储选项
内容提供商
-
考虑从应用程序1添加到设备的结构化数据不能被存在于相同设备中的另一应用程序2访问,但是由
application1
添加到设备的configuration文件照片可用于运行在相同设备中的application2
-
考虑Android设备作为一个城市,其中的应用程序是在城市的房子,在房子(应用程序)的人是数据。 现在内容提供者就像城市中的经纪人(android设备)。 该经纪人为在城市中寻找不同房屋的人们提供访问,作为android设备中的内容提供者提供针对不同应用的设备中的数据的访问。
共享首选项
-
考虑我有一个应用程序说,我用来login到我的帐户的脸书应用程序。
-
现在,我第一次input我的用户名和密码来访问我的帐户。 假设我在一个小时后退出应用程序,我再次使用同一个Face book Applogin到我的应用程序。
-
我必须再次input用户名和密码才能login到我的帐户,并为我的应用程序和其他设置设置了一个主题,以显示我的应用程序在当前手机中的外观
-
这是不必要的,因为我正在使用我的手机login到应用程序。 所以我会一直使用我的手机一次又一次地login,从而一次又一次地input我的凭据更多的工作显示它不是一个用户友好的应用程序
-
共享首选项在这种情况下非常方便,我可以使用它的function在xml文件中共享我的数据。我的手机中安装的Android应用程序中实际存在即使closures应用程序也不会销毁的应用程序。 在这里我们可以保存当前应用程序的用户偏好数据。
-
结果下一次我打开我的手机应用程序,我可以看到数据自动填写必要的领域和设置
文件存储
-
在Android中,我们可以使用设备存储空间来存储应用程序中的数据。 数据types涉及文本文件,图像文件,video文件,audio文件等。
-
如图所示,我们可以看到有两个地方可以做到这一点。 一种方法是将原始文件写入主存储/辅助存储。 另一种方法是将caching文件写入主存储/辅助存储。
-
原始数据和caching数据之间也存在差别,一旦用户存储在内存中的原始数据必须由用户明确地删除,否则将一直存在。 存储在内存中的caching数据不是永久数据,因为如果感觉内存不足,系统会自动删除它。
内部存储器:
-
考虑到应用程序中的用户已经将数据存储在内部存储器中,那么只有该应用程序的用户才能访问移动设备上的数据,并且在用户卸载应用程序时数据会自动删除。 说到哪个内部存储器是私有的。
-
应用程序内部存储目录使用名称包名称存储在android文件系统中的特殊位置。
-
当前应用程序的其他应用程序或用户不能访问由特定用户和特定应用程序设置的文件,除非用户明确可用于可读/可写访问。
SQLite的
-
Sqlite用于在Android应用程序正在运行的移动设备中本地存储更多的结构化数据。 结构化数据如图所示,就像学生的行列信息一样。
-
Sqlite提供类似于Mysql和Oracle的function,但function有限。 其中一些涉及对表执行查询操作。 虽然有像创build视图的function,但也有一些function不可用,如存储过程。
-
Sqlite是非常有用的存储复杂和大型数据,可以下载一次,可以反复使用,直到应用程序正在运行。 当应用程序closures时,sqlite数据库也被销毁。
把所有的东西放在一起
- 共享首选项适用于存储应用程序的首选项和其他小数据。 对于一些数据types来说,这是一个非常简单的持久string键存储:boolean,float,int,long和string。 所以例如,如果我的应用程序有login,我可能会考虑将会话密钥存储为SharedPreferences中的string。
- 内部存储对于存储用户不需要访问的应用程序数据非常有用,因为用户无法轻松访问内部存储。 可能对caching,日志和其他东西有好处。 任何只有应用程序打算创build读取更新或删除。
-
外部存储 。 与我刚才所说的完全相反。 Dropbox应用程序可能使用外部存储来存储用户的Dropbox文件夹,以便用户可以轻松访问Dropbox应用程序之外的这些文件,例如使用文件pipe理器。
-
当你要使用大量的结构化数据和相对严格的模式来pipe理SQLite数据库时, SQLite数据库是非常棒的。 用外行人的话来说,SQLite就像MySQL或PostgreSQL,除了数据库充当服务器守护进程,然后从CGI脚本(如php)中查询,它只是存储在一个.db文件中,并通过一个简单的库访问和查询在应用程序内。 虽然SQLite无法像专用数据库一样扩展,但对于像Android应用程序这样的小型应用程序来说,它非常快捷。 我会使用SQLite数据库,如果我正在做一个聚合和下载食谱的应用程序,因为这种数据是相对结构化和数据库将允许它扩展好。 数据库是不错的,因为把你所有的数据写到一个文件中,然后用你自己的私有格式parsing它就没有什么乐趣了。 再次,以XML或JSON存储数据不会那么糟糕。
-
networking连接是指在云上存储数据。 HTTP或FTP文件和通过java.net。*包进行的内容传输可以实现这一点。
SharedPreferences主要用于您可以通过“设置”菜单访问的应用程序特定设置,例如应用程序设置。 保持一切简单 – 主要是布尔标志,短string或整数是个好主意。 SharedPreferences数据在设备重新启动时保留,并在卸载应用程序时被删除。 数据保存为键值对。
内部存储主要用于较大的非持久性数据存储。 如果要处理图像,短video剪辑,大文本文件等,则需要使用内部存储器。但是,不会将处理的数据存储在内部存储器中 – 其function更像是CPU的RAM。 应用程序可用的内部存储量取决于设备,但将任何内容保持在1MB以下总是一个好主意。 数据通过文件path被引用。
外部存储不仅指SD卡存储,而且对于高端手机而言,这可能意味着内部可安装存储(如Galaxy Nexus或S2)。 这是存储大video文件,高分辨率图像以及要在应用程序中分析的20兆字节文本文件的位置。 如果您交换SD卡,这也是存储您希望跨设备共享的数据的地方。 数据也通过文件path被引用。
SQLite数据库是你可以在常规数据库中存储几乎任何东西的地方 – 利用将表格,行和列组织起来的优势。 它最适合你想要在UI中显示的东西,最好的例子就是被称为CursorAdapter的伟大发明。 此处存储的数据在设备重启时也会持续存在,并会在卸载应用程序时被删除。 如果你把它连接到一个ContentProvider,你也可以通过sqlite数据库在应用程序之间共享数据。 使用Cursor访问数据,您可以像调用sql语句一样调用方法。
networking连接并不是一种真正的数据存储技术,但可以是一种为特定用户提供数据的方式,只要设备连接到互联网,使用某种authentication即可。 您必须在每次应用程序需要时下载数据或进行一次性数据同步(这最终导致上述另一个存储选项)之间取得平衡。
共享首选项是键/值对,仅此而已。 所以,如果你想跟踪说,学生和他们的考试成绩,它真的不会那么好。
数据库就是这样一个数据库。 您可以根据需要定义许多列(和表)来完成工作。
如果它是您的应用程序的首选项,请使用共享首选项(几乎所有我能想到的首选项都可以这样做),如果更复杂一些,请使用数据库。