首页 > 其他分享 >Android学习笔记(四九):通过Content Provider访问数据

Android学习笔记(四九):通过Content Provider访问数据

时间:2023-04-09 12:07:52浏览次数:39  
标签:GravityProvider Uri Content Provider Android null 数据 Constants


在上次笔记中,我们编写了自己的Provider,这次笔记,我们将通过Content Provider的Uri接口对数据进行访问,重写Android学习笔记(四二)中例子。在这里我们不在充分描述相关UI如何编写,可以到笔记(四二)中详细查看,重点讲述如何实现数据的访问。

读取信息

读取信息方式,在笔记(四七)中已经介绍,代码如下


Android学习笔记(四九):通过Content Provider访问数据_insert

private voidread(){ 
     /* 通过managedQuery读取,第1参数表示URI, 第2参数表示所需读取的信息,第3个参数是限制条件,类似SQL中的WHERE;第4个参数和第3个参数配合使用,具体支持第三个参数中的“?”具体为何;第5个参数类似于SQL中的ORDER BY。如果我们是读取具体的instance,而不是collect,可以设置Uri uri = ContentUris.withAppendedId(GravityProvider.Constants.CONTENT_URI,2); */  
     Cursor cursor = managedQuery( GravityProvider.Constants.CONTENT_URI,PROJECTION,null,null,null);

    if(adapter == null){ 
         adapter = new SimpleCursorAdapter(this,R.layout.chapter_22_test1, 
             cursor, 
             new String[]{GravityProvider.Constants.TITLE,GravityProvider.Constants.VALUE},
             new int[]{R.id.c22_name,R.id.c22_gravity}); 
         setListAdapter(adapter); 
     }else{ 
         adapter.changeCursor(cursor); 
         constantsCursor.close(); 
     } 
     constantsCursor = cursor; 
 }

同步信息

Content Provider可以有多个应用进行访问,应用可以对数据进行增删,其他应用也可以对数据进行增删,Provider提供提供一种通知机制,在Uri指向数据发生改变时,通知客户端,允许客户端进行实时同步。

//步骤1(A):定义处理通信的ContentObserver对象
 private ContentObserver observer = null; 
//步骤3:注销,取笑某Uri数据发生变化的通知 
protected void onPause() { 
     ...... ...... 
     getContentResolver().unregisterContentObserver(observer); 
     observer = null; 
} 
//步骤2:注册,要求某Uri的数据发生变化时通知 
protected void onResume() { 
     ...... ...... 
     observer = new MyObserver(); 
     getContentResolver().registerContentObserver(GravityProvider.Constants.CONTENT_URI, true,observer);
} 
//步骤1(B):ContentOberver是一个抽象类,我们需要定义自己收到通知的处理
 private class MyObserver extends ContentObserver{  
     public MyObserver(){ 
         super(new Handler()); 
     }  
     //具体描述收到Provider的通知如何处理,在本例,只需刷新列表即可
     public void onChange(boolean selfChange) {  
        super.onChange(selfChange);  
         read(); 
     } 
 }


Android学习笔记(四九):通过Content Provider访问数据_insert_02

增加数据

增加数据的Uri必须是CollectionUri,有insert( )和bulkInsert( )两个接口,前者是加一个instance,后者是通过array加多个。

private void addData(DialogWrapper wrapper){
    ContentValues cv = new ContentValues(2);
    cv.put(GravityProvider.Constants.TITLE, wrapper.getTitle());
    cv.put(GravityProvider.Constants.VALUE, wrapper.getGravity());
    getContentResolver().insert(GravityProvider.Constants.CONTENT_URI, cv);}

删除数据

删除数据采用delete,可以是instance的Uri,也可以是collection。

Uri uri = ContentUris.withAppendedId(GravityProvider.Constants.CONTENT_URI, rowId);
getContentResolver().delete(uri, null, null);

注意BLOB

BLOB(Binary Large Objects),例如一些图片信息,可以在很多数据库,包括SQLite中支持。Content Provider不能同通过cursor直接访问在这些binary数据,可以在ContentProvider上使用getInputStream()和getOutpurStream()来读写二进制信息。对于image,Andriod不需要将数据copy出来放在某处,然后显示,可以直接实现Uri来显示。

从其他应用访问

我们可以在一个应用中不同的activity进行数据访问,当更常见的情况是在其他应用中访问。经试验,数据访问成功。



