setNotificationUri

本文探讨了ContentProvider中setNotificationUri方法的作用,解释了该方法如何确保数据更改时能够接收到通知。如果移除此方法调用,虽然不会引发错误,但应用程序将不再能响应数据的变动。

Cursor c = qb.query(mTasksDb,
projection,
selection, selectionArgs,
null, null,
orderBy);

c.setNotificationUri(getContext().getContentResolver(), uri);

return c;
}

In above query implementation for content provider,
can I delete the line c.setNotificationUri(getContext().getContentResolver(),
uri) ??

You can certainly do that if you want to, but if you do, then you won't be
notified if someone goes and modifies the data.

package com.servisetest.uiwidgettest; import android.content.ContentProvider; import android.content.ContentUris; import android.content.ContentValues; import android.content.Context; import android.content.UriMatcher; import android.database.Cursor; import android.database.SQLException; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; import android.database.sqlite.SQLiteQueryBuilder; import android.net.Uri; import android.text.TextUtils; public class MyContentProvider extends ContentProvider { // 定义Authority和URI public static final String AUTHORITY = "com.servisetest.uiwidgettest.provider";// 修改为你的包名 public static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY + "/items"); // URI匹配码 private static final int ITEMS = 1; private static final int ITEM_ID = 2; // 数据库相关变量 private SQLiteDatabase database; static final String DB_NAME = "my_database"; static final int DB_VERSION = 1; static final String TABLE_NAME = "items"; static final String CREATE_TABLE = "CREATE TABLE " + TABLE_NAME + " (id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT)"; // 定义列名常量(方便外部访问) public static final String COLUMN_ID = "_id"; public static final String COLUMN_NAME = "name"; public static final String COLUMN_PHONE = "phone"; // URI匹配器 private static final UriMatcher uriMatcher; static { uriMatcher = new UriMatcher(UriMatcher.NO_MATCH); uriMatcher.addURI(AUTHORITY, "items", ITEMS); uriMatcher.addURI(AUTHORITY, "items/#", ITEM_ID); } // 数据库帮助类 private static class DatabaseHelper extends SQLiteOpenHelper { DatabaseHelper(Context context) { super(context, DB_NAME, null, DB_VERSION); } @Override public void onCreate(SQLiteDatabase db) { db.execSQL(CREATE_TABLE); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME); onCreate(db); } } @Override public boolean onCreate() { Context context = getContext(); DatabaseHelper dbHelper = new DatabaseHelper(context); database = dbHelper.getWritableDatabase(); return (database != null); } @Override public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) { SQLiteQueryBuilder queryBuilder = new SQLiteQueryBuilder(); queryBuilder.setTables(TABLE_NAME); switch (uriMatcher.match(uri)) { case ITEMS: // 查询所有项目 break; case ITEM_ID: // 查询特定ID的项目 queryBuilder.appendWhere("id = " + uri.getLastPathSegment()); break; default: throw new IllegalArgumentException("未知URI: " + uri); } Cursor cursor = queryBuilder.query(database, projection, selection, selectionArgs, null, null, sortOrder); cursor.setNotificationUri(getContext().getContentResolver(), uri); return cursor; } @Override public Uri insert(Uri uri, ContentValues values) { // 验证必填字段 if (!values.containsKey(COLUMN_NAME)) { throw new IllegalArgumentException("必须提供姓名"); } long rowId = database.insert(TABLE_NAME, null, values); if (rowId > 0) { Uri newUri = ContentUris.withAppendedId(CONTENT_URI, rowId); getContext().getContentResolver().notifyChange(newUri, null); return newUri; } throw new SQLException("插入失败: " + uri); } @Override public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) { int count; switch (uriMatcher.match(uri)) { case ITEMS: count = database.update(TABLE_NAME, values, selection, selectionArgs); break; case ITEM_ID: String id = uri.getLastPathSegment(); count = database.update(TABLE_NAME, values, "id = " + id + (!TextUtils.isEmpty(selection) ? " AND (" + selection + ")" : ""), selectionArgs); break; default: throw new IllegalArgumentException("未知URI: " + uri); } getContext().getContentResolver().notifyChange(uri, null); return count; } @Override public int delete(Uri uri, String selection, String[] selectionArgs) { int count; switch (uriMatcher.match(uri)) { case ITEMS: count = database.delete(TABLE_NAME, selection, selectionArgs); break; case ITEM_ID: String id = uri.getLastPathSegment(); count = database.delete(TABLE_NAME, "id = " + id + (!TextUtils.isEmpty(selection) ? " AND (" + selection + ")" : ""), selectionArgs); break; default: throw new IllegalArgumentException("未知URI: " + uri); } getContext().getContentResolver().notifyChange(uri, null); return count; } @Override public String getType(Uri uri) { switch (uriMatcher.match(uri)) { case ITEMS: return "vnd.android.cursor.dir/vnd." + AUTHORITY + ".items"; case ITEM_ID: return "vnd.android.cursor.item/vnd." + AUTHORITY + ".items"; default: throw new IllegalArgumentException("未知URI: " + uri); } } }如何使用contentprovider进行调用
最新发布
09-27
@Override public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) { // 查询数据并返回 Cursor SQLiteDatabase db = myDBHelper.getReadableDatabase(); SQLiteQueryBuilder queryBuilder = new SQLiteQueryBuilder();//构建查询语句 queryBuilder.setTables("contacts");//setTable指定查询表名 switch (uriMatcher.match(uri)){ case ITEMS: //查询所有联系人 break; case ITEM_ID: //查询指定联系人 break; default: throw new IllegalArgumentException("Unknown URI: " + uri); } Cursor cursor = queryBuilder.query(db, projection, selection, selectionArgs, null, null, sortOrder); cursor.setNotificationUri(context.getContentResolver(), uri);//cursor.setNotificationUri()注册数据变化的监听器,当数据发生变化时,通知ContentResolver刷新数据 return cursor; } ContentResolver contentResolver=getContentResolver(); Cursor cursor=contentResolver.query(ContactsProvider.CONTENT_URI,null,null,null,null); Log.d("luo1","cursor为"+cursor); if (cursor != null && cursor.moveToFirst()) {// 查询结果不为空,可以安全地读取数据 do { readContacts(mCalls,cursor);//读取数据库表contacts中的数据 } while (cursor.moveToNext()); cursor.close(); callsAdapter=new CallsAdapter((LinkedList<Calls>) mCalls,mContext );//创建适配器关联数据和 ListView } else {//不存在则mCalls读取系统列表上的联系人信息 callsAdapter=new CallsAdapter((LinkedList<Calls>) getContacts(mCalls),mContext );//创建适配器关联数据和 ListView insertContacts(mCalls);//将mCalls中的(初始)数据信息保存到数据库表contacts中 } 程序闪退,原因可能是
07-22
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值