Android数据存储之sharedpreferences与Content Provider

android中对数据操作包含有:

file, sqlite3, Preferences, ContectResolver与ContentProvider前三种数据操作方式都只是针对本应用内数据,程序不能通过这三种方法去操作别的应用内的数据

其中sqlite3已经在上一节中讲述了,本节主要包含sharedpreferences与ContentProvider

sharedpreferences保存数据

//实例化SharedPreferences对象(第一步) SharedPreferences mySharedPreferences= getSharedPreferences("test", 
Activity.MODE_PRIVATE); 
//实例化SharedPreferences.Editor对象(第二步) 
SharedPreferences.Editor editor = mySharedPreferences.edit(); 
//用putString的方法保存数据 
editor.putString("name", "Karl"); 
editor.putString("habit", "sleep"); 
//提交当前数据 
editor.commit(); 
//使用toast信息提示框提示成功写入数据 
Toast.makeText(this, "数据成功写入SharedPreferences!" , Toast.LENGTH_LONG).show();

执行以上代码,SharedPreferences将会把这些数据保存在test.xml文件中,可以在File Explorer的data/data/相应的包名/test.xml 下导出该文件,并查看。

2、使用SharedPreferences读取数据方法如下:

//同样,在读取SharedPreferences数据前要实例化出一个SharedPreferences对象 
SharedPreferencessharedPreferences= getSharedPreferences("test", 
Activity.MODE_PRIVATE); 
// 使用getString方法获得value,注意第2个参数是value的默认值 
String name =sharedPreferences.getString("name", ""); 
String habit =sharedPreferences.getString("habit", ""); 
//使用toast信息提示框显示信息 
Toast.makeText(this, "读取数据如下:"+"\n"+"name:" + name + "\n" + "habit:" + habit, 
Toast.LENGTH_LONG).show(); 

内容提供者

在manifest文件中注册,安卓四大组件都要在其中注册

provider android:name="com.zj.sqlitedemo.providers.PersonContentProvider"android:authorities="com.zj.sqlitedemo.providers.PersonContentProvider"></provider>

