首页 > 其他分享 >Android ContentProvider使用

Android ContentProvider使用

时间:2023-08-21 12:37:30浏览次数:44  
标签:btn SweetAlertDialog getString title null 使用 Android ContentProvider id


近来使用下项目上用的不多的东西在自己的app,记录下遇到的问题:
项目地址:码云

在AndroidManifest.xml添加provider时,权限问题。添加android:permission=”…”,这样控制其他app访问权限使app更加安全,permission是允许读写权限,writepermission是允许写权限,readpermission是允许读权限



<provider
            android:name="com.bobbygu.bobbyapp.function.contentprovider.TeacherContentProvider"
            android:authorities="com.bobbygu.contentProvider"
            android:exported="true"
            android:multiprocess="false"
            android:permission="com.bobbygu.permission.CONTENTPROVIDER" />

然后在 application 外面添加下面代码



<permission
        android:name="com.bobbygu.permission.CONTENTPROVIDER"
        android:label="Allow read content provider"
        android:protectionLevel="normal" />

Service同样可以这样设置权限



<service
            android:name="com.bobbygu.bobbyapp.function.aidlSample.AIDLService"
            android:enabled="true"
            android:exported="true"
            android:permission="com.bobbygu.permission.CONTENTPROVIDER">
            <intent-filter>
                <action android:name="com.bobby.aidl.BobbyService" />
                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
        </service>

在第二个app的Manifest中需要添加



<uses-permission android:name="com.bobbygu.permission.CONTENTPROVIDER"/>

获取contentprovider需要的权限

然后应用就可以开始使用contentProvider获取更新数据了



class ContentProviderTestActivity : AppCompatActivity(), View.OnClickListener {
    private var uri = Uri.parse("content://com.bobbygu.contentProvider/teacher")
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_content_provider_test)
        btn_insert.setOnClickListener(this)
        btn_query.setOnClickListener(this)
        btn_query_all.setOnClickListener(this)
        btn_modify.setOnClickListener(this)
        btn_delete.setOnClickListener(this)
    }

    override fun onClick(v: View?) {
        when (v?.id) {
            R.id.btn_insert -> {
                val cv = ContentValues()
                cv.put("title", "jiaoshou")
                cv.put("name", "jiaoshi")
                cv.put("sex", true)
                val uri2 = contentResolver.insert(uri, cv)
                SweetAlertDialog(this)
                        .setTitleText(getString(R.string.dialog_title))
                        .setContentText(uri2.toString())
                        .show()
                Logger.d(uri2.toString())
            }
            R.id.btn_query -> {
                // 查找id为1的数据
                val c = contentResolver.query(uri, null, "_ID=?", arrayOf("1"), null)
                //这里必须要调用 c.moveToFirst将游标移动到第一条数据,不然会出现index -1 requested , with a size of 1错误;cr.query返回的是一个结果集。
                if (!c!!.moveToFirst()) {
                    // 为空的Cursor
                    SweetAlertDialog(this, SweetAlertDialog.ERROR_TYPE)
                            .setTitleText(getString(R.string.dialog_title))
                            .setContentText("未找到id=1的数据")
                            .show()
                    return
                }
                val name = c.getColumnIndex("name")
                Logger.d(c.getString(name))
                SweetAlertDialog(this)
                        .setTitleText(getString(R.string.dialog_title))
                        .setContentText(c.getString(name))
                        .show()
                c.close()
            }
            R.id.btn_query_all -> {
                val c = contentResolver.query(uri, null, null, null, null)
                var str = ""
                while (c.moveToNext()) {
                    str += c.getInt(c.getColumnIndex("_id")).toString() + "\n"
                }
                Logger.d("count:${c!!.count} \n$str")
                SweetAlertDialog(this)
                        .setTitleText(getString(R.string.dialog_title))
                        .setContentText("count:${c.count} \n$str")
                        .show()
                c.close()
            }
            R.id.btn_modify -> {
                val cv = ContentValues()
                cv.put("name", "huangbiao")
                cv.put("date_added", Date().toString())
                val updatedNum = contentResolver.update(uri, cv, "_ID=?", arrayOf("3"))
                println("updated" + ":" + updatedNum)
                if (updatedNum == 0)
                    SweetAlertDialog(this, SweetAlertDialog.ERROR_TYPE)
                            .setTitleText(getString(R.string.dialog_title))
                            .setContentText("数据更新失败")
                            .show()
                else
                    SweetAlertDialog(this)
                            .setTitleText(getString(R.string.dialog_title))
                            .setContentText("updated" + ":" + updatedNum)
                            .show()
            }
            R.id.btn_delete -> {
                val c = contentResolver.query(uri, null, null, null, null)
                if (!c!!.moveToFirst()) {
                    SweetAlertDialog(this, SweetAlertDialog.ERROR_TYPE)
                            .setTitleText(getString(R.string.dialog_title))
                            .setContentText("数据删除失败")
                            .show()
                    return
                }
                val index = c.getInt(c.getColumnIndex("_id")).toString()
                contentResolver.delete(uri, "_ID=?", arrayOf(index))
                SweetAlertDialog(this, SweetAlertDialog.SUCCESS_TYPE)
                        .setTitleText(getString(R.string.dialog_title))
                        .setContentText("btn_delete index:$index")
                        .show()
                c.close()
            }
        }
    }

    companion object {
        fun startActivity(activity: Activity) {
            activity.startActivity(Intent(activity, ContentProviderTestActivity::class.java))
        }
    }
}

