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. MySQL在Read Uncommitted级别下写操作加X锁

    很多文章认为MySQL在读未提交(Read Uncommitted)的隔离级别下,写操作是不加锁的,然而实际上并不是,在RU级别下,写操作加有X锁. 实践出真知 以前,我也认为RU隔离级别下,写操作不 ...

  2. python之tkinter使用举例-Button

    tkinter用于编写GUI界面,python3默认已经包含,直接使用. # GUI:tkinter使用举例 import tkinter # 实例化tkinter对象 top = tkinter.T ...

  3. 英国电信反悔华为是唯一真正的5G供应商

    导读 英国电信反悔华为是唯一真正的5G供应商 英国电信的一位发言人表示,该公司目前正「从我们自 2006 年以来实施的网络架构原则中,从我们的 3G 和 4G 网络核心提取华为设备」. 英国电信已经不 ...

  4. MT【19】舒尔不等式设计理念及证明

    评:舒尔的想法是美妙的,当然他本身也有很多意义,在机械化证明的理念里,它也占据了一方田地.

  5. scrapy-redis爬取豆瓣电影短评,使用词云wordcloud展示

    1.数据是使用scrapy-redis爬取的,存放在redis里面,爬取的是最近大热电影<海王> 2.使用了jieba中文分词解析库 3.使用了停用词stopwords,过滤掉一些无意义的 ...

  6. CMS系统关键技术点总结(UrlRewrite、批量静态化、发送邮件)

    1.UrlRewrite protected void Application_BeginRequest(object sender, EventArgs e) { //将请求的ShowArticle ...

  7. A1095. Cars on Campus

    Zhejiang University has 6 campuses and a lot of gates. From each gate we can collect the in/out time ...

  8. Hash碰撞 & 拒绝服务漏洞

    前段时间在网上看到的: http://www.baidu.com/s?wd=Hash%E7%A2%B0%E6%92%9E+++%E6%8B%92%E7%BB%9D%E6%9C%8D%E5%8A%A1% ...

  9. 一次有趣的ant-design与后端数据交互的使用

    最近有个需求是新闻时间排序与点击量排序,数据库中存储的新闻是按照时间顺序排序的,从后台数据中取出数据,在前端进行页面展示即可. 我用到了ant-design中的Tabs切换页,样式大概如下图. 其实这 ...

  10. Linux:从文件中搜索关键字并显示行数(cat,grep函数)

    假如有test1.txt的格式如下图所示: 有test2.txt的内容如下: 现需将test2.txt含有的关键字的行搜索出来并显示行数 则可以用到命令: cat test1.txt | grep - ...