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);
//添加一些URI
uriMatcher.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 stub
switch(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 stub
switch(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 stub
switch(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 stub
switch(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 stub
switch(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完成
Android数据存储之sharedpreferences与Content Provider的更多相关文章
- Android数据存储-通过SharedPreferences实现记住密码的操作
在Android中登陆中,为了实现用户的方便,往往需要根据用户的需要进行记住密码的操作,所以,在Android数据存储中SharedPreferences恰恰可以实现这一点 下面,小编将带领大家通过S ...
- Android数据存储方式--SharedPreferences
Android数据存储方式有如下四种:SharedPreferences.存储到文件.SQLite数据库.内容提供者(Content provider).存储到网络服务器. 本文主要介绍一下Share ...
- Android数据存储三剑客——SharedPreferences、File、SQLite
Android中常用的数据存储一般有三种方式:SharedPreferences.文件和SQLite数据库,用来保存需要长时间保存的数据.本文将通过几个具体的小实例来讲解这三种方式的具体实现. 数据存 ...
- Android 数据存储之 SharedPreferences储存
------------------------------------------SharedPreferences存储--------------------------------------- ...
- Android数据存储之SharedPreferences存储
安卓系统为应用提供了系统级的配置存储方案,它就是靠SharedPreferences接口来实现的,该接口存储的所有信息都是以名值对的形式保存,但其保存的数据类型也仅限于基本数据类型,如字符串.整形.布 ...
- android数据存储之SharedPreferences
一.SharedPreferences简介 (1)SharedPreferences是Android平台上一个轻量级的存储类,用来保存应用的一些常用配置,比如Activity状态,Activ ...
- Android数据存储之SharedPreferences使用
SharedPreferences是Android中一种轻型的数据存储类.本质上是基于XML文件进行存储Key-Value键值对的数据,生成的XML文件的目录在/data/data/包名/Shared ...
- Android数据存储之SharedPreferences及如何安全存储
前言: 最近一直在学习ios的数据存储,当学习到NSUserDefaults的时候让我回想起了SharedPreferences,今天闲来无事,想着总结一下SharedPreferences的使用. ...
- Android数据存储:Shared Preferences
Android数据存储之SharedPreferences 在Android系统中提供了多种存储技术.通过这些存储技术可以将数据存储在各种存储介质上, Android 为数据存储提供了如下几种方式:1 ...
随机推荐
- 如何使用MASM来编译、连接、调试汇编语言
先声明下,本人绝非大虾,也只是菜鸟一个,写此文的目的只是为了加深我对知识的理解罢了.好,进入正题.我是把masm解压后发在D盘中的一个叫masm的文件里,在masm文件里新建个记事本(记事本功能是很强 ...
- 静态内部类和Lazy<T>优雅实现单例
public class Singleton { private Singleton() { } public static Singleton GetInstance() { return Conc ...
- 【wget】一条命令轻松备份博客(包括图片)
h2:first-child, body>h1:first-child, body>h1:first-child+h2, body>h3:first-child, body>h ...
- JavaScript 上万关键字瞬间匹配——借助Hash表快速匹配
来源: http://www.cnblogs.com/index-html/archive/2013/04/17/js_keyword_match.html http://www.etherdream ...
- C++命名空间
C++命名空间 本讲基本要求 * 掌握:命名空间的作用及定义:如何使用命名空间. * 了解:使用早期的函数库 重点.难点 ◆命名空间的作用及定义:如何使用命名空间. 在学习本书 ...
- mysql 自连接
SELECT语句中的自连接. 到目前为止,我们连接的都是两张不同的表,那么能不能对一张表进行自我连接呢?答案是肯定的. 有没有必要对一张表进行自我连接呢?答案也是肯定的. 表的别名: 一张表可以自我连 ...
- thinkphp-2
php的跨文件变量? global $g是一个脚本文件中, 函数外部的变量在函数中要使用时的 全局变量 $_GET等是所谓的"超全局变量", 但仍然是只能在一个脚本的范围内使用 要 ...
- 淘宝(阿里百川)手机客户端开发日记第五篇 SharedPreferences使用详解
我们知道,Android中数据存储技术由于如下几种 1 使用SharedPreferences存储数据 2 文件存储数据 3 SQLite数据库存储数据 4 使用ContentProvider存储数据 ...
- NGUI 新版操作教程
http://www.tasharen.com/forum/index.php?topic=6754
- unity3d 截屏
原地址:http://www.cnblogs.com/88999660/archive/2013/01/21/2869747.html void OnGUI(){ if(GUI.Button(new ...