Android-ContentProvider

ContentProvider是一种数据共享型的组件,用于向其他组件或者其他应用提供共享数据。它的内部维持着一份数据集合,可以通过数据库来实现,也可以采用其他任何类型来实现增删改查四种操作。

在学习ContentProvider之前,先了解其他数据存储的方法。

文件存储

文件存储对存储的内容不做任何个格式化处理,所有的数据都是原封不动的保存在本地,适合存储一些简单的文本数据或二进制数据。
文件存储的默认储存路径是/data/data< package name>/files

存储数据到文件中

Context类提供了一个openFileOutput()方法,用于将数据存储到指定文件。

FileOutputStream openFileOutput(String fileName, int Mode)

openFileOutput()的返回值是FileOutputStream对象,得到这个对象后,就可以使用java的字节流处理方式存储数据了。
openFileOutput()的第一个参数是文件名,此文件名中不包含路径。
openFileOutput()的第二个参数是文件的操作模式:

  • MODE_PRIVATE:是默认操作模式,表示文件存在时,会覆盖原文件
  • MODE_APPEND:表示文件存在时,会采用追加的方式

从文件中读取数据

Context类提供了一个openFileInput()方法,用于读取指定文件的内容。

FileInputStream openFileInput(String fileName)

openFileInput()的返回值是FileInputStream 对象,得到这个对象后,就可以使用java的字节流处理方式处理数据。
openFileInput()的参数是文件名,此文件名中不包含路径。

SharedPreferences存储

SharedPreferences是使用键值对来存储数据的,支持多种数据类型存储。
SharedPreferences的默认储存路径是/data/data< package name>/share_prefs,文件名则根据不同的创建方式稍有不同。

获取SharedPreferences对象

Context类中的getSharedPreferences()方法

此方法接收两个参数,第一个参数用于指定SharedPreferences文件的名称,如果文件不存在会创建一个。
第二个参数指定操作模式,目前只有MODE_PRIVATE模式选择,表示只有当前应用可以对这个文件进行读写。

Activity类中的个头Preferences()方法

此方法接收一个参数,用于指定操作模式,而文件名则是和activity的类名相同。

PreferencesManager类中的getDefaultSharedPreferences()方法

这是一个静态方法,接收一个Context参数,并使用应用程序的包名作为前缀来命名SharedPreferences文件。

存储数据到文件中

向SharedPreferences文件存储数据,主要分为三步:

  1. 调用SharedPreferences对象的edit()方法,获取一个SharedPreferences.Editor对象
  2. 调用SharedPreferences.Editor对象的putString(String key, String value) putInt(String key, Int value)等方法
  3. 调用调用SharedPreferences.Editor对象apply()方法提交修改。

从文件中读取数据

SharedPreferences对象提供了一系列get方法,来对应Edit对象的put方法进行读取。这些get方法都接收两个参数。
第一个参数是存储在文件的键,第二个参数是当传入的键找不到对应的值,会以什么默认值进行返回。

SQLite数据库存储

ContentValues

ContentValues是一个类似SharedPreferences.Edit的类
它通过put(String key, Object value)方法,存储相关数据。
它的clear()方法用来删除对象内存储的数据。

Cursor

Cursor 是 android.database.Cursor类,可见出它的设计是基于数据库服务产生的, Cursor所指向的就是每一条数据。
Cursor的一些常用方法:

  • moveToFirst()
    将数据的指针移动到第一行

  • moveToNext()
    将数据的指针移动到下一行

  • getColumnIndex(String columnName)
    返回指定列的名称,如果不存在返回-1

  • close()
    关闭游标,释放资源

创建数据库

SQLiteOpenHelper类用来对数据库进行创建和升级。
数据库文件会存放在/data/data/< package name>/databases/
SQLiteOpenHelper的两个获得Database实例的方法是getWritableDatabase()和getReadableDatabase()。两个方法都可以创建或者打开一个数据库。

SQLiteOpenHelper类一个构造方法有四个参数:

  • Context context
  • String databaseName:创建数据库时指定的数据库名
  • Cursor cursor:允许我们在查询数据时返回一个自定义的Cursor,一般传入null
  • int version:当前数据库的版本号

创建一个继承自SQLiteOpenHelper类并重写了onCreate(SQLiteDatabase db)
然后构建出SQLiteOpenHelper实例后,再调用getWritableDatabase()或getReadableDatabase()就会自动创建数据库。

在重写的onCreate()中,可以使用Database.execSQL(String SQLcommand)来添加创建表。

数据库CRUD

SQLiteOpenHelper在调用getWritableDatabase()或getReadableDatabase()后得到一个SQLiteDatabase实例,通过它的insert、query、update、delete方法可以实现增删改查。

  • insert(String DatabaseName, null, ContentValues values)
    第一个参数是表名,第二个参数是默认空缺参数,第三个参数是ContentValues对象传入数据。
  • update(String DatabaseName, ContentValues values, String selection, new String[]{String selectionArgs})
    第一个参数是表名,第二个参数是ContentValues对象,传入数据,第三、第四个参数通过约束条件决定范围。
  • delete(String DatabaseName, String selection, new String[]{String selectionArgs})
    第一个参数是表名,第二、第三个参数通过约束条件来决定范围。
  • query(String DatabaseName, String columns, String selection, new String[]{String selectionArgs}, null, null, null)
    第一个参数是表名,第二个参数是列名,第三、第四个参数通过约束条件来决定范围。

ContentProvider

要想访问ContentProvider中共享的数据,需要通过Context的getContentResolver()方法得到ContentResolver实例。
ContentResolver中提供了insert、update、query、delete方法来进行增删改查,与操作数据库的方法类似。不过第一个参数是不一样的,ContentResolver的第一个参数是Uri类型。Uri为数据为ContentProvider提供了一个唯一标识符

Uri

Uri字符串由三部分组成:

  • 协议声明
    说明使用的哪种协议,一般是content://
  • authority
    authority用于对不同的程序做区分,所以一般命名都是< package name>.provider
  • path
    是用于对同一程序的不同表做区分,跟在authority后面,一般命名是/table

在得到Uri字符串后,再通过Uri.parse(String UriString)将其解析为Uri对象。

UriMatcher

UriMatcher可以实现匹配Uri的功能。
首先通过addUri()方法把authority、path、一段自定义代码传入
然后通过match()方法,传入一个Uri对象,就会返回一段自定义代码。

ContentProvider CRUD

ContentResolver中提供了insert、update、query、delete方法来进行增删改查,与操作数据库的方法类似。

  • insert(Uri uri, ContentValues values)
    第一个参数是uri对象,第二个参数是ContentValues对象传入数据。
  • update(Uri uri, ContentValues values, String selection, new String[]{String selectionArgs})
    第一个参数是uri对象,第二个参数是ContentValues对象,传入数据,第三、第四个参数通过约束条件决定范围。
  • delete(Uri uri, String selection, new String[]{String selectionArgs})
    第一个参数是uri对象,第二、第三个参数通过约束条件来决定范围。
  • query(String DatabaseName, String columns, String selection, new String[]{String selectionArgs})
    第一个参数是uri对象,第二个参数是列名,第三、第四个参数通过约束条件来决定范围。

你可能感兴趣的:(Android,android,内容提供器)