下列选项中,用于操作手机短信程序暴露的数据的是()。 A.ContentProvider B.ContentResolver C.ContentObserver D.SQLiteDatabase
时间: 2024-04-23 13:24:17 浏览: 120
答案是A.ContentProvider。手机短信程序暴露了一些数据,如短信内容、发送者、接收者等,这些数据可以通过ContentProvider来进行操作。ContentProvider是Android中的一种组件,用于对外提供数据访问接口,可用于访问系统或应用程序的数据。而ContentResolver是用于访问ContentProvider提供的数据的类,ContentObserver则是用于监听ContentProvider数据变化的类。SQLiteDatabase则是用于操作SQLite数据库的类。
相关问题
下列选项中,能观察到系统短信数据库的变化的类是()。 A.ContentProvider B.SQLiteDatabase C.ContentObserver D.ContentResolver
答案是C.ContentObserver。在Android中,ContentObserver是一种用于监听ContentProvider数据变化的类。ContentProvider是一种用于管理应用程序私有数据和共享数据的组件,其中包括系统短信数据库。通过ContentObserver对象,可以监听ContentProvider中数据的变化,并在数据变化时执行相应的操作。例如,以下是一个监听系统短信数据库变化的ContentObserver的示例:
```
ContentResolver resolver = getContentResolver();
ContentObserver observer = new ContentObserver(null) {
@Override
public void onChange(boolean selfChange) {
super.onChange(selfChange);
// 在此执行短信数据库变化时的操作
}
};
resolver.registerContentObserver(Uri.parse("content://sms"), true, observer);
```
在上面的代码中,registerContentObserver()方法用于注册一个ContentObserver对象,监听系统短信数据库的变化。当系统短信数据库发生变化时,ContentObserver对象的onChange()方法会被调用,然后可以在该方法中执行相应的操作。因此,选项C是正确的描述。选项A的ContentProvider是一种管理应用程序私有数据和共享数据的组件;选项B的SQLiteDatabase是一种用于操作SQLite数据库的类;选项D的ContentResolver是一种用于访问ContentProvider提供的数据的类。
ContentProvider、ContentResolver的主要代码
ContentProvider:
```java
public class MyContentProvider extends ContentProvider {
// 数据库名称
private static final String DB_NAME = "my_db";
// 数据库版本号
private static final int DB_VERSION = 1;
// 表名
private static final String TABLE_NAME = "my_table";
// ContentProvider的Uri
public static final Uri CONTENT_URI = Uri.parse("content://com.example.mycontentprovider");
// ContentProvider支持的MIME类型
private static final String CONTENT_TYPE = "vnd.android.cursor.dir/vnd.com.example.mycontentprovider";
private static final String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/vnd.com.example.mycontentprovider";
// 数据库操作对象
private SQLiteDatabase db;
@Override
public boolean onCreate() {
// 初始化数据库
DBHelper dbHelper = new DBHelper(getContext(), DB_NAME, null, DB_VERSION);
db = dbHelper.getWritableDatabase();
return true;
}
@Nullable
@Override
public Cursor query(@NonNull Uri uri, @Nullable String[] projection, @Nullable String selection, @Nullable String[] selectionArgs, @Nullable String sortOrder) {
// 查询数据
Cursor cursor = db.query(TABLE_NAME, projection, selection, selectionArgs, null, null, sortOrder);
// 设置通知Uri,当这个Uri发生变化时,ContentObserver会收到通知
cursor.setNotificationUri(getContext().getContentResolver(), uri);
return cursor;
}
@Nullable
@Override
public String getType(@NonNull Uri uri) {
// 根据Uri返回对应的MIME类型
switch (uriMatcher.match(uri)) {
case URI_CODE_ALL:
return CONTENT_TYPE;
case URI_CODE_ONE:
return CONTENT_ITEM_TYPE;
default:
throw new IllegalArgumentException("Unknown URI: " + uri);
}
}
@Nullable
@Override
public Uri insert(@NonNull Uri uri, @Nullable ContentValues values) {
// 插入数据
long rowId = db.insert(TABLE_NAME, null, values);
if (rowId > 0) {
// 插入成功,返回新插入的数据的Uri
Uri newUri = ContentUris.withAppendedId(uri, rowId);
// 通知数据发生变化
getContext().getContentResolver().notifyChange(newUri, null);
return newUri;
} else {
// 插入失败
throw new SQLException("Failed to insert row into " + uri);
}
}
@Override
public int delete(@NonNull Uri uri, @Nullable String selection, @Nullable String[] selectionArgs) {
// 删除数据
int count = db.delete(TABLE_NAME, selection, selectionArgs);
if (count > 0) {
// 删除成功,通知数据发生变化
getContext().getContentResolver().notifyChange(uri, null);
}
return count;
}
@Override
public int update(@NonNull Uri uri, @Nullable ContentValues values, @Nullable String selection, @Nullable String[] selectionArgs) {
// 更新数据
int count = db.update(TABLE_NAME, values, selection, selectionArgs);
if (count > 0) {
// 更新成功,通知数据发生变化
getContext().getContentResolver().notifyChange(uri, null);
}
return count;
}
// Uri匹配器
private static final UriMatcher uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
private static final int URI_CODE_ALL = 1;
private static final int URI_CODE_ONE = 2;
static {
uriMatcher.addURI("com.example.mycontentprovider", TABLE_NAME, URI_CODE_ALL);
uriMatcher.addURI("com.example.mycontentprovider", TABLE_NAME + "/#", URI_CODE_ONE);
}
}
```
ContentResolver:
```java
public class MyActivity extends Activity {
// ContentProvider的Uri
private static final Uri CONTENT_URI = Uri.parse("content://com.example.mycontentprovider/my_table");
// ContentProvider支持的MIME类型
private static final String CONTENT_TYPE = "vnd.android.cursor.dir/vnd.com.example.mycontentprovider";
private static final String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/vnd.com.example.mycontentprovider";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_my);
// 查询数据
Cursor cursor = getContentResolver().query(CONTENT_URI, null, null, null, null);
if (cursor != null) {
while (cursor.moveToNext()) {
String data = cursor.getString(cursor.getColumnIndex("data"));
Log.d("MyActivity", "data: " + data);
}
cursor.close();
}
// 插入数据
ContentValues values = new ContentValues();
values.put("data", "Hello, ContentProvider!");
Uri newUri = getContentResolver().insert(CONTENT_URI, values);
Log.d("MyActivity", "newUri: " + newUri);
// 更新数据
values.put("data", "Hello, ContentResolver!");
int count = getContentResolver().update(newUri, values, null, null);
Log.d("MyActivity", "count: " + count);
// 删除数据
count = getContentResolver().delete(newUri, null, null);
Log.d("MyActivity", "count: " + count);
}
}
```
阅读全文