标签:GravityProvider,Uri,Content,Provider,Android,null,数据,Constants
From: https://blog.51cto.com/u_9877302/6178721

相关文章

  • Android学习笔记(四八):提供自己的Content Provider
    在上一次的学习中,采用了原生的内容提供者Contact,Contact有多层映射关系,比较复杂,并非作为小例子的好选择,在本次学习中,我们将学习如何建立ContentProvider,并通过Uri进行增删改查。如果应用的数据只需自己使用,并不需要contentprovider,相反避免这样做,可直接访问数据;但是若希望数据可......
  • 小故事:开发者对Android权限的看法
    Wei:投诉一下,App的log.txt放在系统根目录下,这比较过分某L:原来还没改过来……去年就反映过这个问题了。Wei:升级App后,我向其他人发短信,腾讯手机管家报App要读取短信。为什么要监听发短信?可能应为某些功能,要监听来自某号的特殊短信,但为何要监听发送短信?某登:那个流量与内容监控的项目,是......
  • Pro Android学习笔记(四六):Dialog(3):对话框弹对话框
    提示框的按钮Help,将触发弹出新的帮助提示框。帮助提示框的实现帮助提示框的实现很简单,利用重写onCreateView()的方式,点击按钮是执行dismiss(),关闭对话框即可。代码不在此重复。dialogfragment的关闭有两种方式,一种是在dialogfragment中直接执行dismiss(),我们来看看DialogFragmen......
  • Pro Android学习笔记(四五):Dialog(2):DialogFragment
    DialogFragment的实例newInstance()已经在上一次学习笔记中实现。我们创建dialog的UI,可以通过重写DialogFragment的两个函数当中的一个来实现,这两个函数是onCreateView()和onCreateDialog(),前者返回view,后者返回dialog,如同通过AlertDialog.Builder构造一样。重写onCreateView()重写......
  • Pro Android学习笔记(四四):Dialog(1):触发Dialog
    Android提供alert、prompt、pick-list,单选、多选,progress、time-picker和date-picker对话框,并提供自定义的dialog。在Android3.0后,dialog基于fragment,并对之前版本提供兼容支持库,也就是说对于开发者而言,dialog是基于DialogFragment的,但此时需要在应用中加入相关的兼容库。和Window......
  • Pro Android学习笔记(二六):用户界面和控制(14):RelativeLayout
    相对布局:RelativeLayoutRelativeLayout也是非常常用的布局,能够精确对控件的位置进行网格对齐,可以设置在控件与其他控件的相对位置,以及控件在容器中的位置。缺省控件的位置为最上面还最左边。下面结合一个例子来进行解说。<?xmlversinotallow="1.0"encoding="utf-8"?><Relativ......
  • Android遇到内存泄漏和性能优化,需要采取以下措施
    内存泄漏:a.使用内存分析工具,如AndroidStudio的MemoryProfiler或LeakCanary,找出内存泄漏的位置,并修复代码。b.避免在Activity或Fragment中使用静态变量或单例模式,因为它们可能会持有对Activity或Fragment的引用,并导致内存泄漏。c.及时释放不再使用的资源,如关闭文件、释放......
  • Mac M1安装android sdk
    我这边是MacBookproM1芯片的电脑,需要安装androidsdk我在网上找了一圈,没有找到合适的sdk,要么是版本太老,要么是其他原因,后来我直接通过我的idea中进行下载,idea中搜索androidsdk即可下载edit进行安装,之后等待,好了之后进入此路径中,发现adb--version正常了主题你如果在网......
  • Android学习笔记(五二):服务Service(中)- 继承Service类
    通过IntentService的继承类实现命令触发的服务,也可以直接通过Service的继承类来实现。在IntentService中的例子,我们增加了StopService()的方式,用于试验。在实际应用中,IntentService常用于一次性运行,自动结束的情况,不需要人工停止干预。对于需要人工干预的停止的,长时间(或无限制)运行......
  • android沉浸状态栏+导航栏(小白条) 小白教程 (基于安卓官方教程)
    沉浸状态栏+导航栏(小白条)是基本操作,但是网上的很多教程都是错误的...,安卓官方的教程对小白很不友好,所以记录下我的实现过程供大家参考。前置知识状态栏是屏幕顶部显示时间、通知图标等等的地方导航栏就是屏幕下方用于提供返回,返回桌面,进入多任务界面的的三个按键或着小白条......