当前位置: 首页 > article >正文

Android——ContentProvider

概述

  • ContentProvider为App存取内部数据提供统一的外部接口,让不同的应用之间得以共享数据。
  • ContentProvider只是服务端App存取数据的抽象类,我们需要在其基础上实现一个完整 的内容提供器,并重写下列方法:

onCreate:创建数据库并获得数据库连接。
insert:插入数据。
delete:删除数据。
update:更新数据。
query:查询数据,并返回结果集的游标。
getType:获取内容提供器支持的数据类型。

  • Uri(通用资源标识符),代表数据操作的地址,每一个Cont entProvider 都会有唯一的地址。ContentProvider 使用的Uri 语法结构如下:

content://authority/data_path/id
[content://]:是通用前缀,表示该Uri用于ContentProvider定位资源。
[authority]:是授权者名称,用来确定具体由哪一个ContentProvider提供资源。因此 一般authority都由 类的小写全称组成,以保证唯一性。
[data_path]:是数据路径,用来确定请求的是哪个数据集。
[id]:是数据编号,用来请求单条数据。如果是多条这个字段忽略。

  • 利用ContentProvider只实现服务端App的数据封装,如果客户端App想访问对方的内部数据,就要通过内容解析器ContentResolver访问。

Serve 内容提供者

案例代码

package com.example.cpserve.provider;

import android.content.ContentProvider;
import android.content.ContentValues;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.net.Uri;
import android.util.Log;

import com.example.cpserve.database.UserDBHelper;

public class MyContentProvider extends ContentProvider {
    private UserDBHelper dbHelper;

    @Override
    public boolean onCreate() {
        dbHelper = UserDBHelper.getInstance(getContext());
        Log.d("MyContentProvider", "onCREATE");
        return false;
    }

    // content://com.example.cpserve.provider.MyContentProvider/user
    @Override
    public Uri insert(Uri uri, ContentValues values) {
        SQLiteDatabase db = dbHelper.getWritableDatabase();
        db.insert(UserDBHelper.TABLE_NAME, null, values);
        return uri;
    }

    @Override
    public Cursor query(Uri uri, String[] projection, String selection,
                        String[] selectionArgs, String sortOrder) {
        SQLiteDatabase db = dbHelper.getReadableDatabase();
        return db.query(UserDBHelper.TABLE_NAME, projection, selection, selectionArgs, sortOrder, null, null, null);

    }

    @Override
    public int delete(Uri uri, String selection, String[] selectionArgs) {
        // Implement this to handle requests to delete one or more rows.
        throw new UnsupportedOperationException("Not yet implemented");
    }

    @Override
    public String getType(Uri uri) {
        // TODO: Implement this to handle requests for the MIME type of the data
        // at the given URI.
        throw new UnsupportedOperationException("Not yet implemented");
    }

    @Override
    public int update(Uri uri, ContentValues values, String selection,
                      String[] selectionArgs) {
        // TODO: Implement this to handle requests to update one or more rows.
        throw new UnsupportedOperationException("Not yet implemented");
    }
}

Client 访问者

案例代码

package com.example.cpclient;

import androidx.appcompat.app.AppCompatActivity;

import android.annotation.SuppressLint;
import android.content.ContentProvider;
import android.content.ContentValues;
import android.database.Cursor;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;

public class ContentWriteActivity extends AppCompatActivity {
    private TextView tv_content;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_content_write);
        tv_content = findViewById(R.id.tv_content);

        findViewById(R.id.btn_save).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                ContentValues values = new ContentValues();
                // cpserve里的MyContentProvider在创建表时只写了一个name字段
                values.put("name", "张三");
                getContentResolver().insert(UserInfoContent.CONTENT_URI, values);
            }
        });

        findViewById(R.id.btn_read).setOnClickListener(new View.OnClickListener() {
            @SuppressLint("Range")
            @Override
            public void onClick(View view) {
                Cursor cursor = getContentResolver().query(UserInfoContent.CONTENT_URI, null, null, null, null, null);
                if (cursor != null) {
                    StringBuilder sb = new StringBuilder();

                    while (cursor.moveToNext()) {
                        sb.append(cursor.getString(cursor.getColumnIndex("name")));
                    }
                    tv_content.setText(sb);
                }
            }
        });
    }
}

在访问者(Client)的AndroidManifest.xml里需要加入如下代码

    <!-- 出于安全考虑,Android11要求应用事先说明需要访问的其他软件包 -->
    <queries>
        <!-- 第一种写法 -->
        <!-- <package android:name="com.example.cpserve"/>-->
        <!-- 第二种写法 -->
        <provider android:authorities="com.example.cpserve.provider.MyContentProvider"/>
    </queries>

http://www.kler.cn/a/326046.html

相关文章:

  • MySQL技巧之跨服务器数据查询:基础篇-A数据库与B数据库查询合并--封装到存储过程中
  • Linux 命令 | 每日一学,文本处理三剑客之awk命令实践
  • RDIFramework.NET CS敏捷开发框架 V6.1发布(.NET6+、Framework双引擎、全网唯一)
  • Halcon HImage 与 Qt QImage 的相互转换(修订版)
  • mybatis 动态SQL语句
  • 计算机组成与原理(2) basic of computer architecture
  • 流量劫持常见的攻击场景
  • 【Langchain优缺点】打算使用Langchain框架的同学务必仔细阅读
  • 在线订餐革命:Spring Boot 点餐系统
  • kafka 消费者线程安全问题详细探讨
  • 记HttpURLConnection下载图片
  • 综合绩效考核系统源码,三级医院绩效管理系统源码,基于springboot、mybaits+avue技术开发,支持项目二开。
  • Stable Diffusion绘画 | SDXL模型的优缺点及模型推荐
  • golang学习笔记13-函数(二):init函数,匿名函数,闭包,defer
  • 第L2周:机器学习|线性回归模型 LinearRegression:2. 多元线性回归模型
  • Vulhub zico 2靶机详解
  • GS-SLAM论文阅读笔记--MM3DGS SLAM
  • A Learning-Based Approach to Static Program Slicing —— 论文笔记
  • 【Git原理与使用】分支管理
  • C++可见性
  • 关于武汉芯景科技有限公司的IIC电平转换芯片XJ9509开发指南(兼容PCa9509)
  • Matlab实现麻雀优化算法优化回声状态网络模型 (SSA-ESN)(附源码)
  • linux环境oracle11.2.0.4打补丁(p31537677_112040_Linux-x86-64.zip)
  • [M贪心] lc2207. 字符串中最多数目的子序列(模拟+贪心+一次遍历+代码细节+思维)
  • 无人机避障—— 激光雷达定高北醒TF03-UART(二)
  • 【基础算法总结】分治--快排+归并