全部 文章 问答 分享 共找到18个相关内容
[问答] contentProvider无法取到被greendao数据库中的数据

之前有一个做好的app,现在需要在首页显示这个app中获取的数据,目前的想法是通过ContentProvider获取数据,然后将数据显示在首页,但之前的数据存在通过greendao封装的数据库中,

2021-07-16 16:58 · Android开发
[文章] Android四大组件之内容提供者(ContentProvider)
ContentProvider概述ContentProvider是不同应用程序间共享数据的一个组件。为什么使用?
[问答] 学习内容提供者第8节视频,为什么插入数据后监听不到数据的变化?
R.layout.activity_main);ContentResolvercontentResolver=getContentResolver();Uriuri=Uri.parse("content://com.example.contentprovider
2020-04-23 17:05 · Android
[文章] 31、Android开发基础之内容提容者ContentProvider
好,回到我们的内容提供者上面:ContentProvider内容提供者,我们从字面上认识,就是一个提供内容的东西!这东西常用吗?
[问答] content provider跨进程通信cursor

URI路径也对,provider也注册了,在同一个APK可以获取到contentprovider的数据,但是跨进程就不行了,哪个大神帮忙解答一下,谢谢

2022-03-03 17:15
                ·
                contentprovider
[问答] Android性能问题
APP本地存储(读写)数据较多,而且频繁,如果使用ContentProvider
2023-08-04 15:53 · Android
[文章] ContentProvider 模仿SpringMVC 进行开发
纯整活,多半不好用。但是看起来像web开发1.基本思路模仿springMvc,构建一个dispatcherServlet,进行请求转发2.约定为了实现这个目的,同时简化开发,进行以下约定:内容提供者实现的方法:仅实现query方法。因为这个方法相对其他方法,可以返回一个Cursor,返回格式限制较小接收方面,也提供了较多可选位置请求路径格式:content://authorities/api/内容提供者id/方法名?参数名1=值1&参数名2=值2例如:content://com.example.server.provider.GeoInfoProvider/api/geo/findById?id=1支持的参数:为了便于解析,不允许使用path参数。只允许使用query参数,放置在uri中支持请求体参数,以json格式放置在selectionArgs[0],不支持二进制类型请求体请求方法:为便于解析,不保留getputpostdelete等请求方式所有请求以方法名作为标识符响应:响应统一以json格式放置在Cursor的第一行第一列内容提供者的“接口”开发:每新增一个“接口”,都需要在adapter方法的switch中,添加一个case"方法名",内部进行方法调用,所有接口方法,必须返回一个Result类型的对象示例:publicResultadapter(StringmethodName,Uriuri,StringrequestBodyJson){Resultresult=null;switch(methodName){case"findById":result=findById(uri,requestBodyJson);break;case"deleteById":result=deleteById(uri,requestBodyJson);break;case"updateById":result=updateById(uri,requestBodyJson);break;case"addGeoInfo":result=addGeoInfo(uri,requestBodyJson);break;}returnresult;}开发者仅负责实现业务方法内容,剩余部分交给固定代码“客户端”对“接口”进行请求:“客户端”首先要知道要请求的目标内容提供者的authorities,以及该内容提供者的“id”即填写AUTHORITIES和PROVIDER_ID变量示例:privatestaticfinalStringAUTHORITIES="com.example.content_provider_07_server.provider.GeoInfoProvider";privatestaticfinalStringPROVIDER_ID="geo";privatestaticfinalStringBASE_PATH=AUTHORITIES+"/api/"+PROVIDER_ID;组合后得到BASE_PATH其次,需要知道要请求的方法名,以及需要传递的参数。最后,调用request(StringmethodName,Map<String,String>parameter,Objectbody),将参数传入,会得到一个Result对象作为返回值,该对象就是接口的响应。示例:Resultr1=request("addGeoInfo",null,geoInfo);接下来请看代码实现。3.“服务端示例代码”publicclassGeoInfoProviderextendsContentProvider{privatefinalGsongson=newGson();/***响应结果类*/staticclassResultimplementsSerializable{privateIntegercode;privateStringmsg;privateObjectdata;publicResult(){}publicstaticResultsuccess(Objectdata){returnbuild(200,"成功",data);}publicstaticResultsuccess(){returnbuild(200,"成功",null);}publicstaticResultsuccess(Stringmsg){returnbuild(200,msg,null);}publicstaticResultfail(Stringmsg){returnbuild(400,msg,null);}publicstaticResultbuild(Integercode,Stringmsg,Objectdata){Resultresult=newResult();result.setCode(code);result.setMsg(msg);result.setData(data);returnresult;}publicIntegergetCode(){returncode;}publicvoidsetCode(Integercode){this.code=code;}publicStringgetMsg(){returnmsg;}publicvoidsetMsg(Stringmsg){this.msg=msg;}publicObjectgetData(){returndata;}publicvoidsetData(Objectdata){this.data=data;}}publicGeoInfoProvider(){}@OverridepublicbooleanonCreate(){returntrue;}@OverridepublicStringgetType(Uriuri){//TODO:ImplementthistohandlerequestsfortheMIMEtypeofthedata//atthegivenURI.thrownewUnsupportedOperationException("Notyetimplemented");}@Nullable@OverridepublicUriinsert(@NonNullUriuri,@NullableContentValuesvalues){thrownewUnsupportedOperationException("Notyetimplemented");}@Overridepublicintdelete(@NonNullUriuri,@NullableStringselection,@NullableString[]selectionArgs){thrownewUnsupportedOperationException("Notyetimplemented");}@Overridepublicintupdate(@NonNullUriuri,@NullableContentValuesvalues,@NullableStringselection,@NullableString[]selectionArgs){thrownewUnsupportedOperationException("Notyetimplemented");}privatestaticfinalStringAUTHORITIES="com.example.server.provider.GeoInfoProvider";privatestaticfinalStringBASE_PATH=AUTHORITIES+"/api/geo";publicGeoInfoDaogeoInfoDao(){returnServerApplication.getServerApplication().getAppDatabase().geoInfoDao();}/***本方法相当于SpringMvc的dispatcherServlet,负责对请求进行转发*增删改,都不要,因为他们不能返回额外的数据,只保留query*方法名:*此处,不保留请求方式,因为太麻烦,请求方式全部在接口名上进行体现*path路径中,前两位分别是apigeo,第三位开始是方法名,不允许有第四层*<p>*参数:*为了便于解析,不允许使用path参数。只允许使用query参数*请求体参数,selectionArgs[0],不支持二进制请求体*<p>*响应:统一以json形式放在Cursor的第一列**@paramuri*@paramprojection*@paramselection*@paramselectionArgs*@paramsortOrder*@return*/@OverridepublicCursorquery(Uriuri,String[]projection,Stringselection,String[]selectionArgs,StringsortOrder){//方法名处理List<String>pathSegments=uri.getPathSegments();StringmethodName=pathSegments.get(2);//请求体参数的处理StringrequestBodyJson="";if(selectionArgs.length>0){requestBodyJson=selectionArgs[0];}//进行接口转发Resultresult=adapter(methodName,uri,requestBodyJson);returnobj2Cursor(result);}/***接口方法适配转发*@parammethodName*@paramuri*@paramrequestBodyJson*@return*/publicResultadapter(StringmethodName,Uriuri,StringrequestBodyJson){Resultresult=null;switch(methodName){case"findById":result=findById(uri,requestBodyJson);break;case"deleteById":result=deleteById(uri,requestBodyJson);break;case"updateById":result=updateById(uri,requestBodyJson);break;case"addGeoInfo":result=addGeoInfo(uri,requestBodyJson);break;}returnresult;}/***添加一条新记录*@paramuri*@paramrequestBodyJson*@return*/privateResultaddGeoInfo(Uriuri,StringrequestBodyJson){if(TextUtils.isEmpty(requestBodyJson)){returnResult.fail("参数错误!");}GeoInfogeoInfo=gson.fromJson(requestBodyJson,GeoInfo.class);geoInfo.setId(null);LonglineNum=geoInfoDao().insertOne(geoInfo);if(lineNum!=-1){returnResult.success("添加成功!");}else{returnResult.fail("添加失败!");}}/***修改数据*@paramuri*@paramrequestBodyJson*@return*/privateResultupdateById(Uriuri,StringrequestBodyJson){if(TextUtils.isEmpty(requestBodyJson)){returnResult.fail("参数错误!");}GeoInfogeoInfo=gson.fromJson(requestBodyJson,GeoInfo.class);if(geoInfo.getId()==null){returnResult.fail("参数错误!");}intupdate=geoInfoDao().update(geoInfo);returnResult.success("修改"+update+"行");}/***根据id删除数据*@paramuri*@paramrequestBodyJson*@return*/privateResultdeleteById(Uriuri,StringrequestBodyJson){GeoInfoDaogeoInfoDao=geoInfoDao();StringidStr=uri.getQueryParameter("id");if(TextUtils.isEmpty(idStr)){returnResult.fail("参数错误!");}inti=geoInfoDao.deleteById(Integer.parseInt(idStr));returnResult.success("删除"+i+"行");}/***根据id查询数据**@paramuri*@paramrequestBodyJson*@return*/privateResultfindById(Uriuri,StringrequestBodyJson){GeoInfoDaogeoInfoDao=geoInfoDao();StringidStr=uri.getQueryParameter("id");if(TextUtils.isEmpty(idStr)){returnResult.fail("参数错误!");}GeoInfogeoInfo=geoInfoDao.findById(Integer.parseInt(idStr));returnResult.success(geoInfo);}/***构造一个Cursor,将obj的json放入第一行第一列**@paramobj*@return*/publicCursorobj2Cursor(Objectobj){returnjson2Cursor(gson.toJson(obj));}/***构造一个Cursor,将json数据放入第一行第一列**@paramjson*@return*/publicCursorjson2Cursor(Stringjson){MatrixCursorcursor=newMatrixCursor(newString[]{"body"});cursor.addRow(newObject[]{json});returncursor;}}4.“客户端”示例代码privatestaticfinalStringAUTHORITIES="com.example.server.provider.GeoInfoProvider";privatestaticfinalStringPROVIDER_ID="geo";privatestaticfinalStringBASE_PATH=AUTHORITIES+"/api/"+PROVIDER_ID;publicstaticfinalGsongson=newGson();@RequiresApi(api=Build.VERSION_CODES.N)privatevoidclick(Viewview){HashMap<String,String>map=newHashMap<>();map.put("id",id.getText().toString());switch(view.getId()){caseR.id.bt_save://添加GeoInfogeoInfo=newGeoInfo(et_01.getText().toString(),Float.parseFloat(et_02.getText().toString()),Float.parseFloat(et_03.getText().toString()));Resultr1=request("addGeoInfo",null,geoInfo);ToastUtil.show(this,r1.getMsg());break;caseR.id.bt_delete://根据id删除Resultr2=request("deleteById",map,null);ToastUtil.show(this,r2.getMsg());break;caseR.id.bt_update:GeoInfoupdateParam=newGeoInfo();updateParam.setLat(Float.parseFloat(et_02.getText().toString()));updateParam.setLng(Float.parseFloat(et_03.getText().toString()));updateParam.setDeviceName(et_01.getText().toString());updateParam.setId(Integer.valueOf(id.getText().toString()));Resultr3=request("updateById",null,updateParam);ToastUtil.show(this,r3.getMsg());break;caseR.id.bt_search_id:Resultr4=request("findById",map,null);GeoInfoinfo=gson.fromJson(gson.toJson(r4.getData()),GeoInfo.class);if(r4.getData()==null){ToastUtil.show(this,"无此记录,"+r4.getMsg());}else{ToastUtil.show(this,"查询成功,刷新界面");et_01.setText(info.getDeviceName());et_02.setText(String.valueOf(info.getLat()));et_03.setText(String.valueOf(info.getLng()));}break;}}/***向内容提供者发起请求*@parammethodName方法名*@paramparameter请求query参数*@parambody请求体*@return*/@RequiresApi(api=Build.VERSION_CODES.N)publicResultrequest(StringmethodName,Map<String,String>parameter,Objectbody){StringBuilderstringBuilder=newStringBuilder("content://");stringBuilder.append(BASE_PATH).append("/").append(methodName);if(parameter!=null){stringBuilder.append("?");parameter.forEach((s,s2)->stringBuilder.append(s).append("=").append(s2).append("&"));}Cursorcursor=getContentResolver().query(Uri.parse(stringBuilder.toString()),null,null,newString[]{gson.toJson(body)},null);Resultresult=null;if(cursor.moveToNext()){StringresponseBodyJson=cursor.getString(0);result=gson.fromJson(responseBodyJson,Result.class);}returnresult;}/***响应结果类*/staticclassResultimplementsSerializable{privateIntegercode;privateStringmsg;privateObjectdata;publicResult(){}publicIntegergetCode(){returncode;}publicvoidsetCode(Integercode){this.code=code;}publicStringgetMsg(){returnmsg;}publicvoidsetMsg(Stringmsg){this.msg=msg;}publicObjectgetData(){returndata;}publicvoidsetData(Objectdata){this.data=data;}}
2023-10-03 19:48 · ContentProvider / SpringMVC / Andoird
[问答] 安卓跨程序无法获取内容提供者
System.err:   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)

