contentprovider内容提供者:让其他app可以访问私有数据库(文件)

1.AndroidManifest.xml

配置provider

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.dbtest"
android:versionCode="1"
android:versionName="1.0" > <uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="21" /> <application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >

    <!--android:name="com.example.dbtest.PersonContentProvider" 必须为内容提供者类的路径 不然会报notfoundclass-->
<provider
android:name="com.example.dbtest.PersonContentProvider"
android:authorities="com.example.dbtest.provider.personprovider"
android:exported="true"></provider> <activity
android:name=".MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application> </manifest>

2.PersonContentProvider

package com.example.dbtest;

import com.example.dbtest.dbHelper.DbOpenHelper;

import android.content.ContentProvider;
import android.content.ContentValues;
import android.content.UriMatcher;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.net.Uri; public class PersonContentProvider extends ContentProvider { private DbOpenHelper helper;
//定义一个uri的匹配器用于匹配uri 如果路径不满足条件 返回-1
private static UriMatcher matcher = new UriMatcher(UriMatcher.NO_MATCH); private static final int INSERT = 1;
private static final int DELETE = 2;
private static final int UPDATE = 3;
private static final int QUERY = 4; static{
matcher.addURI("com.example.dbtest.provider.personprovider", "insert", INSERT);
matcher.addURI("com.example.dbtest.provider.personprovider", "delete", DELETE);
matcher.addURI("com.example.dbtest.provider.personprovider", "update", UPDATE);
matcher.addURI("com.example.dbtest.provider.personprovider", "query", QUERY);
} //content://com.itheima.db.personprovider/insert 添加操作
//content://com.itheima.db.personprovider/delete 删除操作
//content://com.itheima.db.personprovider/update 更新操作
//content://com.itheima.db.personprovider/query 查询操作 @Override
public boolean onCreate() {
helper = new DbOpenHelper(getContext());
return true;
} @Override
public Cursor query(Uri uri, String[] projection, String selection,
String[] selectionArgs, String sortOrder) {
if(matcher.match(uri)==QUERY)
{
SQLiteDatabase db = helper.getWritableDatabase();
Cursor cursor = db.query("person", projection, selection, selectionArgs, null, null, sortOrder);
//注意 使用contentprovider时 不要将数据关闭掉 不然拿不到数据
//db.close(); 不要关闭
return cursor;
}
else
{
throw new IllegalArgumentException("路径不配对,不能执行查询操作");
}
} @Override
public String getType(Uri uri) { return null;
} @Override
public Uri insert(Uri uri, ContentValues values) {
if(matcher.match(uri)==INSERT)
{
SQLiteDatabase db = helper.getWritableDatabase();
db.insert("person",null,values);
}
else
{
throw new IllegalArgumentException("路径不配对,不能执行插入操作");
}
return null;
} @Override
public int delete(Uri uri, String selection, String[] selectionArgs) {
if(matcher.match(uri)==DELETE)
{
SQLiteDatabase db = helper.getWritableDatabase();
db.delete("person", selection, selectionArgs);
}
else
{
throw new IllegalArgumentException("路径不配对,不能执行删除操作");
}
return 0;
} @Override
public int update(Uri uri, ContentValues values, String selection,
String[] selectionArgs) {
if(matcher.match(uri)==UPDATE)
{
SQLiteDatabase db = helper.getWritableDatabase();
db.update("person", values, selection, selectionArgs);
}
else
{
throw new IllegalArgumentException("路径不配对,不能执行修改操作");
}
return 0;
} }

3.其他app调用内容提供者

package com.example.getcontentprovider;

import android.content.ContentResolver;
import android.content.ContentValues;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.support.v7.app.ActionBarActivity;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Toast; public class MainActivity extends ActionBarActivity { @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
} public void query(View view)
{
System.out.println("start query...............");
ContentResolver resolver = getContentResolver();
Uri uri = Uri.parse("content://com.example.dbtest.provider.personprovider/query");
Cursor cursor = resolver.query(uri, null, null, null, null); StringBuffer sb = new StringBuffer();
while(cursor.moveToNext())
{
System.out.println("name:"+cursor.getString(cursor.getColumnIndex("name")));
sb.append("name:"+cursor.getString(cursor.getColumnIndex("name"))+"\n"); }
System.out.println("end query.............."); Toast.makeText(this, sb.toString(),0).show(); } public void delete(View view)
{
ContentResolver resolver = getContentResolver();
Uri uri = Uri.parse("content://com.example.dbtest.provider.personprovider/delete");
resolver.delete(uri, "id=?", new String[]{"1"}); Toast.makeText(this, "删除成功",0).show(); } public void update(View view)
{
ContentResolver resolver = getContentResolver();
Uri uri = Uri.parse("content://com.example.dbtest.provider.personprovider/update");
ContentValues values = new ContentValues();
values.put("name", "张三");
resolver.update(uri, values, "id=?", new String[]{"1"}); Toast.makeText(this, "修改成功",0).show(); } public void insert(View view)
{ ContentResolver resolver = getContentResolver();
Uri uri = Uri.parse("content://com.example.dbtest.provider.personprovider/insert");
ContentValues values = new ContentValues();
values.put("name", "李四");
resolver.insert(uri, values); Toast.makeText(this, "修改成功",0).show();
} @Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main, menu);
return true;
} @Override
public boolean onOptionsItemSelected(MenuItem item) {
int id = item.getItemId();
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
}

