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的更多相关文章

  1. Android数据存储-通过SharedPreferences实现记住密码的操作

    在Android中登陆中,为了实现用户的方便,往往需要根据用户的需要进行记住密码的操作,所以,在Android数据存储中SharedPreferences恰恰可以实现这一点 下面,小编将带领大家通过S ...

  2. Android数据存储方式--SharedPreferences

    Android数据存储方式有如下四种:SharedPreferences.存储到文件.SQLite数据库.内容提供者(Content provider).存储到网络服务器. 本文主要介绍一下Share ...

  3. Android数据存储三剑客——SharedPreferences、File、SQLite

    Android中常用的数据存储一般有三种方式:SharedPreferences.文件和SQLite数据库,用来保存需要长时间保存的数据.本文将通过几个具体的小实例来讲解这三种方式的具体实现. 数据存 ...

  4. Android 数据存储之 SharedPreferences储存

    ------------------------------------------SharedPreferences存储--------------------------------------- ...

  5. Android数据存储之SharedPreferences存储

    安卓系统为应用提供了系统级的配置存储方案,它就是靠SharedPreferences接口来实现的,该接口存储的所有信息都是以名值对的形式保存,但其保存的数据类型也仅限于基本数据类型,如字符串.整形.布 ...

  6. android数据存储之SharedPreferences

    一.SharedPreferences简介      (1)SharedPreferences是Android平台上一个轻量级的存储类,用来保存应用的一些常用配置,比如Activity状态,Activ ...

  7. Android数据存储之SharedPreferences使用

    SharedPreferences是Android中一种轻型的数据存储类.本质上是基于XML文件进行存储Key-Value键值对的数据,生成的XML文件的目录在/data/data/包名/Shared ...

  8. Android数据存储之SharedPreferences及如何安全存储

    前言: 最近一直在学习ios的数据存储,当学习到NSUserDefaults的时候让我回想起了SharedPreferences,今天闲来无事,想着总结一下SharedPreferences的使用. ...

  9. Android数据存储:Shared Preferences

    Android数据存储之SharedPreferences 在Android系统中提供了多种存储技术.通过这些存储技术可以将数据存储在各种存储介质上, Android 为数据存储提供了如下几种方式:1 ...

随机推荐

  1. [dpdk] 熟悉SDK与初步使用 (三)(IP Fragmentation源码分析)

    对例子IP Fragmentation的熟悉,使用,以及源码分析. 功能: 该例子的功能有二: 一: 将IP分片? 二: 根据路由表,做包转发. 路由表如下: IP_FRAG: Socket : ad ...

  2. CircularSeekBar

    /** * @author Raghav Sood * @version 1 * @date 26 January, 2013 */ package com.appaholics.circularse ...

  3. Wampserver2.5配置虚拟主机出现403 Forbidden解决办法

    一直在用APMServ5.2.6,mysql好办,可以用mariadb代替进行升级,但php升级到5.4.7就没办法再升级,安装加速器也困难.就想迁移到Wampserver上来,以前也尝试过Wamps ...

  4. 开始进入Windows Phone 8开发

    和大家一起分享从零开始,入手Windows Phone 8开发,大家一起来吧!

  5. 微软Azure开始支持Docker技术

    前一段时间还在与微软的技术人员讨论媒体转换服务的效率问题,如果应用 Docker将会有质的提高,没想到国外的Azure已经开始支持了,相信国内Azure支持也不远了.微软正在努力确保Azure成为开发 ...

  6. oracle安装界面中文乱码解决

    在安装oracle时如果我们用的是英文安装没有任何问题,但是我要安装中文的,结果中文界面就出现了乱码了,后来网上找了原因是要安装中文包才可以,下面我来介绍一下. 在Linux的X window里安装o ...

  7. Android于JNI调用列出的程序

    1.安装和下载cygwin,下载Android NDK: 2.于ndk工程JNI接口设计: 3.采用C/C++实现本地方法. 4.JNI生成动态链接库.so档: 5.动态链接库副本javaprojec ...

  8. lua 变量

    lua 变量 类型 全局变量 lua 变量默认均为全局变量 打印一个未定义的变量输出为 nil 示例代码 a = 1 print(a, b) 局部变量 lua 变量默认均为全局变量, 除非变量前显式声 ...

  9. FTP服务器搭建及操作(一)

    FTP服务器搭建及操作(一) FTP搭建 PHP FTP操作 搭建方法参照(windows):http://www.cnblogs.com/lidan/archive/2012/06/04/25351 ...

  10. 多线程并发执行任务,取结果归集。终极总结:Future、FutureTask、CompletionService、CompletableFuture

    目录 1.Futrue 2.FutureTask 3.CompletionService 4.CompletableFuture 5.总结 ================正文分割线========= ...