2.项目ContentProvider

2021-11-29 15:38 · AndroidProvider
[文章] Android课程视频打包下载
1rVo6JcysaBQZbwXcg7aMFQ提取码:g6umAndroid开发基础之广播接收者(必修)链接:https://pan.baidu.com/s/1sRx6PAMLmmsU1P4zyyUXeA提取码:62yq内容提供者ContentProvider
[问答] ContentProvider跨程序使用报错 contentResolver.query返回cursor=null

跟着拉大锯敲contextprovider

报错:

跨程序测试代码(报错的query)

提供数据库的类:


mainfests也写了:

<queries>
    <provider android:authorities="com.nuc.testprovider" />
    <package android:name="com.nuc.mydatabasetest.provider.UserProvider" />
</queries>
2023-11-01 17:47 · android内容提供者
[文章] 你真的懂IPC吗?
这就导致了很多问题:-静态成员和单例模式失效-线程同步机制失效-SP并发操作导致数据可靠性下降-Application多次创建(相当于重启了App)为了解决上述问题,引出了如下AndroidIPC的方式-文件共享-ContentProvider-Bundle-Messager-AIDL-Binder
2020-01-27 10:30 · IPC / Android / 进程间通讯 / Linux
[文章] 20、Android开发基础之AndroidManifest和Activity
我们大前面的视频里学习数据存储的时候有外置存储卡读写的权限声明:后面我们学习到的四大组件:Activity、Service、ContentProvider、BroadcastReceiver都需要在这里注册
2019-10-21 23:17 · activity / 四大组件 / 安卓开发 / 安卓基础 / app
[文章] 内容提供者-自定义内容提供者
编写一个类,继承ContentProviderpackagecom.sunofbeaches.contentproviderdemo.provider;importandroid.content.ContentProvider
[文章] Android面试官:你在教我做事吗?
Android应用程序结构的基本组成(四大组件:Activity、Service、BroadcastReceiver、ContentProvider)及其生命周期。
2024-01-26 17:51 · 面试 / 安卓 / 系统 / AOSP / java
[文章] Android :使用Loader加载本地图片
安卓系统的提供ContentProvider可以实现不同应用程序的数据共享。通过AndroidStudio的FileExplore我们看到这些数据所在位置。
2020-03-28 13:26 · Loader / Android
[文章] Android Hilt 依赖注入框架初体验 🗡️
然后,添加@InstallIn以指定要在其中安装入口点的组件,如下所示:classExampleContentProvider:ContentProvider(){@EntryPoint@InstallIn
2020-09-15 15:23 · android / Hilt / 依赖注入
[文章] 24、Android开发基础之组件之间的数据传输
app.AppCompatActivity;importandroid.view.View;/***虽然说我们这节课是组件之间的数据传递*我们常说的组件有Activity,BroadcastReceiver,Service,ContentProvider
[文章] Android Threading - All You Need to Know
textView.setText(Html.fromHtml(text));}}publicvoidonLoaderReset(Loader<Cursor>cursorLoader){}}CursorLoader与ContentProvider
2022-02-15 10:06 · 安卓 / Android / Thread
  • 1