设置访问路径,供其他调用者访问

    private final static String authority ="com.zj.sqlitedemo.providers.PersonContentProvider";private final static int PERSON_INSERT_CODE=0;private final static int PERSON_DELETE_CODE=1;private final static int PERSON_UPDATE_CODE=2;private final static int PERSON_QUERY_ALL_CODE=3;private final static UriMatcher uriMatcher;private PersonSQLiteOpenHelper mOpenHelper;static{uriMatcher=new UriMatcher(UriMatcher.NO_MATCH);//添加一些URIuriMatcher.addURI(authority, "person/insert", PERSON_INSERT_CODE);uriMatcher.addURI(authority, "person/delete", PERSON_DELETE_CODE);uriMatcher.addURI(authority, "person/update", PERSON_UPDATE_CODE);uriMatcher.addURI(authority, "person/queryAll", PERSON_QUERY_ALL_CODE);}

主要方法:

 

 public boolean onCreate() 在创建ContentProvider时调用

  public Cursor query(Uri, String[], String, String[], String) 用于查询指定Uri的ContentProvider,返回一个Cursor

  public Uri insert(Uri, ContentValues) 用于添加数据到指定Uri的ContentProvider中

  public int update(Uri, ContentValues, String, String[]) 用于更新指定Uri的ContentProvider中的数据

  public int delete(Uri, String, String[]) 用于从指定Uri的ContentProvider中删除数据

  public String getType(Uri) 用于返回指定的Uri中的数据的MIME类型

  *如果操作的数据属于集合类型,那么MIME类型字符串应该以vnd.android.cursor.dir/开头。

  例如:要得到所有person记录的Uri为content://contacts/person,那么返回的MIME类型字符串为”vnd.android.cursor.dir/person”。

  *如果要操作的数据属于非集合类型数据,那么MIME类型字符串应该以vnd.android.cursor.item/开头。

  例如:要得到id为10的person记录的Uri为content://contacts/person/10,那么返回的MIME类型字符串应为”vnd.android.cursor.item/person”。

方法实现

查询方法

public Cursor query(Uri uri, String[] projection, String selection,String[] selectionArgs, String sortOrder) {// TODO Auto-generated method stubswitch(uriMatcher.match(uri)){case PERSON_QUERY_ALL_CODE://从表中更新SQLiteDatabase db= mOpenHelper.getWritableDatabase();if(db.isOpen()){Cursor cursor= db.query("person", projection, selection, selectionArgs,null,null,sortOrder);return cursor;}break;default:throw new IllegalArgumentException("URI不匹配"+uri);}return null;}

插入方法

public Uri insert(Uri uri, ContentValues values) {// TODO Auto-generated method stubswitch(uriMatcher.match(uri)){case PERSON_INSERT_CODE://添加到表中SQLiteDatabase db= mOpenHelper.getWritableDatabase();if(db.isOpen()){long id=db.insert("person", null, values);db.close();return ContentUris.withAppendedId(uri, id);}break;default:throw new IllegalArgumentException("URI不匹配");}return null;}

删除方法实现

public int delete(Uri uri, String selection, String[] selectionArgs) {// TODO Auto-generated method stubswitch(uriMatcher.match(uri)){case PERSON_DELETE_CODE://从表中删除SQLiteDatabase db= mOpenHelper.getWritableDatabase();if(db.isOpen()){int count=db.delete("person", selection, selectionArgs);db.close();return  count;}break;default:throw new IllegalArgumentException("URI不匹配"+uri);}return 0;}

更新方法实现

public int update(Uri uri, ContentValues values, String selection,String[] selectionArgs) {// TODO Auto-generated method stubswitch(uriMatcher.match(uri)){case PERSON_UPDATE_CODE://从表中更新SQLiteDatabase db= mOpenHelper.getWritableDatabase();if(db.isOpen()){int count=db.update("person", values, selection, selectionArgs);db.close();return  count;}break;default:throw new IllegalArgumentException("URI不匹配"+uri);}return 0;}

得到类型

public String getType(Uri uri) {// TODO Auto-generated method stubswitch(uriMatcher.match(uri)){case PERSON_QUERY_ALL_CODE:return "vnd.android.cursor.dir/person";default:break;}return null;}

注意: *如果操作的数据属于集合类型,那么MIME类型字符串应该以vnd.android.cursor.dir/开头。

例如:要得到所有person记录的Uri为content://contacts/person,那么返回的MIME类型字符串为”vnd.android.cursor.dir/person”。

*如果要操作的数据属于非集合类型数据,那么MIME类型字符串应该以vnd.android.cursor.item/开头。

例如:要得到id为10的person记录的Uri为content://contacts/person/10,那么返回的MIME类型字符串应为”vnd.android.cursor.item/person”。

例如此处就用了vnd.android.cursor.dir开头

ContentResolver解析内容提供者提供的数据,当外部应用需要对ContentProvider中的数据进行添加、删除、修改和查询操作时,可以使用ContentResolver类来完成,要获取ContentResolver对象,可以使用Context提供的getContentResolver()方法


插入实现

public void testInsert(){Uri uri=Uri.parse("content://com.zj.sqlitedemo.providers.PersonContentProvider/person/insert");ContentResolver resolver= getContext().getContentResolver();ContentValues values=new ContentValues();values.put("name", "在吗");values.put("age", 25);uri=resolver.insert(uri,values);Log.i(tag, "uri"+uri);long id=ContentUris.parseId(uri);Log.i(tag, "添加到"+id);}

删除实现

public void testDelete(){Uri uri=Uri.parse("content://com.zj.sqlitedemo.providers.PersonContentProvider/person/delete");ContentResolver resolver= getContext().getContentResolver();String where="_id=?";String []selectionArgs={"21"};int count=resolver.delete(uri, where, selectionArgs);Log.i(tag, "删除了行:"+count);}

更新实现

public void testUpdate(){Uri uri=Uri.parse("content://com.zj.sqlitedemo.providers.PersonContentProvider/person/delete");ContentResolver resolver= getContext().getContentResolver();ContentValues values=new ContentValues();values.put("name", "zj");int count=resolver.update(uri, values, "_id=?", new String[]{"20"});Log.i(tag, "更新了"+count);}

查询实现

public void testQueryAll(){Uri uri=Uri.parse("content://com.zj.sqlitedemo.providers.PersonContentProvider/person/queryAll");ContentResolver resolver= getContext().getContentResolver();Cursor cursor=resolver.query(uri, new String[]{"_id","name","age"}, null, null, null);if(cursor!=null&&cursor.getCount()>0){int id;String name;int age;while(cursor.moveToNext()){id=cursor.getInt(0);name=cursor.getString(1);age=cursor.getInt(2);Log.i(tag, "id:"+id+"name:"+name+"age:"+age);}cursor.close();}}

内容提供者与sharedpreferences完成

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

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

相关文章

vtk类之vtkImageReslice:基本算法,对体数据沿着轴进行切片

沿着轴方向切割体数据。 vtkImageReslice 是几何图形过滤器中的瑞士军刀。他可以排列&#xff0c;旋转&#xff0c;翻转&#xff0c;缩放&#xff0c;重新采样&#xff0c;变形, 还有随意再任何效率与图像质量组合下&#xff0c;渲染图像。简单的操作&#xff0c;像排列&#x…

【每日SQL打卡】​​​​​​​​​​​​​​​DAY 12丨游戏玩法分析 V【难度困难】

活动介绍&#xff1a; 「数据仓库技术交流群」已经正式启动每日SQL打卡&#xff0c;帮助大家扎实基础&#xff0c;努力工作之余&#xff0c;别忘了自我提升。另有超多CSDN 周边礼物相送。 欢迎报名和邀请小伙伴参与&#xff0c;一个人可能走得很快&#xff0c;但一群人会走得很…

仅需1/5成本:TPU是如何超越GPU,成为深度学习首选处理器的

作者&#xff1a;Kaz Sato 来源&#xff1a;Google Cloud、机器之心摘要&#xff1a;张量处理单元&#xff08;TPU&#xff09;是一种定制化的 ASIC 芯片&#xff0c;它由谷歌从头设计&#xff0c;并专门用于机器学习工作负载。TPU 为谷歌的主要产品提供了计算支持&#xff0c;…

【每日SQL打卡】​​​​​​​​​​​​​​​DAY 12丨销售分析 III【难度简单】

活动介绍&#xff1a; 「数据仓库技术交流群」已经正式启动每日SQL打卡&#xff0c;帮助大家扎实基础&#xff0c;努力工作之余&#xff0c;别忘了自我提升。另有超多CSDN 周边礼物相送。 欢迎报名和邀请小伙伴参与&#xff0c;一个人可能走得很快&#xff0c;但一群人会走得很…

[唐胡璐]Excel技巧 - 使用Excel 2007完成多人协同录入工作

下面我们来介绍下Excel 2007的共享功能。 一、设置共享 启动Excel 2007&#xff0c;打开需要设置共享的工作薄文档&#xff0c;切换到“审阅”菜单选项卡中&#xff0c;单击“更改”组中的“共享工作薄”按钮&#xff0c;打开“共享工作薄”对话框&#xff0c;如下图所示。 …

Android之jni入门

jni即java native interface&#xff0c;使用jni我们可以在JAVA中调用C代码&#xff0c;提高了效率&#xff0c;可以复用代码&#xff0c;可以灵活的应用于各种场景 怎么使用JNI 安装软件 1.NDK 用于将C代码编译成so库 2.CygWin 在windows下模拟linux环境 3.CDT 在eclipse…

腾讯投资过 600 多家公司不惊奇,京东也有出手 260+ | 大公司投资并购盘点

来源&#xff1a;IT桔子A 股一片绿&#xff0c;这已经不是满屏绿色的第一天了&#xff0c;2018 年以来&#xff0c;A 股经历了起起落落落落落落……尤其在中美贸易战不断升级后&#xff0c;A 股的代表颜色就成了绿色&#xff0c;少数会有几家企业翻红&#xff0c;然而过不了几天…

埋点技术:“呵呵,你在网上的一举一动,都在我眼皮子底下”

&#x1f345; 作者主页&#xff1a;不吃西红柿 &#x1f345; 简介&#xff1a;CSDN博客专家 & 总榜前十&#x1f3c6;、HDZ核心组成员。欢迎点赞、收藏、评论 &#x1f345; 粉丝专属福利&#xff1a;知识体系、面试题库、技术互助、简历模板。文末公众号领取 1、什么是…

printf的格式控制的完整格式

printf的格式控制的完整格式 printf的格式控制的完整格式&#xff1a;% - 0 m.n l或h 格式字符下面对组成格式说明的各项加以说明&#xff1a;①%&#xff1a;表示格式说明的起始符号&#xff0c;不可缺少。②-&#xff1a;有-表示左对齐输出&#xff0c;如省略表示右对…

【每日SQL打卡】​​​​​​​​​​​​​​​DAY 13丨每日新用户统计【难度中等】

活动介绍&#xff1a; 「数据仓库技术交流群」已经正式启动每日SQL打卡&#xff0c;帮助大家扎实基础&#xff0c;努力工作之余&#xff0c;别忘了自我提升。另有超多CSDN 周边礼物相送。 欢迎报名和邀请小伙伴参与&#xff0c;一个人可能走得很快&#xff0c;但一群人会走得很…

美国斯坦福大学发布2025计划, 创立开环大学, 彻底颠覆全球高等教育

来源&#xff1a;钱塘号《斯坦福大学2025计划》在以设计思考理论著称的斯坦福大学设计学院牵头下正式启动&#xff0c;这次教育改革改变了以往自上而下的方式&#xff0c;代之以师生为主导。与其说《斯坦福大学2025计划》是一个方案&#xff0c;不如说它是一个对未来大学模式进…

Android之jni深入

小技巧&#xff1a;自动生成 java本地方法对应的c代码的方法名 javah 指令 全类名 java1.6版本 class C:\workspace\HelloWorldFromC2\bin\classes java1.7以上 src C:\workspace\HelloWorldFromC2\src 获得方法的签名的方法 javap -s 打印方法的签名 注意要cd到 C:\workspa…

HTML选择器

HTML选择器1、标签选择器直接将HTML元素中的标签作为选择器&#xff0c;可以是p、h1、d1、strong等HTML标签&#xff0c;在CSS中直接展现。2、ID选择器通常在编写页面的时候设定某些标签元素的ID,同一个HTML中ID不允许重复&#xff0c;例如&#xff0c;<div id"wrapper…

【每日SQL打卡】​​​​​​​​​​​​​​​DAY 13丨每位学生的最高成绩【难度中等】

活动介绍&#xff1a; 「数据仓库技术交流群」已经正式启动每日SQL打卡&#xff0c;帮助大家扎实基础&#xff0c;努力工作之余&#xff0c;别忘了自我提升。另有超多CSDN 周边礼物相送。 欢迎报名和邀请小伙伴参与&#xff0c;一个人可能走得很快&#xff0c;但一群人会走得很…

语言处理想突破,三座大山必须过

来源&#xff1a;大数据文摘编译&#xff1a;李佳、汤圆、钱天培“我的飞机什么时候到&#xff1f;”把这个问题抛给智能机器人助手。几乎可以肯定&#xff0c;机器立马就懵逼了。“我”是谁&#xff1f;“飞机”是航班还是淘宝上订的模型玩具呢&#xff1f;“到”又是到哪呢&a…

利用github page搭建博客

为什么选择GitHub Pages&#xff1f; 很多人用 wordpress&#xff0c;你为什么要用 github pages 来搭建&#xff1f; 1、github pages有300M免费空间&#xff0c;资料自己管理&#xff0c;保存可靠&#xff1b; 2、学着用 github&#xff0c;享受 github 的便利&#xff0c…

C语言中printf(built: %s %s,__TIME__,__DATE__);方便调试

代码中加入printf("built: %s %s",__TIME__,__DATE__);这样就可以了;后面将显示最后编译的时间。 这样可以知道自己改的代码是否生效&#xff0c;是否编译进去。转载于:https://www.cnblogs.com/jisheng/archive/2013/01/15/2860706.html

CSDN每日打卡已经2周,进展如何?(送两个CSDN背包)

&#x1f345; 作者主页&#xff1a;不吃西红柿 &#x1f345; 简介&#xff1a;CSDN博客专家 & 总榜前十&#x1f3c6;、HDZ核心组成员。欢迎点赞、收藏、评论 &#x1f345; 粉丝专属福利&#xff1a;知识体系、面试题库、技术互助、简历模板。文末公众号领取 点赞评论 …

WordPress环境配置与安装

要安装wordpress,要安装apache,php,mysql,还要进行一系列复杂的配置&#xff0c;较为复杂。 apache安装 php5.5.6 下载链接&#xff1a;http://windows.php.net/download/#php-5.5 推荐 V11 x64&#xff0c;也就是64bit的 apache2.4&#xff0c;下载链接&#xff1a;http:/…

趋势 | 人工智能领域十大最具成长性技术展望

来源&#xff1a;搜狐日前&#xff0c;在2018世界机器人大会基础技术与创新论坛中&#xff0c;中国电子学会发布了《新一代人工智能十大成长性技术展望》。经调研走访了一批在新一代人工智能技术及产业方面具备领先水平和特色的龙头企业&#xff0c;拜访了来自于知名高校、研究…