Android中的5种数据存储方式

Android中的5种数据存储方式

Android中的5种数据存储方式

数据存储在开发中是使用最频繁的,在这里主要介绍Android平台中实现数据存储的5种方式,分别是:

1 使用SharedPreferences存储数据;  

2 文件存储数据;

3 SQLite数据库存储数据;

4 使用ContentProvider存储数据;

5 网络存储数据;


Android中数据存储的5种方法

 

简介:这是Android中数据存储的5中方法的详细页面,介绍了和手机软件,Android Android中数据存储的5中方法有关的知识,

Android数据存储
Android提供了5种方式存储数据:
--使用SharedPreferences存储数据;
--文件存储数据;
--SQLite数据库存储数据;
--使用ContentProvider存储数据;
--网络存储数据;

先说 下,Preference,File, DataBase这三种方式分别对应的目录是/data/data/Package Name/Shared_Pref, /data/data/Package Name/files, /data/data/Package Name/database 。

在Android中通常使用File存储方式是用Context.openFileOutput(String fileName, int mode)和Context.openFileInput(String fileName)。
Context.openFileOutput(String fileName, int mode)生成的文件自动存储在/data/data/Package Name/files目录下,其全路径是/data/data/Package Name/files/fileName 。注意下,这里的参数fileName不可以包含路径分割符(如"/")。
通常来说,这种方式生成的文件只能在这个apk内访问。但这个结论是指使用Context.openFileInput(String fileName)的方式。使用这种方式,每个apk只可以访问自己的/data/data/Package Name/files目录下的文件,原因很简单,参数fileName中不可以包含路径分割符,Android会自动在/data/data /Package Name/files目录下寻找文件名为fileName的文件。

一:使用SharedPreferences存储数据

首先说明SharedPreferences存储方式,它是Android提供的用来存储一些简单配置信息的一种机制,例如:登录用户的用户名与密码。其采用了Map数据结构来存储数据,以键值的方式存储,可以简单的读取与写入,具体实例如下:
void ReadSharedPreferences(){
String strName,strPassword;
SharedPreferences   user = getSharedPreferences(“user_info”,0);
strName = user.getString(“NAME”,””);
strPassword = user getString(“PASSWORD”,””);
}
void WriteSharedPreferences(String strName,String strPassword){
SharedPreferences   user = getSharedPreferences(“user_info”,0);
uer.edit();
user.putString(“NAME”, strName);
user.putString(“PASSWORD” ,strPassword);
user.commit();
}
数据读取与写入的方法都非常简单,只是在写入的时候有些区别:先调用edit()使其处于编辑状态,然后才能修改数据,最后使用commit()提交修改 的数据。实际上SharedPreferences是采用了XML格式将数据存储到设备中,在DDMS中的File Explorer中的/data/data/<package name>/shares_prefs下。以上面的数据存储结果为例,打开后可以看到一个user_info.xml的文件,打开后可以看到:
<?xml version=”1.0″ encoding=”UTF-8″?>
<map>
<string name=”NAME”>moandroid</string>
<string name=” PASSWORD”>SharedPreferences</string>
</map>
使用SharedPreferences是有些限制的:只能在同一个包内使用,不能在不同的包之间使用。

二:文件存储数据

 


文件存储方式是一种较常用的方法,在Android中读取/写入文件的方法,与 Java中实现I/O的程序是完全一样的,提供了openFileInput()和openFileOutput()方法来读取设备上的文件。 FilterInputStream, FilterOutputStream等可以到Java io package说明中去详细学习,不再此详细说明,具体实例如下:
String fn = “moandroid.log”;
FileInputStream fis = openFileInput(fn);
FileOutputStream fos = openFileOutput(fn,Context.MODE_PRIVATE);
除此之外,Android还提供了其他函数来操作文件,详细说明请阅读Android SDK。


三:网络存储数据


网络存储方式,需要与Android 网络数据包打交道,关于Android 网络数据包的详细说明,请阅读Android SDK引用了Java SDK的哪些package?。

四:ContentProvider

1、ContentProvider简介


