Android入门:ContentProvider

本文详细介绍了Android中的ContentProvider组件,包括其定义、用途及开发步骤。通过示例代码展示了如何实现数据的增删改查功能。

一、ContentProvider介绍

 

ContentProvider翻译为“内容提供者”;

定义:指该应用包含一些方法,供外界访问,其他应用程序可以调用该方法,比如如果应用A创建了一个数据库“test.db”,默认是私有的,即其他应用程序不能对其进行操作,但是如果应用A使用了ContentProvider,则其他应用程序可以访问该数据库;

用途:某个应用对外共享数据;

注意点:和Activity一样,都是Android 的Component之一,如果要创建,则需要在AndroidManifest.xml中设置;

好处:提供了统一的insert,update,delete,query方法,操作任何数据;

 

二、URI介绍

 

URI:类似于我们以前使用的URI,但是此处URI的目的是为了能够根据URI以及调用的方法来决定怎样操作数据,比如:

uri="..../person",调用insert方法,则表示需要插入一条person记录;

ContentProvider中使用的URI注意点:

(1)以  content://   开头;

(2)模式为:content://authorities/path;其中authorities类似于域名或IP,用来标识操作哪个ContentProvider,path表示具体的操作;

举例:

content://org.xiazdong.providers.personprovider/person 表示调用“org.xiazdong.providers.personprovider”的方法,操作person数据;

 

补充:ContentUris辅助类

 

URI uri = ContentUris.withAppendId(URI param,int id);  //为某个URI添加一个ID

比如param = "content://authorities/person",id=10,则uri = "content://authorities/person/10";

long id = ContentUris.parseId(URI uri); //提取URI中最后的ID

比如uri = "content://authorities/person/10",则返回的id=10;

 

三、ContentProvider开发步骤简要说明

 

1.创建一个类,并继承ContentProvider,比如PersonProvider;

2.在AndroidManifest.xml中设置:

<provider android:name=".PersonProvider" android:authorities="org.xiazdong.provides.personprovider"/>

3.定义UriMatcher,

private UriMatcher matcher = new UriMatcher(UriMatcher.NO_MATCH);  //创建一个URI匹配器,参数为不匹配时的返回值

在onCreate中使用matcher.addURI("authorities","path",code);  //加入匹配的URI,如果匹配,则matcher.match(uri)返回code;

如果要匹配:content://authorities/path/数字  ,则matcher.addURI("authorites","path/#",code);

4.重写:

onCreate():用于为操作数据做准备;

insert:插入数据,返回插入的记录所代表的URI;

update:更新数据,返回操作影响的记录行数;

delete:删除数据,返回操作影响的记录行数;

query:查询数据,返回Cursor;

getType:记录的类型,如果操作集合,则必须以vnd.android.cursor.dir开头,如果操作非集合,则必须以vnd.android.cursor.item开头,比vnd.android.cursor.dir/person

5.外部调用:

ContentResolver resolver = this.getContext().getContentResolver();

resolver.insert();

resolver.update();

resolver.delete();

resolver.query();

 

四、应用实例

 

AndroidManifest.xml

[html]  view plain  copy
  1. <provider  
  2.             android:name=".PersonProvider"  
  3.             android:authorities="org.xiazdong.provides.personprovider"              
  4.             ></provider>  

 

PersonProvider.Java

