android 数据持久化——ContentProvider
一般而言,android操作系统的应用程序所建立的数据只允许自己使用,应用程序彼此间无法借助公用存储器来共享数据,android系统提供了一个机制,即内容提供器(ContentProvider),来公开自己私有的数据到数据内容器,通过该机制,可以供其他应用程序来读取自己内部的数据,当然也可以访问其他应用程序的数据。通常,内容提供器背后都有SQLite数据库的支持,用以存储内容提供内部数据。
实现ContentProvider与实现SQLite的区别:
应用程序实现SQLite时,由应用程序直接与数据库进行对接,所以要在应用程序中实现SQLite的接口:db.onCreate()、db.insert()、db.update()、db.delete()、db.query()和db.close();
实现内容提供器时,在应用程序与数据库之间要实现一个ContentProvider程序,这个ContentProvider程序会直接与数据库进行对接,此时应用程序需要实现和ContentProvider程序接口的方法。
下面该说说如何建立内容提供器了:
首先,实现内容提供器接口:
实现该接口的5个重要方法;
其次,定义数据Uri:
提供器应用程序需要定义一个“基底”Uri,以供其他应用程序访问这一内容提供器,这一个Uri必须是唯一的,且必须是以“content://”开头,content: 表示内容提供器程序所控制数据的位置;在AndroidManifest.xml配置文件中添加如下代码以进行声明:
<!-- 设置类名和授权 multiprocess属性是数据的同步性(同一时间可能有多个程序访问该内容提供器)--><providerandroid:name="ContentProviderClass"android:multiprocess="true"android:authorities="com.example.data_contentprovider.ContentProviderClass" ></provider>
在应用程序中添加如下代码:
//acquire the Uri of ContentProvidergetIntent().setData(Uri.parse("content://com.example.data_contentprovider.ContentProviderClass"));Uri uri = getIntent().getData();
定义一个Uri所在的位置,并设置一个变量来找到内容提供器程序的接口;
如下是一个完整的代码,功能是实现内容提供器的建立以及通过该内容提供器程序来添加和检索数据:
实现内容提供器接口的代码:
package com.example.data_contentprovider;import com.example.data_contentprovider.DB.DBHelper;import android.net.Uri;
import android.content.ContentProvider;
import android.content.ContentValues;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteQueryBuilder;public class ContentProviderClass extends ContentProvider {DBHelper dataBaseHelper; // 定义DataBaseHelper类变量dataBaseHelper// 实现ContentProvider的onCreate方法@Overridepublic boolean onCreate() {// TODO Auto-generated method stubdataBaseHelper = new DBHelper(getContext());return true;}@Overridepublic Uri insert(Uri uri, ContentValues values) {// TODO Auto-generated method stubSQLiteDatabase db = dataBaseHelper.getWritableDatabase();db.insert("test", null, values);return null;}@Overridepublic Cursor query(Uri uri, String[] projection, String selection,String[] selectionArgs, String sortOrder) {// TODO Auto-generated method stubSQLiteDatabase db = dataBaseHelper.getReadableDatabase();SQLiteQueryBuilder queryBuilder = new SQLiteQueryBuilder();queryBuilder.setTables("test");Cursor cursor = queryBuilder.query(db, projection, selection,selectionArgs, null, null, null);return cursor;}@Overridepublic int delete(Uri uri, String selection, String[] selectionArgs) {// TODO Auto-generated method stubreturn 0;}@Overridepublic String getType(Uri uri) {// TODO Auto-generated method stubreturn null;}@Overridepublic int update(Uri uri, ContentValues values, String selection,String[] selectionArgs) {// TODO Auto-generated method stubreturn 0;}}
配置AndroidManifest.xml文件:
<!-- 设置类名和授权 multiprocess属性是数据的同步性(同一时间可能有多个程序访问该内容提供器)--><providerandroid:name="ContentProviderClass"android:multiprocess="true"android:authorities="com.example.data_contentprovider.ContentProviderClass" ></provider>
建立一个SQLite数据库系统来存储和管理数据,同时利用SQLiteOpenHilper类协助建立数据库和SQLiteDatabase类来管理数据库:
package com.example.data_contentprovider.DB;import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.provider.BaseColumns;public class DBHelper extends SQLiteOpenHelper {// 建立test.db数据库public DBHelper(Context context) {super(context, "test.db", null, 1);}// 建立test表@Overridepublic void onCreate(SQLiteDatabase db) {db.execSQL("create table test (" + BaseColumns._ID+ "integer primary key," + "name text," + "description text"+ ");");}// 更新新版本@Overridepublic void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {db.execSQL("DROP TABLE IF EXISTS test");onCreate(db);}}
下面就是provider的应用程序了:
package com.example.data_contentprovider;import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;import android.app.Activity;
import android.content.ContentValues;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.widget.ListView;
import android.widget.SimpleAdapter;public class ContentProviderActivity extends Activity {String [] from = {"column00","column01","column02"};@SuppressWarnings("deprecation")@Overrideprotected void onCreate(Bundle savedInstanceState) {// TODO Auto-generated method stubsuper.onCreate(savedInstanceState);//acquire the Uri of ContentProvidergetIntent().setData(Uri.parse("content://com.example.data_contentprovider.ContentProviderClass"));Uri uri = getIntent().getData();//create some data to testContentValues values = new ContentValues();values.put("name", "marry");values.put("description", "123456");getContentResolver().insert(uri, values); //获取ContentResolver对象(在应用程序B中,通过ContentResolver获取程序A的ContentProvider中的数据。)values.put("name", "hello");values.put("description", "654321");getContentResolver().insert(uri, values);//search db all colum,cursor point to first colum of resultCursor cursor = managedQuery(uri, null, null, null, null);cursor.moveToFirst();//set ArrayList,view more field tableArrayList<Map<String,Object>> data = new ArrayList<Map<String,Object>>();Map<String, Object> item;//from db read data and save to ArrayList data containerfor (int i = 0; i < cursor.getCount(); i++) {item = new HashMap<String, Object>();item.put("column00", cursor.getString(0));item.put("column01", cursor.getString(1));item.put("column02", cursor.getString(2));data.add(item);cursor.moveToNext();}cursor.close();//ArrayList container data save to listViewListView listView = new ListView(this);SimpleAdapter adapter = new SimpleAdapter(this, data, R.layout.activity_content_provider, from, new int[]{R.id.text1,R.id.text2,R.id.text3});listView.setAdapter(adapter);setContentView(listView);}}
provider应用程序就可以通过该内容提供器检索数据库并向其添加数据了。
ContentProvider中重要的几个类:
UriMatcher:
要了解UriMatcher,首先需要了解android中的Uri表示方法,众所周知,Uri为通用资源标识符,它代表的是要操作的数据,Android中的每一种资源(比如文本,图像,视频等)都可以用Uri来表示。Android中的Uri由以下三部分组成:”content://”(即authory),数据的路径,资源标识ID(可选),其中如果存在ID,则表示某一个具体的资源,如果不存在ID,则表示路径下的整体。因此addUri()函数的3个参数也是对应上面的那3个。UriMatcher的匹配过程分为3步:初始化UriMatcher;注册需要用的Uri;与已经注册的Uri进行匹配。
ContentResolver :
当使用ContentProvider在不同的应用程序中共享数据时,其数据的暴露方式是采取类似数据库中表的方法。而ContentResolver 是恰好是采用类似数据库的方法来从ContentProvider中存取数据的,它是通过Uri来查询ContentProvider中提供的数据,查询时,还需知道目的数据库的名称,数据段的数据类型,或者说资源的ID。
SQLiteQueryBuilder:是一个用来生产SQL查询语句的辅助类,可以方便的去访问SQLiteDatabase. 在构造SQL查询语句时,它同样也需要指定表名,指定列名,指定where条件等。
android 数据持久化——ContentProvider相关推荐
- Android数据持久化存储
Android数据持久化存储共有四种方式,分别是文件存储.SharedPreferences.Sqlite数据库和ContentProvider.在本篇幅中只介绍前面三种存储方式,因为ContentP ...
- Android数据持久化:SharePreference
SharePreference:作为Android数据持久化的一种,具有一定的便捷性,适合存储一些体积小的数据. 存储数据方式:键值对的方式,类似于Map: 利用SharePreference.Edi ...
- android 清空数组缓存,Android数据持久化之读写SD卡中内容的方法详解
本文实例讲述了Android数据持久化之读写SD卡中内容的方法.分享给大家供大家参考,具体如下: 前面文章里讲的那三个方法:openFileOutput.openFileInput虽然都能通过流对象O ...
- Android数据持久化
Android数据持久化(存储) 1.SharedPreferences SharedPreferences是Android提供的数据持久化的一种手段,适合单进程.小批量的数据存储与访问.Shared ...
- Android数据持久化技术
Android 数据持久化技术 数据持久化 文件存储 将数据存储到文件中 从文件中读取数据 SharedPreferences存储 使用SharedPreferences存储数据 从SharedPre ...
- Android数据持久化:文件存储
数据持久化: 数据可分为瞬时数据和关键数据.保存在内存之中的数据是瞬时数据,而对于一些关键性数据,后期需要持续使用的,应当保存在存储设备中: 持久化保存方式: 文件存储.SharePreference ...
- Android—数据持久化、SP源码
3种数据持久化: File:openFileInput(String fileName).openFileOutput(String fileName, int mode) 不对存储的内容进行任何的格 ...
- android数据持久化框架,Android:数据持久化、Environment、SharedPreferences、内部存储internalStorage...
1.数据持久化-SDCard//数据持久化-SDCard findViewById(R.id.button1).setOnClickListener(new OnClickListener() { @ ...
- android 数据持久化——读写SD卡中的内容
在前面讲的那三个方法:openFileOutput .openFileInput 虽然都能通过流对象OutputStream和InputStream可以处理任意文件中的数据,但与SharedPrefe ...
最新文章
- 【设计模式】—— 职责链模式ChainOfResponsibility
- tf.name_scope()与tf.variable_scope()
- 《敏捷敬业度》作者访谈
- jQuery 1.9+ 移除$.browser方法
- 压缩感知——SP(subspace pursuit)重构算法前言翻译
- 带你深入理解Java的IO到底是个啥
- 南方cass字体样式设置_cass改变字体格式 cass字体样式管理器
- Java并发编程之美
- Python安装jpype,注意版本对应
- 软件安全之Hook 技术 Inline Hook技术应用 TraceMe.exe
- CSS3重复渐变(线性和径向渐变)
- 【收藏备用】15大超全应用场景总结,进阶主机安全
- C语言使用代码绘制爱心
- 以太网二层技术——VPLS详解
- 解决STM32虚拟U盘枚举过慢的问题
- Unity3D添加天空盒
- csdn竟然还有这种神器!后悔没有早点知道!超好用的csdn插件,别再犹豫了,赶快入手吧!
- 北京/上海内推 | 小红书社区技术部招聘NLP/多模态算法工程师/实习生
- html怎么在线安装,web前端零基础学习教程,如何安装HTML编辑器!
- PCIe ARI (Alternative Routing-ID Interpretation)介绍
热门文章
- python程序打包_python之程序打包
- 七年级计算机工作计划,七年级下学期信息技术教学计划(最新整理)
- k1658停运到什么时候_2021年春运就要开始啦!快来看看各大快递的停运时间吧
- 文献阅读软件_推荐一款阅读英文文献的神器,效率高不少,理解深不少!
- python list join函数_Python中join()函数多种操作代码实例
- idea运行maven:No URLs will be polled as dynamic configuration sources
- java io面试题_【Java面试】Java常见IO面试题!
- 在职测试多年整理了自己常用的Linux命令...
- 开源中国大佬是怎么用Selenium做自动化web测试的
- linux如何检查进程,如何在Linux中检查进程的执行时间