【android开发-19】android中内容提供者contentProvider用法讲解

2023-12-13 21:56:32

1,内容URI
在Android系统中,Content URI是一种用于唯一标识和访问应用程序中的数据的方法。它由Android系统提供,通过Content Provider来实现数据的共享和访问。

Content URI使用特定的格式来标识数据,通常以"content://"开头,后面跟着由Content Provider定义的数据路径和标识ID。例如,联系人数据的Content URI可能如下所示:

联系人的URI:content://com.android.contacts/contacts
某个联系人的URI:content://com.android.contacts/contacts/1
其中,"com.android.contacts"是联系人的Content Provider的名称,"contacts"是数据表的名称,"1"是联系人的ID。

注意:Content URI由2个部分组成,authority和path。authority是用于对不同应用程序做区分,一般采用程序的包名方式来命名,比如com.exemple.app。path则用于同一应用程序不同的表做区分。比如/table1,/table2.

在Android中,将内容URI解析为URI对象非常简单。可以使用Uri类的静态方法parse()来解析内容URI字符串,并将其转换为Uri对象。

以下是将内容URI解析为URI对象的示例代码:

String contentUriString = "content://com.example.app/data";  
Uri uri = Uri.parse(contentUriString);

在上面的代码中,我们定义了一个内容URI字符串"content://com.example.app/data",然后使用Uri.parse()方法将其解析为Uri对象。解析后的Uri对象可以用于后续的ContentResolver操作,如查询、插入、更新等。

需要注意的是,解析后的Uri对象是不可变的,即无法对其进行修改。如果需要更改URI,可以创建一个新的Uri对象或使用Uri.Builder类来构建一个新的URI。同时,也需要注意在使用Content Provider时需要遵循相应的权限和安全机制,以确保数据的安全性和隐私性。

总之,将内容URI解析为URI对象是Android开发中常见的操作之一,它可以帮助我们更好地访问和操作应用程序中的数据

2,ContentResolver的基本用法

ContentResolver是Android中用于访问各种内容提供者(Content Provider)的接口。内容提供者是一种共享应用程序数据的机制,它允许一个应用程序访问和操作其他应用程序的数据。实现跨进程共享数据。

以下是ContentResolver的基本用法:

1,获取ContentResolver对象:

ContentResolver contentResolver = getContentResolver();

2,使用ContentResolver查询数据:

Cursor cursor = contentResolver.query(uri, projection, selection, selectionArgs, sortOrder);
* `uri`:要查询的数据的URI。  
* `projection`:要检索的列的名称。可以指定一个包含列名的数组。如果该值为null,则会返回所有列。  
* `selection`:SQL查询语句的一部分,用于指定要检索的行。通常使用“?”占位符来避免SQL注入攻击。  
* `selectionArgs`:SQL查询语句中的占位符的值。这是一个字符串数组,可以为每个占位符提供一个值。  
* `sortOrder`:用于对结果进行排序的SQL查询语句。可以指定一个字符串,例如"name ASC"。如果不指定,则结果将按默认顺序返回。

3,处理查询结果:

* 使用`moveToFirst()`方法将光标移动到结果集的第一个条目。  
* 使用`getCount()`方法获取结果集中的条目数。  
* 使用`getString(columnIndex)`、`getInt(columnIndex)`等方法获取特定列的值。

4,关闭Cursor对象:

cursor.close();

在使用完Cursor对象后,应始终关闭它以释放相关资源。

除了查询数据,ContentResolver还可以用于插入、更新和删除数据。这些操作通常使用ContentValues对象来传递数据,并使用Uri对象指定要操作的URI。例如:

插入数据:

Uri uri = contentResolver.insert(uri, contentValues);

更新数据:

int rowsUpdated = contentResolver.update(uri, contentValues, selection, selectionArgs);

删除数据:

int rowsDeleted = contentResolver.delete(uri, selection, selectionArgs);

在Android中,ContentResolver是一个接口,它提供了访问和操作内容提供者(Content Provider)中数据的方法。以下是一个使用ContentResolver的完整参考代码,其中包括查询、插入、更新和删除数据的操作:

// 获取ContentResolver对象  
ContentResolver contentResolver = getActivity().getContentResolver();  
  
// 1. 查询数据  
// 定义URI和查询条件  
Uri uri = Uri.parse("content://com.example.app/data");  
String selection = "name = ?";  
String[] selectionArgs = new String[]{"John"};  
  
// 查询数据  
Cursor cursor = contentResolver.query(uri, null, selection, selectionArgs, null);  
  
// 处理查询结果  
if (cursor != null && cursor.moveToFirst()) {  
    String name = cursor.getString(cursor.getColumnIndex("name"));  
    String age = cursor.getString(cursor.getColumnIndex("age"));  
    // 处理查询结果...  
}  
  
// 关闭Cursor对象  
if (cursor != null) {  
    cursor.close();  
}  
  
