android contentprovider增删改查(访问其他app的数据)
2023-09-14 09:05:10 时间
一、基本概念:
1.ContentProvider为存储和获取数据提供了统一的接口;
2.使用ContentProvider可以在不同的应用程序之间共享数据;
3.Android为常见的一些数据提供了ContentProvider(包括音频、视频、图片和通讯录等等 )
直接贴下代码:
定义数据库帮助类:
package com.xinrui.smartboard.contentprovider;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
public class DbOpenHelper extends SQLiteOpenHelper {
//数据库名称
private static final String DATA_BASE_NAME = "inputsource.db";
//数据库版本号
private static final int DATE_BASE_VERSION = 1;
//表名-男孩
public static final String SOURCE_TABLE_NAME = "source";
//创建表-输入源(两列:主键自增长、姓名)
private final String CREATE_SOURCE_TABLE = "create table " + SOURCE_TABLE_NAME + "(_id integer primary key autoincrement, inputsource text)";
public DbOpenHelper(Context context) {
super(context, DATA_BASE_NAME, null, DATE_BASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(CREATE_SOURCE_TABLE);//创建信号源表
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
//一些数据库升级操作
}
}
2.contentprovider 内容提供者:
package com.xinrui.smartboard.contentprovider;
import android.content.ContentProvider;
import android.content.ContentValues;
import android.content.Context;
import android.content.UriMatcher;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.net.Uri;
import android.text.TextUtils;
import android.util.Log;
public class MyFirstContentProvider extends ContentProvider {
private Context context;
private SQLiteDatabase sqLiteDatabase;
public static final String AUTHORITY = "com.xinrui.smartboard.contentprovider.MyFirstContentProvider";
public static final int SOURCE_URI_CODE = 0;
private static final UriMatcher uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
static {
uriMatcher.addURI(AUTHORITY, DbOpenHelper.SOURCE_TABLE_NAME, SOURCE_URI_CODE);
}
/**
* 获取表名
* @param uri
* @return
*/
private String getTableName(Uri uri) {
String tableName = null;
switch (uriMatcher.match(uri)) {
case SOURCE_URI_CODE:
tableName = DbOpenHelper.SOURCE_TABLE_NAME;
break;
}
return tableName;
}
@Override
public boolean onCreate() {
context = getContext();
initProviderData();
return false;
}
//初始化原始数据
private void initProviderData() {
sqLiteDatabase = new DbOpenHelper(context).getWritableDatabase();
Uri boyUri = Uri.parse("content://com.xinrui.smartboard.contentprovider.MyFirstContentProvider/source");
Cursor cursor = query(boyUri,null,null,null,null);
if(cursor!=null) Log.e("MainActivity","count:"+cursor.getCount());
if(cursor!=null&&cursor.getCount()!=0)return;
sqLiteDatabase.beginTransaction();
ContentValues contentValues = new ContentValues();
contentValues.put("inputsource", "24");
sqLiteDatabase.insert(DbOpenHelper.SOURCE_TABLE_NAME, null, contentValues);
sqLiteDatabase.setTransactionSuccessful();
sqLiteDatabase.endTransaction();
}
@Override
public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
String tableName = getTableName(uri);
if (TextUtils.isEmpty(tableName)) {
throw new IllegalArgumentException("Unsupported URI:" + uri);
}
return sqLiteDatabase.query(tableName, projection, selection, selectionArgs, null, null, sortOrder);
}
@Override
public String getType(Uri uri) {
return null;
}
@Override
public Uri insert( Uri uri, ContentValues values) {
String tableName = getTableName(uri);
if(TextUtils.isEmpty(tableName)){
throw new IllegalArgumentException("Unsupported URI:" + uri);
}
sqLiteDatabase.insert(tableName, null, values);
context.getContentResolver().notifyChange(uri, null);
return uri;
}
@Override
public int delete(Uri uri, String selection, String[] selectionArgs) {
String tableName = getTableName(uri);
if (TextUtils.isEmpty(tableName)) {
throw new IllegalArgumentException("Unsupported URI:" + uri);
}
int count = sqLiteDatabase.delete(tableName, selection, selectionArgs);
if (count > 0) {
context.getContentResolver().notifyChange(uri, null);
}
return count;
}
@Override
public int update(Uri uri, ContentValues values,String selection,String[] selectionArgs) {
String tableName = getTableName(uri);
if (TextUtils.isEmpty(tableName)) {
throw new IllegalArgumentException("Unsupported URI:" + uri);
}
int row = sqLiteDatabase.update(tableName, values, selection, selectionArgs);
if (row > 0) {
context.getContentResolver().notifyChange(uri, null);
}
return row;
}
}
3.注册 contentprovider
<provider
android:name=".contentprovider.MyFirstContentProvider"
android:exported="true"
android:authorities="com.xinrui.smartboard.contentprovider.MyFirstContentProvider" />
4.更新
private void updateContentProvider(String value){
Uri boyUri = Uri.parse("content://com.xinrui.smartboard.contentprovider.MyFirstContentProvider/source");
ContentValues contentValues = new ContentValues();
contentValues.put("inputsource", value);
getContentResolver().update(boyUri,contentValues,"_id=1",null);
}
5.查询
private String queryContentProvider(){
String inputsource = "";
Uri boyUri = Uri.parse("content://com.xinrui.smartboard.contentprovider.MyFirstContentProvider/source");
Cursor boyCursor = getContentResolver().query(boyUri, new String[]{"_id", "inputsource"}, null, null, null);
if (boyCursor != null) {
if (boyCursor.moveToNext()) {
//Log.e(TAG, "ID:" + boyCursor.getInt(boyCursor.getColumnIndex("_id")) + "--inputsource:" + boyCursor.getString(boyCursor.getColumnIndex("inputsource")));
inputsource = boyCursor.getString(boyCursor.getColumnIndex("inputsource"));
}
boyCursor.close();
}
return inputsource;
}
6.添加数据
Uri boyUri = Uri.parse("content://com.xinrui.smartboard.contentprovider.MyFirstContentProvider/source");
ContentValues contentValues = new ContentValues();
contentValues.put("name", "张三");
getContentResolver().insert(boyUri, contentValues);
7.删除数据
public void testDelete(){
//另外一个程序的uri
Uri uri = Uri.parse("content://com.xinrui.smartboard.contentprovider.MyFirstContentProvider/source");
//获取内容提供者访问对象
ContentResolver resolver = getContext().getContentResolver();
String where = "_id=?";
String[] selectionArgs={"8"};
int count = resolver.delete(uri, where, selectionArgs);
Log.i(tag, "删除了"+count);
}
相关文章
- Android应用如何开机自启动、自启动失败原因
- android cookie持久化
- 转-Android SHA1与Package获取方式
- android app 集成 信鸽推送
- Android----drawable state各个属性详解----ListView几个比较特别的属性:
- SAP Authenticator Android app
- Android面试-Android性能优化和内存优化、APP启动速度一线大厂的实战案例解析
- Android问题笔记 - 安装APP成功但Android Studio无法直接启动?
- Android识别预装的第三方App方法实例
- 《移动App性能评测与优化》— Android 书籍
- Android 隐藏App图标
- android 11.0 12.0自定义开机向导app
- Android 12.0 系统设置 app详情页默认关闭流量数据的开关
- Android 9.0 app进程保活白名单
- Android 9.0 根据包名授予app所需的权限
- Android 9.0 根据包名过滤某个app的通知
- Android 根据sensor重力感应 app横竖屏旋转
- Android 10.0 Launcher3去掉抽屉功能不显示app列表
- android q(10.0)app应用安装白名单
- android 8.1 9.0 10.0 去掉系统安全模式(SAFE MODE)
- android 10.0 第三方输入法app设置系统默认输入法
- android 9.0 10.0 添加自定义系统服务接口给app调用
- android Launcher之获取安装的app列表的两种方法
- 【华为云实战开发】7.Android应用如何在云端快速开发
- 【Android 逆向】Android 进程注入工具开发 ( 远程进程注入动态库文件操作 | 注入动态库 加载 业务动态库 | 业务动态库启动 | pthread_create 线程开发 )
- 【Android 插件化】Hook 插件化框架 ( 加载插件包资源 )
- 【错误记录】p7zip 交叉编译 Android 版本 NDK 报错 ( Application.mk | APP_ABI := armeabi-v7a arm64-v8a x86 x86_64 )
- 【Android 异步操作】Handler 机制 ( MessageQueue 消息队列的阻塞机制 | Java 层机制 | native 层阻塞机制 | native 层解除阻塞机制 )
- Android应用开发经常使用知识
- Android使用代码消除App数据并重新启动设备
- android多媒体框架学习 详解 最新版本
- Android不同APP之间共享数据的方式
- Android内核开发:从源码树中删除出厂的app应用
- Android App层通过JNI从驱动获取Input Event