当应用继承ContentProvider类,并重写该类用于提供数据和存储数据的方法,就可以向其他应用共享其数据。虽然使用其他方法也可以对外共享数 据,但数据访问方式会因数据存储的方式而不同,如:采用文件方式对外共享数据,需要进行文件操作读写数据;采用sharedpreferences共享数 据,需要使用sharedpreferences API读写数据。而使用ContentProvider共享数据的好处是统一了数据访问方式。?

2、Uri类简介


Uri代表了要操作的数据,Uri主要包含了两部分信息:1.需要操作的ContentProvider ,2.对ContentProvider中的什么数据进行操作,一个Uri由以下几部分组成:
1.scheme:ContentProvider(内容提供者)的scheme已经由Android所规定为:content://。


2.主机名(或Authority):用于唯一标识这个ContentProvider,外部调用者可以根据这个标识来找到它。


3.路径(path):可以用来表示我们要操作的数据,路径的构建应根据业务而定,如下:
? 要操作contact表中id为10的记录,可以构建这样的路径:/contact/10
? 要操作contact表中id为10的记录的name字段, contact/10/name
? 要操作contact表中的所有记录,可以构建这样的路径:/contact?
要操作的数据不一定来自数据库,也可以是文件等他存储方式,如下:
要操作xml文件中contact节点下的name节点,可以构建这样的路径:/contact/name
如果要把一个字符串转换成Uri,可以使用Uri类中的parse()方法,如下:
Uri uri = Uri.parse("content://com.changcheng.provider.contactprovider/contact")
3、UriMatcher、ContentUrist和ContentResolver简介

因为Uri代表了要操作的数据,所以我们很经常需要解析Uri,并从Uri中获取数据。Android系统提供了两个用于操作Uri的工具类,分别为UriMatcher 和ContentUris 。掌握它们的使用,会便于我们的开发工作。
? UriMatcher:用于匹配Uri,它的用法如下:


1.首先把你需要匹配Uri路径全部给注册上,如下:
//常量UriMatcher.NO_MATCH表示不匹配任何路径的返回码(-1)。
UriMatcher uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
//如果match()方法匹配content://com.changcheng.sqlite.provider.contactprovider/contact路径,返回匹配码为1
uriMatcher.addURI(“com.changcheng.sqlite.provider.contactprovider”, “contact”, 1);//添加需要匹配uri,如果匹配就会返回匹配码
//如果match()方法匹配 content://com.changcheng.sqlite.provider.contactprovider/contact/230路径,返回匹配码为2
uriMatcher.addURI(“com.changcheng.sqlite.provider.contactprovider”, “contact/#”, 2);//#号为通配符

2.注册完需要匹配的Uri后,就可以使用uriMatcher.match(uri)方法对输入的Uri进行匹配,如果匹配就返回匹配码,匹配码是调用 addURI()方法传入的第三个参数,假设匹配 content://com.changcheng.sqlite.provider.contactprovider/contact路径,返回的匹配 码为1。
?
ContentUris:用于获取Uri路径后面的ID部分,它有两个比较实用的方法:
? withAppendedId(uri, id)用于为路径加上ID部分
? parseId(uri)方法用于从路径中获取ID部分
? ContentResolver:当外部应用需要对ContentProvider中的数据进行添加、删除、修改和查询操作时,可以使用 ContentResolver 类来完成,要获取ContentResolver 对象,可以使用Activity提供的getContentResolver()方法。 ContentResolver使用insert、delete、update、query方法,来操作数据。

 

五:总结说明


以上5中存储方式,在以后的开发过程中,根据设计目标、性能需求、空间需求等找到合 适的数据存储方式。Android 中的数据存储都是私有的,其他应用程序都是无法访问的,除非通过ContentResolver获取其他程序共享的数据。采用文件方式对外共享数据,需要 进行文件操作读写数据;采用sharedpreferences共享数据,需要使用sharedpreferences API读写数据。而使用ContentProvider共享数据的好处是统一了数据访问方式。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/464569.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

揭秘 | 小米最新款12PRO智能动态刷新率技术原理

1. 背景最新发布的小米手机12pro提到了一个安卓系统上的新技术&#xff1a;智能动态刷新率。这到底是个啥技术&#xff1f;让雷军同学可以大吹特吹。智能动态刷新海报要解释上面的技术&#xff0c;不得不提刷新率和帧率这两个概念。在平时的生活当中&#xff0c;你可能也会经常…

java怎么编程方程_[编程入门]自定义函数求一元二次方程-题解(Java代码)

令一元二次方程判别式&#xff1a; b2 - 4ac为变量P**当P > 0时&#xff1a;**x1 (-bsqrt(P)) / 2ax1 (-b-sqrt(P)) / 2a**当P 0时&#xff1a;**x1 x2 -b / 2a**当P < 0时&#xff0c;一元二次方程无解当存在共轭复数&#xff1a;**x1 -b/2a sqrt(-P)ix1 -b/2a …

自动部署war包脚本

war 包所在路径为&#xff1a;/home/wars/ROOT.war tomcat 所在路径为&#xff1a; ①&#xff1a;/home/search-3 ②&#xff1a;/home/search-4 部署单个war到一个tomcat中 #!/bin/sh TOMCAT/home/search-3 echo "deploy ROOT.war"#ps 显示进程,grep筛选进程,awk是…

吉他谱——有多少爱可以重来

C C Am Am C C 常常责怪自 己 当初不 应 该&#xff0c;   常常后悔没 有 把你留 谁知道又和 你 相遇在 人 海&#xff0c;   命运如此安 排 总教人 Am Am Dm G C Am 下 来。 为甚 么 明明相 爱&#xff0c; 到最 后 还是要 分开&#xff0c; 是否 无 奈…

如何在Ubuntu 11.10下安装Java

升级到ubuntu 11.10之后&#xff0c;由于库里没有sun-java6-jdk&#xff0c;需要自行安装。因此&#xff0c;到Oracle网站下载了Java 6u27&#xff08;为什么不下java7呢&#xff1f;因为目前支持的软件不多&#xff0c;另外如果真要的话&#xff0c;也可以很方便的切换到Java7…

看看高手做的ARM开发板

放假前&#xff0c;我写了一篇文章&#xff0c;里面有提到我放假的时候会接触一个开发板&#xff0c;这个开发板就是标题提到的这个ARM处理器&#xff0c;这篇文章会对这个处理器和开发板做个简单的介绍。说这个开发板前&#xff0c;先介绍下我的一个朋友zzy。zzy是通过公众号接…

Flow monitoring in Software-Defined Networks

题目&#xff1a;Flow monitoring in Software-Defined Networks: Finding the accuracy/performance tradeoffs 软件定义网络中的流量监控&#xff1a;寻找准确性/性能权衡 发表时间&#xff1a;2018年 来源&#xff1a;Computer Networks (Elsevier) 摘要 在基于OpenFlow的软…

java给腾讯通发消息_通过web 向rtx发送通知消息

请通过调用RTX服务器CGI的方式实现&#xff0c;详细说明如下&#xff1a;发送消息提醒方法&#xff1a;GET/POSTURL:/sendnotify.cgi用法举例(IE地址栏中输入)&#xff1a;http://192.168.17.221:8012/sendnotify.cgi?msghello&receiverwwjs参数表&#xff1a;变量名称 默…

心情-天气

最近雨还满多的&#xff0c;但不是阴雨连绵&#xff0c;中间会时不时有个大晴天。一直觉得下雨的日子就应该是安排在周一到周五&#xff0c;这样的话我就可以安心的聚精会神的上班&#xff0c;因为反正下雨哪里也不想去&#xff0c;还是好好上班比较好&#xff0c;躲在办公室里…

用 Shell 快速写一个嵌入式测试框架

大家好&#xff0c;转发我朋友老吴的一篇文章&#xff0c;我们在做测试框架的时候用的是python&#xff0c;但是一些理论基础和用shell是一样的&#xff0c;在这里&#xff0c;语言并不是关键。希望对大家有帮助。哈喽&#xff0c;我是老吴。作为一个嵌入式底层码农&#xff0c…

不同技术团队的配合问题及DevOps

一、技术团队细分及配合问题 在IT企业里产品从创意到交付给用户&#xff0c;从整体上看是由技术部门负责&#xff0c;但如果深入到技术部门&#xff0c;会发现由不同的技术团队负责不同的部分或者阶段。一般会 分产品团队、开发团队、测试团队以及运维团队&#xff0c;在互联网…

jquery validation验证身份证号、护照、电话号码、email

$.validator.setDefaults({ submitHandler: function(form) { form.submit(); } }); // 字符验证 jQuery.validator.addMethod("stringCheck", function(value, element) { return this.optional(element) || /^[\u0391-\uFFE5\w]$/.test(value); }, "只能包括中…

C++/C中定义与声明的区别

在C/C中&#xff0c;定义与声明是不一样的&#xff0c;主要区别在于是否分配了内存。 定义&#xff1a;编译器创建一个对象&#xff0c;为该对象分配一块内存&#xff0c;并为该内存起一个名字&#xff0c;这个名字就叫变量名。 例如&#xff1a; int a;//未初始化 int b 0;…

ubuntu php.ini 配置,ubuntu下配置PHP+JSON模块(apache) | 学步园

搭配完毕apachephpmysql环境后我们开始来配置PHP加载JSON模块1.下载源文件包&#xff1a;wget http://www.aurore.net/projects/php-json/php-json-ext-1.2.0.tar.bz22.解压tar xvjf php-json-ext-1.2.0.tar.bz23.进入目录cd php-json-ext-1.2.04.编译前要初始化PHP环境:phpiz…

A good book to learn C#2.0 ----C# 2.0 : Practical Guide for Programmers

c#2.0,已经出来很久了,相信已经有不少人或多或少了解了它的一些特性了.而这本<C# 2.0 : Practical Guide for Programmers>(作者&#xff1a;Michel de Champlain, Brian G. Patrick)是一本2005年2月出的turorial类型的好书,通过这本书不仅可以学习c#2.0的新内容,还可以对…

单线程会导致死锁吗?

我之前在我们的项目里面解决了一个死锁的问题&#xff0c;然后我跟一个我的朋友聊了下&#xff0c;他让我深入研究下这个问题。大家也可以考虑想我的这个问题。首先我们再看看什么是死锁&#xff1f;什么是死锁用个通俗的例子讲一讲死锁死锁从文字理论上说明的是两个线程&#…

细节‘出卖’你

细节‘出卖’你 ①喜欢眨眼&#xff1a;这种人心胸狭隘。②习惯盯着别人看&#xff1a;代表警戒心强。③喜欢提高音量说话&#xff1a;多半是自我主义者。④穿着不拘小节&#xff1a;也代表个性随和。⑤一坐下就翘脚&#xff1a;这种人充满企图心有行动力。⑥边说话边摸下巴&am…

makefile / CMake

- makefile syntax ifneq https://www.gnu.org/software/make/manual/html_node/Conditional-Example.html - [CMake] undef a symbol https://cmake.org/pipermail/cmake/2012-June/050708.html 但是我发现用这个和用remove_definiton对我移植OpenCV的时候都没起作用. https:…

Json的优缺点

JSON的定义 一种轻量级的数据交换格式&#xff0c;具有良好的可读和便于快速编写的特性。业内主流技术为其提供了完整的解决方案&#xff08;有点类似于正则表达式 &#xff0c;获得了当今大部分语言的支持&#xff09;&#xff0c;从而可以在不同平台间进行数据交换。JSON…

appcrash事件java,java – SpringBoot应用程序崩溃

请告诉我哪里有问题&#xff1f;我尝试启动我在Spring Boot上开发的第一个应用程序.我已经在SpringMVC上有简单的Web项目,现在我想在BOOT上构建它.这是错误输出&#xff1a;org.springframework.beans.factory.BeanCreationException: Error creating bean with name messageSo…