// 2. 插入数据  
// 定义URI和插入数据  
Uri newUri = contentResolver.insert(uri, new ContentValues());  
  
// 处理插入结果  
if (newUri != null) {  
    // 处理插入结果...  
}  
  
// 3. 更新数据  
// 定义URI和更新条件以及更新数据  
Uri updateUri = Uri.parse("content://com.example.app/data/1");  
ContentValues values = new ContentValues();  
values.put("age", 31);  
  
int rowsUpdated = contentResolver.update(updateUri, values, null, null);  
  
// 处理更新结果  
if (rowsUpdated > 0) {  
    // 处理更新结果...  
}  
  
// 4. 删除数据  
// 定义URI和删除条件  
Uri deleteUri = Uri.parse("content://com.example.app/data/1");  
int rowsDeleted = contentResolver.delete(deleteUri, null, null);  
  
// 处理删除结果  
if (rowsDeleted > 0) {  
    // 处理删除结果...  
}

在上面的代码中,我们首先获取了一个ContentResolver对象,然后分别进行了查询、插入、更新和删除数据的操作。需要注意的是,在实际开发中,我们需要根据具体的应用程序和数据结构来定义相应的URI和查询条件,以及处理查询结果、插入结果、更新结果和删除结果的方法。同时,也需要注意在使用Content Provider时需要遵循相应的权限和安全机制。

3,创建内容提供器

在Android中创建内容提供器(Content Provider)的步骤如下:

1,创建一个新的类,继承自ContentProvider类。
2,在AndroidManifest.xml文件中声明内容提供器的权限,以便其他应用程序能够访问数据。
3,在AndroidManifest.xml文件中注册内容提供器,包括指定提供器的名称、权限和数据源等信息。
4,实现ContentProvider类中的抽象方法,包括onCreate()、getType()、insert()、update()、delete()和query()等。
5,在需要访问内容提供器的应用程序中,使用ContentResolver类来获取数据。
需要注意的是,内容提供器的实现需要了解Android系统的内部机制和权限管理等方面的知识,因此需要有一定的开发经验和技术水平。同时,为了确保数据的安全性和隐私性,需要对数据访问进行适当的控制和授权。

以下是一个简单的Android内容提供器的开发代码例子:

首先,创建一个新的类,继承自ContentProvider类,并实现抽象方法:

public class MyContentProvider extends ContentProvider {  
    private SQLiteDatabase db;  
  
    @Override  
    public boolean onCreate() {  
        db = SQLiteDatabase.openOrCreateDatabase("mydatabase.db", null);  
        return true;  
    }  
  
    @Override  
    public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {  
        // 执行查询操作,返回查询结果  
        return db.query("mytable", projection, selection, selectionArgs, null, null, sortOrder);  
    }  
  
    @Override  
    public String getType(Uri uri) {  
        // 返回数据类型  
        return "vnd.android.cursor.dir/mydata";  
    }  
  
    @Override  
    public Uri insert(Uri uri, ContentValues values) {  
        // 执行插入操作,返回插入数据的URI  
        long rowId = db.insert("mytable", null, values);  
        return Uri.parse("content://com.example.app.provider/" + rowId);  
    }  
  
    @Override  
    public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {  
        // 执行更新操作,返回更新记录的数量  
        return db.update("mytable", values, selection, selectionArgs);  
    }  
  
    @Override  
    public int delete(Uri uri, String selection, String[] selectionArgs) {  
        // 执行删除操作,返回删除记录的数量  
        return db.delete("mytable", selection, selectionArgs);  
    }  
}

然后,在AndroidManifest.xml文件中声明内容提供器的权限和注册信息:

<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.app">  
  <application>  
    <provider android:name=".MyContentProvider" android:authorities="com.example.app.provider" />  
  </application>  
</manifest>

最后,在需要访问内容提供器的应用程序中,使用ContentResolver类来获取数据:

ContentResolver contentResolver = getActivity().getContentResolver();  
Cursor cursor = contentResolver.query(Uri.parse("content://com.example.app.provider/mytable"), null, null, null, null);  
if (cursor != null && cursor.moveToFirst()) {  
  String name = cursor.getString(cursor.getColumnIndex("name"));  
  String age = cursor.getString(cursor.getColumnIndex("age"));  
  // 处理查询结果...  
}  
cursor.close();

注意:getType方法用于获取uri对象所对应的mime类型。一个内容uri对应的MIME类型由3个部分组成:
1,必须以vnd开头。
2,如果内容uri以路径结尾,则后面接android.cursor.dir/,如果内容uri以id结尾,则后面接vendor.cursor.item/
3,最后接上vnd..
比如,对应content://com.example.app.provider/mytable这个内容uri,对应的MIME类型写成:vnd.android.cursor.dir/mydata

文章来源:https://blog.csdn.net/jiangchaobing_2017/article/details/134851734
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。