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

Dec*_*nna 47 java sqlite android data-storage sharedpreferences

android文档在下面有以下选项,但没有解释每种情况最适合的情况.每种方法的优缺点是什么?例如,在什么条件下SQL会优于共享首选项?

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

Dev*_*ath 105

Android中的不同存储选项

在此输入图像描述


内容提供商

在此输入图像描述

  • 考虑从application1添加到设备的结构化数据不能被同一设备中存在的另一个应用程序2访问,但添加到设备的配置文件照片application1可用于application2在同一设备中运行

  • 将android设备视为一个城市,其中的应用程序是城市中的房屋,房屋中的人(应用程序)是数据.现在内容提供商就像城市中的经纪人(android设备).该代理为城市中的人提供访问,以便在Android设备中的内容提供者提供对不同应用程序的设备中的数据的访问时查找不同的房屋.


共享首选项

在此输入图像描述

  • 考虑我有一个应用程序说我用来登录我的帐户的脸书应用程序.

  • 现在我第一次输入用户名和密码来访问我的帐户.假设我在一小时后退出应用程序再次使用相同的Face Book App再次登录我的应用程序.

  • 我必须再次输入用户名和密码才能登录我的帐户,并为我的应用程序设置主题,并设置我的应用在当前手机中的外观设置

  • 这是不必要的,因为我认为我正在使用手机登录该应用程序.所以我将一直使用我的手机一次又一次地登录,从而再次输入我的凭据更多工作表明它不是一个用户友好的应用程序

  • 共享首选项非常方便,在这种情况下,我可以使用其功能在xml文件中共享我的数据,该文件实际存在于手机中安装的Android应用程序中,即使应用程序已关闭也不会被破坏.这里我们可以保存当前应用程序的用户首选项数据.

  • 因此,下次我在手机中打开我的应用程序时,我可以看到数据自动填入必要的字段和设置


文件存储

在此输入图像描述

  • 在Android中,我们可以使用设备存储空间将数据存储在应用程序中.数据类型涉及文本文件,图像文件,视频文件,音频文件等内容.

  • 如图所示,我们可以看到有两个地方可以做到这一点.一种方法是将原始文件写入主/辅助存储.另一种方法是将缓存文件写入主/辅助存储.

  • 存储原始数据和缓存数据之间也存在差异,用户必须明确地删除用户一旦存储在存储器中的原始数据,否则它将存在直到那时.存储在内存中的缓存数据不是永久数据,因为如果感觉内存不足,系统会自动删除它.

在此输入图像描述

内部存储器:

  • 考虑应用程序中的用户已将数据存储在内部存储中,然后只有该应用程序的该用户可以访问移动设备上的该数据,并且在用户卸载应用程序时会自动删除该数据.说到哪些内部存储器是私有的.

  • 应用程序内部存储目录使用名称包名称存储在android文件系统中的特殊位置.

  • 当前应用程序的其他应用程序或用户无权访问特定用户和特定应用程序设置的文件,除非用户明确可用于可读/可写访问.

在此输入图像描述


SQLite的

在此输入图像描述

  • Sqlite用于在运行Android应用程序的移动设备中本地存储更多结构化数据.结构化数据涉及图中所示的类似学生的行和列形式的信息.

  • Sqlite提供类似Mysql和oracle的功能,但功能有限.有些事情涉及对表执行查询操作.虽然有像创建视图的功能,但有些功能不像存储过程那样可用.

  • Sqlite非常有助于存储可以下载一次的复杂数据和大数据,并且可以一次又一次地使用,直到应用程序运行.当应用程序关闭时,sqlite数据库也会被销毁.


将所有部分放在一起

在此输入图像描述

  • 只有在卸载应用程序或按下"设置>清除数据"时才会销毁SQLite数据,但在应用程序关闭时则不会销毁. (11认同)
  • 我认为这可能是一个指南或类似"如何回答stackoverflow问题".这不是答案,这是一个教训.非常感谢兄弟! (9认同)

Ted*_*ddy 36

  • 共享首选项适用于存储应用程序的首选项和其他少量数据.对于一些数据类型,它是一个非常简单的持久字符串键存储:boolean,float,int,long和string.因此,例如,如果我的应用程序有登录,我可能会考虑将会话密钥存储为SharedPreferences中的字符串.
  • 内部存储适用于存储用户不需要访问的应用程序数据,因为用户无法轻松访问内部存储.可能适用于缓​​存,日志和其他东西.任何只有应用程序打算创建读取更新或删除的内容.
  • 外部存储.与我刚才所说的完全相反.Dropbox应用程序可能使用外部存储来存储用户的Dropbox文件夹,以便用户可以轻松访问Dropbox应用程序外部的这些文件,例如,使用文件管理器.

  • 每当您要使用大量结构化数据和相对严格的架构来管理它时,SQLite数据库都是很棒的.换句话说,SQLite就像MySQL或PostgreSQL,而不是作为服务器守护程序的数据库,然后从CGI脚本(如php)获取查询,它只是存储在.db文件中,并通过一个简单的库访问和查询在申请中.虽然SQLite的扩展规模几乎与专用数据库一样大,但对于像Android应用程序这样的小型应用程序来说,它非常快捷方便.如果我正在制作一个聚合和下载配方的应用程序,我会使用SQLite数据库,因为这种数据是相对结构化的,数据库可以很好地扩展.数据库很不错,因为将所有数据写入文件,然后以您自己的专有格式将其解析回来并不好玩.然后,以XML或JSON存储数据也不会那么糟糕.

  • 网络连接是指在云上存储数据.通过java.net.*包进行HTTP或FTP文件和内容传输可以实现这一点.

  • ContentProvider是用于向其他应用程序提供数据的方案/接口; 它并不直接涉及数据本身的实际存储,尽管通常它们将由数据库支持. (7认同)
  • 内容提供商怎么样? (2认同)

jos*_*hus 16

SharedPreferences主要用于您可以通过"设置"菜单访问的特定于应用程序的设置 - 例如应用程序设置.这里保持一切简单是个好主意 - 主要是布尔标志,短字符串或整数.SharedPreferences数据在设备重启时仍然存在,并随应用程序卸载一起删除.数据保存为键值对.

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

外部存储不仅指SDCard存储,而且对于高端手机,这可能意味着内部可安装存储(如Galaxy Nexus或S2).您可以在此处存储大型视频文件,高分辨率图像以及要在应用程序中解析的20 MB文本文件.如果您交换SD卡,这也是存储您希望跨设备共享的数据的位置.数据也通过其文件路径引用.

SQLite数据库是您在常规数据库中存储您想要的任何内容的好处 - 具有将内容组织到表,行和列中的优点.它最适合您希望在UI中显示的列表 - 最好的例子是伟大的发明作为CursorAdapter.此处存储的数据也会在设备重启时保留,并在卸载应用时删除.如果将其连接到ContentProvider,您还可以使用sqlite db在应用程序之间共享数据.使用Cursor访问数据,您可以在其中调用方法,就像执行sql语句一样.

网络连接实际上不是一种数据存储技术,但如果设备连接到互联网,则可以使用某种身份验证的方式为特定用户保留数据.您必须在每次应用程序需要时下载数据或进行一次性数据同步之间取得平衡,这最终会导致上述另一个存储选项.