Android ContentProvider使用_android


标签:btn,SweetAlertDialog,getString,title,null,使用,Android,ContentProvider,id
From: https://blog.51cto.com/u_10101161/7173518

相关文章

  • 使用MD5算法和sha512sum校验和检验文件完整性
    目录一.前言二.MD5算法简介三.什么是校验和四.使用MD5算法和sha512sum校验和检验文件完整性五.总结一.前言在我们日常生活中,无论是下载文件、传输数据还是备份重要信息,如何确保数据的完整性始终是一个不能忽视的问题。本文将向大家介绍如何使用MD5算法和sha512sum校验和来进行文......
  • java 中使用导入 导出 excel文件( Easy Excel 2.x )
    前提是依赖必须导入:<dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>2.2.0-beta2</version></dependency> 导出首先在自己的接口中创建一个方法为导出的方法:/***数据导出......
  • SQLmap新手使用(基本运行)
    打开SQLmap会提示“输入一个完整的URL路径”,将想渗透的URL完整输入即可开机自检,直接回车即可选择注入程度(正常、中、高);程度越高,意味着效果越强,同时动作也就越大,被检测的风险也就越高选择枚举的等级(默认、中、全部)选择完运行后会提示“运行中”,等待即可运行结束后,会......
  • element-plus使用中文
    element-plus默认是英文,要显示中文需要安装中文包1.ElementPlus提供了全局配置国际化的配置。importElementPlusfrom'element-plus'importzhCnfrom'element-plus/es/locale/lang/zh-cn'app.use(ElementPlus,{locale:zhCn})2.ElementPlus还提供了一个Vue组......
  • 使用redis pipeline提升性能
    前言本篇来介绍一下redispipeline,主要是由于最近一次在帮开发同学review代码的时候,发现对redis有个循环操作可以优化。场景大概是这样的,根据某个uid要从redis查询一批数据,每次大概1000个key左右,如果查得到就返回,否则查db,然后写回缓存。由于每次要查的key比较多,虽然redis单次查询......
  • su - 和 sudo -i 的区别,使用sudo更安全灵活
    su-是切换为root账号,是完全的切换,需要输入root密码,与直接用root进行登录一样,sudo-i看似一样,实则非常不同,其使用sudo工具,可以灵活定义权限,输入的密码为当前普通用户密码,有系统记录,以便后期追责使用sudo,可以将root锁定:passwd-lroot,这样攻击者就不知道管理员......
  • 8-21|Python使用管道如何执行此删除目录
    要在Python中使用管道执行此命令,你可以利用`subprocess`模块。下面是一个示例,展示如何在Python中执行这个命令:```pythonimportsubprocessdirectory="path_to_directory"#构建命令cmd=f'cd{directory}&&del/f/s/q*.*&&for/d%xin(*)dormdir/s/q"%x&quo......
  • GDAL在Unity3D中的使用(一)
    1.上官网选择对应版本  https://www.gisinternals.com/query.html?content=filelist&file=release-1930-x64-gdal-3-6-3-mapserver-8-0-0.zip选择StableReleases然后选择对应得版本点进来后,一般下载第一个 把图中dll放到Unity的Assets文件夹下面我们之前建立的Plugins文件......
  • 怎样才能搭建好一套受私募机构及操盘员使用的程序化金融量化交易系统?
    私募机构和操盘员在金融市场中扮演着重要的角色,他们的交易决策和操作对于投资者的回报至关重要。随着科技的迅猛发展,越来越多的私募机构和操盘员开始借助程序化金融量化交易系统提高交易效率和风险管理能力。在过去的几年里,也亲身经历了搭建一套受私募机构及操盘员使用的程序化金融......
  • 超过详细XMind2TestCase使用指南
    XMind2TestCase使用指南 1)GitHub地址:https://github.com/zhuifengshen/xmind2testcase2)XMind2TestCase使用指南一、XMind测试用例通用模板1、简单模板示例  2、简单模板示例解析结果3、具体解析规则注意,注意,注意,重要的事情说三遍!!!第六条规则,我们使用标注优先级......