Android-ContentProvider实例详解,android驱动开发视频

本文详细介绍了Android中ContentProvider的使用,包括如何更新、删除数据,以及利用ContentObserver监听数据变化。通过实例展示了如何创建自定义ContentProvider,并结合SQLite数据库进行数据操作。此外,还探讨了ContentObserver在数据变更时的触发机制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

//把id为1的记录的name字段值更改新为finch

ContentValues updateValues = new ContentValues();

updateValues.put(“name”, “finch”);

Uri updateIdUri = ContentUris.withAppendedId(uri, 1);

resolver.update(updateIdUri, updateValues, null, null);

//删除id为2的记录

Uri deleteIdUri = ContentUris.withAppendedId(uri, 2);

resolver.delete(deleteIdUri, null, null);

5 ContentObserver

ContentObserver(内容观察者),目的是观察特定Uri引起的数据库的变化,继而做一些相应的处理,它类似于数据库技术中的触发器(Trigger),当ContentObserver所观察的Uri发生变化时,便会触发它.

下面是使用内容观察者监听短信的例子:

public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//注册观察者Observser    
this.getContentResolver().registerContentObserver(Uri.parse(“content://sms”),true,new SMSObserver(new Handler()));
}
private final class SMSObserver extends ContentObserver {
public SMSObserver(Handler handler) {
super(handler);
}
@Override
public void onChange(boolean selfChange) {
Cursor cursor = MainActivity.this.getContentResolver().query(
Uri.parse(“content://sms/inbox”), null, null, null, null);
while (cursor.moveToNext()) {
StringBuilder sb = new StringBuilder();
sb.append(“address=”).append(
cursor.getString(cursor.getColumnIndex(“address”)));
sb.append(";subject=").append(
cursor.getString(cursor.getColumnIndex(“subject”)));
sb.append(";body=").append(
cursor.getString(cursor.getColumnIndex(“body”)));
sb.append(";time=").append(
cursor.getLong(cursor.getColumnIndex(“date”)));
System.out.println("--------has Receivered SMS::" + sb.toString());
}
}
}
}

同时可以在ContentProvider发生数据变化时调用 getContentResolver().notifyChange(uri, null)来通知注册在此URI上的访问者。

public class UserContentProvider extends ContentProvider {

public Uri insert(Uri uri, ContentValues values) {

db.insert(“user”, “userid”, values);

getContext().getContentResolver().notifyChange(uri, null);

}

}

##6  实例说明

数据源是SQLite, 用ContentResolver操作ContentProvider。

Constant.Java(储存一些常量)

public class Constant {

public static final String TABLE_NAME = “user”;

public static final String COLUMN_ID = “_id”;

public static final String COLUMN_NAME = “name”;

public static final String AUTOHORITY = “cn.scu.myprovider”;

public static final int ITEM = 1;

public static final int ITEM_ID = 2;

public static final String CONTENT_TYPE = “vnd.android.cursor.dir/user”;

public static final String CONTENT_ITEM_TYPE = “vnd.android.cursor.item/user”;

public static final Uri CONTENT_URI = Uri.parse(“content://” + AUTOHORITY + “/user”);

}

DBHelper.java(操作数据库)

public class DBHelper extends SQLiteOpenHelper {

private static final String DATABASE_NAME = “finch.db”;

private static final int DATABASE_VERSION = 1;

public DBHelper(Context context) {

super(context, DATABASE_NAME, null, DATABASE_VERSION);  
}

@Override

public void onCreate(SQLiteDatabase db)  throws SQLException {

//创建表格

db.execSQL(“CREATE TABLE IF NOT EXISTS “+ Constant.TABLE_NAME + “(”+ Constant.COLUMN_ID +” INTEGER PRIMARY KEY AUTOINCREMENT,” + Constant.COLUMN_NAME +" VARCHAR NOT NULL);");

}

@Override

public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)  throws SQLException {

//删除并创建表格

db.execSQL(“DROP TABLE IF EXISTS “+ Constant.TABLE_NAME+”;”);

onCreate(db);

}

}

MyProvider.java(自定义的ContentProvider)

public class MyProvider extends ContentProvider {

DBHelper mDbHelper = null;

SQLiteDatabase db = null;

private static final UriMatcher mMatcher;

static{

mMatcher = new UriMatcher(UriMatcher.NO_MATCH);    
mMatcher.addURI(Constant.AUTOHORITY,Constant.TABLE_NAME, Constant.ITEM);

mMatcher.addURI(Constant.AUTOHORITY, Constant.TABLE_NAME+"/#", Constant.ITEM_ID);

}

@Override

public String getType(Uri uri) {

switch (mMatcher.match(uri)) {

case Constant.ITEM:

return Constant.CONTENT_TYPE;

case Constant.ITEM_ID:

return Constant.CONTENT_ITEM_TYPE;

default:

throw new IllegalArgumentException(“Unknown URI”+uri);

}

}

@Override

public Uri insert(Uri uri, ContentValues values) {

// TODO Auto-generated method stub

long rowId;

if(mMatcher.match(uri)!=Constant.ITEM){

throw new IllegalArgumentException(“Unknown URI”+uri);

}

rowId = db.insert(Constant.TABLE_NAME,null,values);

if(rowId>0){

Uri noteUri=ContentUris.withAppendedId(Constant.CONTENT_URI, rowId);

getContext().getContentResolver().notifyChange(noteUri, null);

return noteUri;

}

throw new SQLException("Failed to insert row into " + uri);

}

@Override

public boolean onCreate() {

// TODO Auto-generated method stub

mDbHelper = new DBHelper(getContext());

db = mDbHelper.getReadableDatabase();

return true;

}

@Override

public Cursor query(Uri uri, String[] projection, String selection,

String[] selectionArgs, String sortOrder) {

// TODO Auto-generated method stub

Cursor c = null;

switch (mMatcher.match(uri)) {

case Constant.ITEM:

c =  db.query(Constant.TABLE_NAME, projection, selection, selectionArgs, null, null, sortOrder);

break;

case Constant.ITEM_ID:

c = db.query(Constant.TABLE_NAME, projection,Constant.COLUMN_ID + “=”+uri.getLastPathSegment(), selectionArgs, null, null, sortOrder);

break;

default:

throw new IllegalArgumentException(“Unknown URI”+uri);

}

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

return c;

}

@Override

public int update(Uri uri, ContentValues values, String selection,

String[] selectionArgs) {

// TODO Auto-generated method stub

return 0;

}

学习分享

在当下这个信息共享的时代,很多资源都可以在网络上找到,只取决于你愿不愿意找或是找的方法对不对了

很多朋友不是没有资料,大多都是有几十上百个G,但是杂乱无章,不知道怎么看从哪看起,甚至是看后就忘

如果大家觉得自己在网上找的资料非常杂乱、不成体系的话,我也分享一套给大家,比较系统,我平常自己也会经常研读。

2020最新上万页的大厂面试真题

七大模块学习资料:如NDK模块开发、Android框架体系架构…

只有系统,有方向的学习,才能在段时间内迅速提高自己的技术。

这份体系学习笔记,适应人群:
第一,学习知识比较碎片化,没有合理的学习路线与进阶方向。
第二,开发几年,不知道如何进阶更进一步,比较迷茫。
第三,到了合适的年纪,后续不知道该如何发展,转型管理,还是加强技术研究。如果你有需要,我这里恰好有为什么,不来领取!说不定能改变你现在的状态呢!
Zmpmg-1643778886943)]

七大模块学习资料:如NDK模块开发、Android框架体系架构…

[外链图片转存中…(img-AAjaxabE-1643778886944)]

只有系统,有方向的学习,才能在段时间内迅速提高自己的技术。

这份体系学习笔记,适应人群:
第一,学习知识比较碎片化,没有合理的学习路线与进阶方向。
第二,开发几年,不知道如何进阶更进一步,比较迷茫。
第三,到了合适的年纪,后续不知道该如何发展,转型管理,还是加强技术研究。如果你有需要,我这里恰好有为什么,不来领取!说不定能改变你现在的状态呢!
由于文章内容比较多,篇幅不允许,部分未展示内容以截图方式展示 。如有需要获取完整的资料文档的朋友点击我的GitHub免费获取。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值