android contentprovider内容提供者的更多相关文章

  1. Android -- ContentProvider 内容提供者,创建和调用

    1. 概述 ContentProvider 在android中的作用是对外共享数据,也就是说你可以通过ContentProvider把应用中的数据共享给其他应用访问,其他应用可以通过ContentPr ...

  2. Android组件系列----ContentProvider内容提供者

    [声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4 ...

  3. android 53 ContentProvider内容提供者

    ContentProvider内容提供者:像是一个中间件一样,一个媒介一样,可以以标准的增删改差操作对手机的文件.数据库进行增删改差.通过ContentProvider查找sd卡的音频文件,可以提供标 ...

  4. Android中内容提供者ContentProvider的详解

    1.什么是ContentProvider 首先,ContentProvider(内容提供者)是android中的四大组件之一,但是在一般的开发中,可能使用的比较少. ContentProvider为不 ...

  5. Android组件系列----ContentProvider内容提供者【1】

    [正文] 一.ContentProvider简单介绍: ContentProvider内容提供者(四大组件之中的一个)主要用于在不同的应用程序之间实现数据共享的功能. ContentProvider能 ...

  6. Android基础内容提供者ContentProvider的使用详解(转)

    1.什么是ContentProvider 首先,ContentProvider(内容提供者)是android中的四大组件之一,但是在一般的开发中,可能使用的比较少. ContentProvider为不 ...

  7. contentProvider内容提供者

    contentProvider内容提供者 15. 四 / android基础 / 没有评论   步骤 权限在application中注册 Source code     <provider an ...

  8. Android 中内容提供者的使用

    在Android中内容提供者主要是用于不同程序之间的数据共享.内容提供器的用法一般有两种,一种是使用现有的内容提供器来读取和操作相应程序的数据,另一种是创建自己的内容提供器,供其他的程序访问. 使用现 ...

  9. Android开发学习—— ContentProvider内容提供者

    * 应用的数据库是不允许其他应用访问的* 内容提供者的作用就是让别的应用访问到你的数据库.把私有数据暴露给其他应用,通常,是把私有数据库的数据暴露给其他应用. Uri:包含一个具有一定格式的字符串的对 ...

随机推荐

  1. pandas绘图

    #encoding:utf8 import pandas as pd import numpy as np import matplotlib.pyplot as plt df = pd.DataFr ...

  2. 《mysql从入门到精通》提高

    第一 游标的使用 delimiter $$ DROP PROCEDURE IF EXISTS product_in_sheet_handler; CREATE PROCEDURE product_in ...

  3. 在做销售录入界面时,如何使用dbgrid?(50分)

    给你段源码看一看用stringgird做得: procedure Tfrmingoods.adddata ; var i:integer; begin do begin ,i])=trim(goods ...

  4. AOP 获取 RequestContextHolder

    转载: http://blog.csdn.net/lexang1/article/details/52619215 在使用spring时,经常需要在普通类中获取session,request等对像. ...

  5. python 模块和包

    一,模块 1,什么是模块? 常见的场景: 一个模块就是一个包含了python定义和声明的文件,文件名就是模块名字加上.py 的后缀. 但其实 import 加载的模块分为四个通用类别: 1,使用pyt ...

  6. ubuntu 16.04 samba服务搭建

    一:安装 1. sudo apt-get install samba 有询问Yes的地方Yes就行. 无法安装samba 执行 sudo apt-get update 2.等待安装完成,进入配置文件目 ...

  7. POJ - 1062(昂贵的聘礼)(有限制的spfa最短路)

    题意:...中文题... 昂贵的聘礼 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 54350   Accepted: 16 ...

  8. 自学Aruba7.3-Aruba安全认证-802.1x认证(web页面配置)

    点击返回:自学Aruba之路 自学Aruba7.3-Aruba安全认证-802.1x认证(web页面配置) 步骤1 建立AP Group,命名为test802-group 步骤2   将AP加入到AP ...

  9. 【转】 cJSON 源码解析

    关于cjson的介绍和使用方法就不在这里介绍了,详情请查看上一篇博客cjson使用方法. JSON的内存结构像广义表,可以认为是有层次的双向链表. cJSON程序中的细节点如下: 大量宏替换 大量静态 ...

  10. luogu4269 Snow Boots G (并查集)

    对于某个靴子,如果0代表某个格能走,1代表不能走,那么只要连续的1的个数的最大值>=靴子的步长,那这个靴子就不能用. 那么只要对靴子和格子都按深度排个序,然后从大到小来扫一遍(靴子越来越浅,能走 ...