[java]  view plain  copy
  1. package org.xiazdong.db;  
  2.   
  3. import android.content.ContentProvider;  
  4. import android.content.ContentUris;  
  5. import android.content.ContentValues;  
  6. import android.content.UriMatcher;  
  7. import android.database.Cursor;  
  8. import android.database.sqlite.SQLiteDatabase;  
  9. import android.net.Uri;  
  10.   
  11. public class PersonProvider extends ContentProvider{  
  12.     private DatabaseHelper helper;  
  13.     private SQLiteDatabase db;  
  14.     private UriMatcher matcher = new UriMatcher(UriMatcher.NO_MATCH);  
  15.     @Override  
  16.     public boolean onCreate() {  
  17.         helper = new DatabaseHelper(this.getContext());  
  18.         //匹配:content://org.xiazdong.provides.personprovider/person,返回值为1  
  19.         matcher.addURI("org.xiazdong.provides.personprovider""person"1);  
  20.         //匹配:content://org.xiazdong.provides.personprovider/person/数字,返回值为2  
  21.         matcher.addURI("org.xiazdong.provides.personprovider""person/#"2);  
  22.         return true;  
  23.     }  
  24.   
  25.     @Override  
  26.     public Cursor query(Uri uri, String[] projection, String selection,  
  27.             String[] selectionArgs, String sortOrder) {  
  28.         db = helper.getWritableDatabase();  
  29.         switch(matcher.match(uri)){  
  30.         case 1//查询所有记录  
  31.             return db.query("person", projection, selection, selectionArgs, nullnullnull);  
  32.         case 2://查询特定记录  
  33.             long id = ContentUris.parseId(uri);  
  34.             String where = "id="+id;  
  35.             if(selection!=null&&!"".equals(selection)){ //因为selection可能还包含其他的where语句,需要再加上 "and id=?"  
  36.                 where = where + " and "+selection;  
  37.             }  
  38.             return db.query("person", projection, where, selectionArgs, nullnullnull);  
  39.         default:  
  40.             throw new IllegalArgumentException("wrong uri");  
  41.         }  
  42.     }  
  43.     /* 
  44.      * 如果操作集合,则必须以vnd.android.cursor.dir开头 
  45.      * 如果操作非集合,则必须以vnd.android.cursor.item开头 
  46.      * */  
  47.     @Override  
  48.     public String getType(Uri uri) {  
  49.         switch(matcher.match(uri)){  
  50.         case 1:  
  51.             return "vnd.android.cursor.dir/person";  
  52.         case 2:  
  53.             return "vnd.android.cursor.item/person";  
  54.         }  
  55.     }  
  56.     /* 
  57.      * values为插入的数据 
  58.      * 返回:插入的数据所代表的URI 
  59.      * */  
  60.     @Override  
  61.     public Uri insert(Uri uri, ContentValues values) {  
  62.         db = helper.getWritableDatabase();  
  63.         switch(matcher.match(uri)){  
  64.         case 1:  
  65.             long rowid = db.insert("person"null, values);  
  66.             return ContentUris.withAppendedId(uri, rowid);  //返回插入的记录所代表的URI  
  67.         default:  
  68.             throw new IllegalArgumentException("wrong uri");  
  69.         }  
  70.     }  
  71.     @Override  
  72.     public int delete(Uri uri, String selection, String[] selectionArgs) {  
  73.         db = helper.getWritableDatabase();  
  74.         switch(matcher.match(uri)){  
  75.         case 1:return db.delete("person", selection, selectionArgs);  
  76.         case 2//删除特定id记录  
  77.             long id = ContentUris.parseId(uri);  
  78.             String where = "id="+id;  
  79.             if(selection!=null&&!"".equals(selection)){  
  80.                 where  += " and "+selection;  
  81.             }  
  82.             return db.delete("person", where, selectionArgs);  
  83.         default:  
  84.             throw new IllegalArgumentException("wrong uri");  
  85.         }  
  86.     }  
  87.     @Override  
  88.     public int update(Uri uri, ContentValues values, String selection,  
  89.             String[] selectionArgs) {  
  90.         db = helper.getWritableDatabase();  
  91.         switch(matcher.match(uri)){  
  92.         case 1:return db.update("person", values, selection, selectionArgs);  
  93.         case 2//更新特定id记录  
  94.             long id = ContentUris.parseId(uri);  
  95.             String where = "id="+id;  
  96.             if(selection!=null&&!"".equals(selection)){  
  97.                 where  += " and "+selection;  
  98.             }  
  99.             return db.update("person", values,where, selectionArgs);  
  100.         default:  
  101.             throw new IllegalArgumentException("wrong uri");  
  102.         }  
  103.     }  
  104. }  

以下我们创建一个测试类:

 

ContentProviderTest.java

 

