ContentProvider是一种数据共享型的组件,用于向其他组件或者其他应用提供共享数据。它的内部维持着一份数据集合,可以通过数据库来实现,也可以采用其他任何类型来实现增删改查四种操作。
在学习ContentProvider之前,先了解其他数据存储的方法。
文件存储对存储的内容不做任何个格式化处理,所有的数据都是原封不动的保存在本地,适合存储一些简单的文本数据或二进制数据。
文件存储的默认储存路径是/data/data< package name>/files
Context类提供了一个openFileOutput()方法,用于将数据存储到指定文件。
FileOutputStream openFileOutput(String fileName, int Mode)
openFileOutput()的返回值是FileOutputStream对象,得到这个对象后,就可以使用java的字节流处理方式存储数据了。
openFileOutput()的第一个参数是文件名,此文件名中不包含路径。
openFileOutput()的第二个参数是文件的操作模式:
Context类提供了一个openFileInput()方法,用于读取指定文件的内容。
FileInputStream openFileInput(String fileName)
openFileInput()的返回值是FileInputStream 对象,得到这个对象后,就可以使用java的字节流处理方式处理数据。
openFileInput()的参数是文件名,此文件名中不包含路径。
SharedPreferences是使用键值对来存储数据的,支持多种数据类型存储。
SharedPreferences的默认储存路径是/data/data< package name>/share_prefs,文件名则根据不同的创建方式稍有不同。
此方法接收两个参数,第一个参数用于指定SharedPreferences文件的名称,如果文件不存在会创建一个。
第二个参数指定操作模式,目前只有MODE_PRIVATE模式选择,表示只有当前应用可以对这个文件进行读写。
此方法接收一个参数,用于指定操作模式,而文件名则是和activity的类名相同。
这是一个静态方法,接收一个Context参数,并使用应用程序的包名作为前缀来命名SharedPreferences文件。
向SharedPreferences文件存储数据,主要分为三步:
SharedPreferences对象提供了一系列get方法,来对应Edit对象的put方法进行读取。这些get方法都接收两个参数。
第一个参数是存储在文件的键,第二个参数是当传入的键找不到对应的值,会以什么默认值进行返回。
ContentValues是一个类似SharedPreferences.Edit的类
它通过put(String key, Object value)方法,存储相关数据。
它的clear()方法用来删除对象内存储的数据。
Cursor 是 android.database.Cursor类,可见出它的设计是基于数据库服务产生的, Cursor所指向的就是每一条数据。
Cursor的一些常用方法:
moveToFirst()
将数据的指针移动到第一行
moveToNext()
将数据的指针移动到下一行
getColumnIndex(String columnName)
返回指定列的名称,如果不存在返回-1
close()
关闭游标,释放资源
SQLiteOpenHelper类用来对数据库进行创建和升级。
数据库文件会存放在/data/data/< package name>/databases/
SQLiteOpenHelper的两个获得Database实例的方法是getWritableDatabase()和getReadableDatabase()。两个方法都可以创建或者打开一个数据库。
SQLiteOpenHelper类一个构造方法有四个参数:
创建一个继承自SQLiteOpenHelper类并重写了onCreate(SQLiteDatabase db)
然后构建出SQLiteOpenHelper实例后,再调用getWritableDatabase()或getReadableDatabase()就会自动创建数据库。
在重写的onCreate()中,可以使用Database.execSQL(String SQLcommand)来添加创建表。
SQLiteOpenHelper在调用getWritableDatabase()或getReadableDatabase()后得到一个SQLiteDatabase实例,通过它的insert、query、update、delete方法可以实现增删改查。
要想访问ContentProvider中共享的数据,需要通过Context的getContentResolver()方法得到ContentResolver实例。
ContentResolver中提供了insert、update、query、delete方法来进行增删改查,与操作数据库的方法类似。不过第一个参数是不一样的,ContentResolver的第一个参数是Uri类型。Uri为数据为ContentProvider提供了一个唯一标识符
Uri字符串由三部分组成:
在得到Uri字符串后,再通过Uri.parse(String UriString)将其解析为Uri对象。
UriMatcher可以实现匹配Uri的功能。
首先通过addUri()方法把authority、path、一段自定义代码传入
然后通过match()方法,传入一个Uri对象,就会返回一段自定义代码。
ContentResolver中提供了insert、update、query、delete方法来进行增删改查,与操作数据库的方法类似。