小伙伴们,在上文中我们介绍了Android数据存储中的SharedPreference,本文我们继续盘点介绍Android开发中的另一个数据存储方式ContentProvider。
ContentProvider是Android中的一个组件,用于在应用程序间共享数据。它可以封装底层的数据存储细节,并提供统一的接口来进行数据的读取、插入、更新和删除操作。通过ContentProvider,应用程序可以安全地访问其他应用程序的数据,实现了数据共享和交互。
ContentProvider
。在该类中,你需要实现一些必要的方法,如onCreate()
、query()
、insert()
、update()
和delete()
,以提供对数据的访问和操作。
<provider>
元素来配置ContentProvider的信息,包括名称、权限等。同时,也可以定义多个URI来定位不同类型的数据。
query()
、insert()
、update()
和delete()
,用于查询、插入、更新和删除数据。
query()
方法查询数据,指定要访问的URI、投影(即要返回的列)、选择条件、排序顺序等参数。该方法返回一个Cursor
对象,可以通过该对象获取查询结果。
insert()
方法向ContentProvider插入数据,指定要插入的URI和要插入的值。该方法返回一个表示新插入行的URI。
update()
方法更新ContentProvider中的数据,指定要更新的URI、要更新的值以及选择条件。该方法返回受影响的行数。
delete()
方法从ContentProvider中删除数据,指定要删除的URI和选择条件。该方法返回删除的行数。
常见属性(Attributes):
android:authorities
:用于在AndroidManifest.xml文件中指定ContentProvider的授权信息,标识ContentProvider提供数据的特定权限。
android:exported
:表示是否允许其他应用程序访问该ContentProvider。默认情况下为false,只有同一应用程序内的组件可以访问此ContentProvider。
android:permission
:指定访问ContentProvider所需的权限。通过定义适当的权限,可以对ContentProvider进行访问控制。
常见方法(Methods):
onCreate()
:在创建ContentProvider时调用,通常用于执行初始化操作,如数据库的打开和连接等。
query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder)
:用于查询数据。参数包括要访问的URI、要返回的列(投影)、选择条件、选择参数和排序顺序。返回一个Cursor对象,可以使用它来获取查询结果。
insert(Uri uri, ContentValues values)
:用于向ContentProvider插入数据。参数包括要插入的URI和要插入的值。返回一个表示新插入行的URI。
update(Uri uri, ContentValues values, String selection, String[] selectionArgs)
:用于更新ContentProvider中的数据。参数包括要更新的URI、要更新的值和选择条件。返回受影响的行数。
delete(Uri uri, String selection, String[] selectionArgs)
:用于从ContentProvider中删除数据。参数包括要删除的URI和选择条件。返回删除的行数。
getType(Uri uri)
:用于获取指定URI的MIME类型。MIME类型用于描述数据的媒体类型,例如"image/jpeg"、"text/plain"等。
创建ContentProvider类:
public class MyContentProvider extends ContentProvider {
// 声明常量,用于定义URI和数据库表信息
private static final String AUTHORITY = "com.example.mycontentprovider";
private static final String TABLE_NAME = "mytable";
public static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY + "/" + TABLE_NAME);
// 数据库帮助类
private DatabaseHelper dbHelper;
@Override
public boolean onCreate() {
// 初始化数据库帮助类
dbHelper = new DatabaseHelper(getContext());
return true;
}
@Nullable
@Override
public Cursor query(@NonNull Uri uri, @Nullable String[] projection, @Nullable String selection, @Nullable String[] selectionArgs, @Nullable String sortOrder) {
// 查询数据
SQLiteDatabase db = dbHelper.getReadableDatabase();
Cursor cursor = db.query(TABLE_NAME, projection, selection, selectionArgs, null, null, sortOrder);
if (cursor != null) {
cursor.setNotificationUri(getContext().getContentResolver(), uri);
}
return cursor;
}
@Nullable
@Override
public String getType(@NonNull Uri uri) {
// 获取MIME类型
return null;
}
@Nullable
@Override
public Uri insert(@NonNull Uri uri, @Nullable ContentValues values) {
// 插入数据
SQLiteDatabase db = dbHelper.getWritableDatabase();
long id = db.insert(TABLE_NAME, null, values);
getContext().getContentResolver().notifyChange(uri, null);
return ContentUris.withAppendedId(CONTENT_URI, id);
}
@Override
public int delete(@NonNull Uri uri, @Nullable String selection, @Nullable String[] selectionArgs) {
// 删除数据
SQLiteDatabase db = dbHelper.getWritableDatabase();
int count = db.delete(TABLE_NAME, selection, selectionArgs);
getContext().getContentResolver().notifyChange(uri, null);
return count;
}
@Override
public int update(@NonNull Uri uri, @Nullable ContentValues values, @Nullable String selection, @Nullable String[] selectionArgs) {
// 更新数据
SQLiteDatabase db = dbHelper.getWritableDatabase();
int count = db.update(TABLE_NAME, values, selection, selectionArgs);
getContext().getContentResolver().notifyChange(uri, null);
return count;
}
}
创建DatabaseHelper类:
public class DatabaseHelper extends SQLiteOpenHelper {
private static final String DATABASE_NAME = "mydatabase.db";
private static final int DATABASE_VERSION = 1;
private static final String CREATE_TABLE_SQL = "CREATE TABLE mytable (_id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT)";
public DatabaseHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(CREATE_TABLE_SQL);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// 数据库升级操作
}
}
注册ContentProvider: 在AndroidManifest.xml文件中添加如下代码,注册ContentProvider:
<provider
android:name=".MyContentProvider"
android:authorities="com.example.mycontentprovider" />
使用ContentProvider: 可以使用内容解析器(ContentResolver)来与ContentProvider进行交互,以下是一些示例代码:
查询数据:
String[] projection = {"_id", "name"};
String selection = null;
String[] selectionArgs = null;
String sortOrder = null;
Cursor cursor = getContentResolver().query(MyContentProvider.CONTENT_URI, projection, selection, selectionArgs, sortOrder);
if (cursor != null) {
// 处理查询结果
while (cursor.moveToNext()) {
int idIndex = cursor.getColumnIndex("_id");
int nameIndex = cursor.getColumnIndex("name");
int id = cursor.getInt(idIndex);
String name = cursor.getString(nameIndex);
// 打印数据
Log.d("MyContentProvider", "id: " + id + ", name: " + name);
}
cursor.close();
}
插入数据:
ContentValues values = new ContentValues();
values.put("name", "John");
Uri uri = getContentResolver().insert(MyContentProvider.CONTENT_URI, values);
更新数据:
ContentValues values = new ContentValues();
values.put("name", "Michael");
String selection = "_id=?";
String[] selectionArgs = {"1"};
int count = getContentResolver().update(MyContentProvider.CONTENT_URI, values, selection, selectionArgs);
删除数据:
String selection = "_id=?";
String[] selectionArgs = {"1"};
int count = getContentResolver().delete(MyContentProvider.CONTENT_URI, selection, selectionArgs);
通过这个简单的ContentProvider案例,你可以了解到创建、注册和使用ContentProvider的基本步骤。
总体而言,ContentProvider是Android中一个功能强大且重要的组件,它提供了一种标准化的方式来实现不同应用之间的数据共享和访问。合理利用ContentProvider能够增加应用的灵活性、安全性和可维护性,从而提升用户体验和开发效率。