[java]  view plain  copy
  1. package org.xiazdong.db.test;  
  2.   
  3. import org.xiazdong.db.domain.Person;  
  4.   
  5. import android.content.ContentResolver;  
  6. import android.content.ContentValues;  
  7. import android.database.Cursor;  
  8. import android.net.Uri;  
  9. import android.test.AndroidTestCase;  
  10. import android.util.Log;  
  11.   
  12. public class ContentProviderTest extends AndroidTestCase{  
  13.     public void testInsert()throws Exception{   //插入"name=yyy,age=100"的记录  
  14.         Uri uri = Uri.parse("content://org.xiazdong.provides.personprovider/person");  
  15.         ContentResolver resolver = this.getContext().getContentResolver();  
  16.         ContentValues values = new ContentValues();  
  17.         values.put("name""yyy");  
  18.         values.put("age"100);  
  19.         resolver.insert(uri, values);  
  20.     }  
  21.     public void testUpdate()throws Exception{   //更新id=5的记录为name=yyy,age=100  
  22.         Uri uri = Uri.parse("content://org.xiazdong.provides.personprovider/person/5");  
  23.         ContentResolver resolver = this.getContext().getContentResolver();  
  24.         ContentValues values = new ContentValues();  
  25.         values.put("name""yyy");  
  26.         values.put("age"100);  
  27.         resolver.update(uri, values, nullnull);  
  28.     }  
  29.     public void testDelete()throws Exception{   //删除id=11的记录  
  30.         Uri uri = Uri.parse("content://org.xiazdong.provides.personprovider/person/5"); //删除id=11的记录  
  31.         ContentResolver resolver = this.getContext().getContentResolver();  
  32.         resolver.delete(uri, nullnull);  
  33.     }  
  34.     public void testQuery()throws Exception{    //插入全部记录并显示  
  35.         Uri uri = Uri.parse("content://org.xiazdong.provides.personprovider/person");   //查询所有记录  
  36.         ContentResolver resolver = this.getContext().getContentResolver();  
  37.         Cursor cursor = resolver.query(uri, nullnullnullnull);  
  38.         while(cursor.moveToNext()){  
  39.             Person person = new Person(cursor.getInt(cursor.getColumnIndex("id")),cursor.getString(cursor.getColumnIndex("name")),cursor.getInt(cursor.getColumnIndex("age")));  
  40.             Log.v("ContentProvider", person.toString());  
  41.         }  
  42.     }  
  43. }  
基于51单片机,实现对直流电机的调速、测速以及正反转控制。项目包含完整的仿真文件、源程序、原理图和PCB设计文件,适合学习和实践51单片机在电机控制方面的应用。 功能特点 调速控制:通过按键调整PWM占空比,实现电机的速度调节。 测速功能:采用霍尔传感器非接触式测速,实时显示电机转速。 正反转控制:通过按键切换电机的正转和反转状态。 LCD显示:使用LCD1602液晶显示屏,显示当前的转速和PWM占空比。 硬件组成 主控制器:STC89C51/52单片机(与AT89S51/52、AT89C51/52通用)。 测速传感器:霍尔传感器,用于非接触式测速。 显示模块:LCD1602液晶显示屏,显示转速和占空比。 电机驱动:采用双H桥电路,控制电机的正反转和调速。 软件设计 编程语言:C语言。 开发环境:Keil uVision。 仿真工具:Proteus。 使用说明 液晶屏显示: 第一行显示电机转速(单位:转/分)。 第二行显示PWM占空比(0~100%)。 按键功能: 1键:加速键,短按占空比加1,长按连续加。 2键:减速键,短按占空比减1,长按连续减。 3键:反转切换键,按下后电机反转。 4键:正转切换键,按下后电机正转。 5键:开始暂停键,按一下开始,再按一下暂停。 注意事项 磁铁和霍尔元件的距离应保持在2mm左右,过近可能会在电机转动时碰到霍尔元件,过远则可能导致霍尔元件无法检测到磁铁。 资源文件 仿真文件:Proteus仿真文件,用于模拟电机控制系统的运行。 源程序:Keil uVision项目文件,包含完整的C语言源代码。 原理图:电路设计原理图,详细展示了各模块的连接方式。 PCB设计:PCB布局文件,可用于实际电路板的制作。
【四旋翼无人机】具备螺旋桨倾斜机构的全驱动四旋翼无人机:建模与控制研究(Matlab代码、Simulink仿真实现)内容概要:本文围绕具备螺旋桨倾斜机构的全驱动四旋翼无人机展开研究,重点进行了系统建模与控制策略的设计与仿真验证。通过引入螺旋桨倾斜机构,该无人机能够实现全向力矢量控制,从而具备更强的姿态调节能力和六自由度全驱动特性,克服传统四旋翼欠驱动限制。研究内容涵盖动力学建模、控制系统设计(如PID、MPC等)、Matlab/Simulink环境下的仿真验证,并可能涉及轨迹跟踪、抗干扰能力及稳定性分析,旨在提升无人机在复杂环境下的机动性与控制精度。; 适合人群:具备一定控制理论基础和Matlab/Simulink仿真能力的研究生、科研人员及从事无人机系统开发的工程师,尤其适合研究先进无人机控制算法的技术人员。; 使用场景及目标:①深入理解全驱动四旋翼无人机的动力学建模方法;②掌握基于Matlab/Simulink的无人机控制系统设计与仿真流程;③复现硕士论文级别的研究成果,为科研项目或学术论文提供技术支持与参考。; 阅读建议:建议结合提供的Matlab代码与Simulink模型进行实践操作,重点关注建模推导过程与控制器参数调优,同时可扩展研究不同控制算法的性能对比,以深化对全驱动系统控制机制的理解。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值