• 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, "读取数据如下:"+"
    "+"name:" + name + "
    " + "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完成

  • 相关阅读:
    Mac10.12下Python3.4调用oracle
    java或Jmeter实现两个日期相加减(2003-06-01-2003-05-01)
    Jmeter使用JDBC请求简介
    草火论
    学习五有
    中国特色的信息技术实践中的两种思路:信息索引化和信息持久化
    软件工程基本原理
    东亚文化原理
    临死之前我要写一本《中国哲学史——以自然主义和人道主义的矛盾为视角》
    总体软件观五个规律
  • 原文地址:https://www.cnblogs.com/jjx2013/p/6223737.html
Copyright © 2020-2023  润新知