ContentProvider 的使用
1.简单示例:通过ContentProvider暴露数据库,然后读取数据。
2.先加上一个工具类,用来使用copy assets下面的db文件代码如下:
public class MyDBOpenHelper extends SQLiteOpenHelper{
private static final String TAG = "MyDBOpenHelper";
/*** 这里是是data/data/包名 /databases/ **/
private static String DB_PATH = "/data/data/com.example.mycontentproviderleader/databases/";
private static String DB_NAME = "song.db";
private SQLiteDatabase myDataBase;
private final Context myContext;
public void SetFilePath(String path){
DB_PATH = path;
}
public MyDBOpenHelper(Context context) {
super(context, DB_NAME, null, 1);
this.myContext = context;
// TODO Auto-generated constructor stub
}
public void createDataBase() throws IOException{
boolean dbExist = checkDataBase();
if(dbExist){
}else{
this.getReadableDatabase();
try {
copyDataBase();
} catch (IOException e) {
throw new Error("Error copying database");
}
}
}
private boolean checkDataBase(){
SQLiteDatabase checkDB = null;
try{
String myPath = DB_PATH + DB_NAME;
checkDB = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READONLY);
}catch(SQLiteException e){
//database does't exist yet.
}
if(checkDB != null){
checkDB.close();
return true;
}
return false;
//return checkDB != null ? true : false;
}
private void copyDataBase() throws IOException{
//Open your local db as the input stream
InputStream myInput = myContext.getAssets().open(DB_NAME);
// Path to the just created empty db
String outFileName = DB_PATH + DB_NAME;
//Open the empty db as the output stream
OutputStream myOutput = new FileOutputStream(outFileName);
//transfer bytes from the inputfile to the outputfile
byte[] buffer = new byte[1024];
int length;
while ((length = myInput.read(buffer))>0){
myOutput.write(buffer, 0, length);
}
//Close the streams
myOutput.flush();
myOutput.close();
myInput.close();
}
public void openDataBase() throws SQLException{
//Open the database
String myPath = DB_PATH + DB_NAME;
myDataBase = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READONLY);
}
@Override
public synchronized void close() {
if(myDataBase != null)
myDataBase.close();
super.close();
}
@Override
public void onCreate(SQLiteDatabase db) {
// TODO Auto-generated method stub
Log.d(TAG, "onCreate: ***********");
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// TODO Auto-generated method stub
}
}
3.uri匹配器
UriMatcher uri匹配器
初始匹配器:UriMatcher matcher = new UriMatcher(UriMatcher.NO_MATCH);
添加uri:
matcher.addURI(authority, "TableSong", 1);
matcher.addURI(authority, "TableSongSinger", 2);
matcher.addURI(authority,"TableSong/#",3);
后面的1,2,3为标识ID,TbaleSong可以指查询表全部数据,TableSong/#可以指查询特定的数据
switch (math) {
case 1:
cursor = db.rawQuery("select * from TableSong where Words=?",new Sreing[]{""+4} );
break;
case 2
cursor = db.rawQuery("select * from TableSong where Words=?",new Sreing[]{""+2} );
break;
case 3:
long id= ContentUris.parseId(uri);
cursor = db.rawQuery("select * from TableSong where SongIndex =?",new String[]{""+id} );
}
4.编写ContentProvider类
/****这里只实现了个查询功能,简单的示例 ,插入,删除等没实现********/
public class MyProvider extends ContentProvider { private SQLiteDatabase db = null;
/*** 写入你的包名*/
private static final String authority = "com.example.mycontentproviderleader"; private static UriMatcher matcher = new UriMatcher(UriMatcher.NO_MATCH); static {
/****TabelSong,TabslSongSinger 是2张不同的数据表***/
matcher.addURI(authority, "TableSong", 1);
matcher.addURI(authority, "TableSongSinger", 2);
matcher.addURI(authority,"TableSong/#",3); } /*** 创建app数据库 ,我这里是从assets 下copy的*/
@Override
public boolean onCreate() { MyDBOpenHelper myDBOpenHelper=new MyDBOpenHelper(getContext());
try {
myDBOpenHelper.createDataBase();
} catch (IOException e) {
e.printStackTrace();
}
db = myDBOpenHelper.getReadableDatabase();
return true;
} @Override
public Cursor query(Uri uri, String[] projection, String selection,
String[] selectionArgs, String sortOrder) {
int math = matcher.match(uri);
Cursor cursor = null;
switch (math) {
case 1:
cursor = db.rawQuery("select * from TableSong where Words=?" ,new String[]{"3"});
//cursor = db.query("TableSong", projection, selection, selectionArgs, null, null, sortOrder);
break;
case 2: cursor = db.rawQuery("select * from TableSong where Words=?",new String[]{"6"} ); break;
case 3:
long id= ContentUris.parseId(uri);
cursor = db.rawQuery("select * from TableSong where SongIndex =?",new String[]{""+id} ); default:
break;
}
return cursor;
} @Override
public String getType(Uri uri) {
// TODO Auto-generated method stub
return null;
} @Override
public Uri insert(Uri uri, ContentValues values) {
int code = matcher.match(uri);
switch (code) {
case 1:
db.insert("info", null, values);
break; default:
break;
}
return null;
} @Override
public int delete(Uri uri, String selection, String[] selectionArgs) {
// TODO Auto-generated method stub
return 0;
} @Override
public int update(Uri uri, ContentValues values, String selection,
String[] selectionArgs) {
// TODO Auto-generated method stub
return 0;
} }
5. 编写contentProvider类后要在xml里面配置:
/***这里是通过一个demo实现了暴露,获取数据,如果在另一个程序获取数据需要加上 权限 android:permission="com.example.mycontentproviderleader.permission"*******/
<!-- android:exported 是否对外开放 -->
<provider android:name="com.example.mycontentproviderleader.MyProvider"
android:authorities="com.example.mycontentproviderleader"
android:exported="true"
android:multiprocess="true"
android:permission="com.example.mycontentproviderleader.permission"/>
6.然后在Main里面通过contentResolver ,uri 获取Cursor就行了。
ContentResolver contentResolver;
Uri uri;
contentResolver = getContentResolver();
uri = Uri.parse("content://com.example.mycontentproviderleader/TableSong");
Cursor cursor = contentResolver.query(uri, null, null, null, null);
while (cursor.moveToNext()){
String SongName=cursor.getString(cursor.getColumnIndex("SongName")); Log.d(TAG, "select:歌曲名称:"+SongName);
}
7: code
链接: https://pan.baidu.com/s/1c2aViBQ 密码: 8qtw
ContentProvider 的使用的更多相关文章
- Android之ContentProvider数据存储
一.ContentProvider保存数据介绍 一个程序可以通过实现一个ContentProvider的抽象接口将自己的数据完全暴露出去,而且ContentProvider是以类似数据库中表的方式将数 ...
- Xamarin.Android之ContentProvider
一.前言 掌握了如何使用SQLiteOpenHelper之后,我们就可以进行下一步的学习.本章我们将会学习如何使用ContentProvider来将数据库方面的操作封装起来,同时它还可以供其他应用访问 ...
- ContentProvider域名替换小工具
开发项目域名想怎么换就怎么换,就是这么任性! 这是一个很有意思的小工具! 这是一个方便开发人员和测试人员的小工具!! 吐槽: 一直在做Android开发,一直总有一个问题存在:做自己公司的apk开发时 ...
- Android开发学习—— ContentProvider内容提供者
* 应用的数据库是不允许其他应用访问的* 内容提供者的作用就是让别的应用访问到你的数据库.把私有数据暴露给其他应用,通常,是把私有数据库的数据暴露给其他应用. Uri:包含一个具有一定格式的字符串的对 ...
- 简单的学习心得:网易云课堂Android开发第六章SQLite与ContentProvider
一.SQLite 1.基本操作: (1)创建数据库:在SQLiteOpenHelper的子类构造器中创建. (2)创建表:在SQLiteOpenHelper的子类onCreate方法中,调用execS ...
- ContentProvider中央档案馆,以及获取联系人电话的示例
Android官方文档介绍的数据存储方式共有五种,sqlite,SharedPreferences,网络存储,外储存储,文件存储,但是这些数据都无法进行共享,那么我们就引入了今天的主角:Content ...
- Android基础 : Android ContentProvider
Android 应用程序通过ContentProvider实现方式统一的数据共享功能. 外界的程序通过ContentResolver接口可以访问ContentProvider提供的数据,在Activi ...
- 安卓初級教程(3):ContentProvider的運用原理
package com.example.android.provider; import java.util.ArrayList; import java.util.HashMap; import j ...
- Android探索之ContentProvider熟悉而又陌生的组件
前言: 总结这篇文章之前我们先来回顾一下Android Sqlite数据库,参考文章:http://www.cnblogs.com/whoislcj/p/5506294.html,Android程序内 ...
- 四大组件之ContentProvider
前言 ContentProvider作为Android的四大组件之一,是属于需要掌握的基础知识,可能在我们的应用中,对于Activity和Service这两个组件用的很常见,了解的也很多,但是对Con ...
随机推荐
- Postgresql_最新版11.2源码编译安装
pg官网:https://www.postgresql.org/ yum -y gcc gcc-c++ cmake ncurses-devel perl zlib* .去官网下载源码包. 下载地址:h ...
- Day 23 类的继承,派生,组合,菱形继承,多态与多态性
类的继承 继承是一种新建类的方式,新建的类称为子类,被继承的类称为父类 继承的特性是:子类会遗传父类的属性 继承是类与类之间的关系 为什么用继承 使用继承可以减少代码的冗余 对象的继承 python中 ...
- 【剑指Offer】1、二维数组中的查找
题目描述: 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否 ...
- Monkey日志中如何找错误
无响应问题可以在日志中搜索 “ANR” ,崩溃问题搜索 “CRASH” ,内存泄露问题搜索"GC"(需进一步分析),异常问题搜索 “Exception” monkey执行时未 ...
- sql查询原理
1.单表查询:根据WHERE条件过滤表中的记录,形成中间表(这个中间表对用户是不可见的):然后根据SELECT的选择列选择相应的列进行返回最终结果. 1)简单的单表查询 SELECT 字段 FROM ...
- Windows Server 2008 R2x64 IIS7+PHP5.6 错误 500.0
这两天准备升级一个网站项目,新项目基于PHP并进行了ZendGuard加密,需要在PHP5.6版本中运行 而客户之前的运行环境是php5.2~5.4,那好,再新建一个PHP版本不就完事了吗!!! 于是 ...
- Python-Pandas简单操作
1.直接构建复杂嵌套索引 2. MultiIndex方式构建复杂的索引 多层索引操作 pandas堆叠处理
- lua返回页面时中文乱码
1.在nginx.conf文件中的server标签里添加charset utf-8; 2.查看lua文件编码是否为utf-8
- cnblogs正式启用
额,因为最近发现CSDN越来越过分了...现在连数学公式都显示错字体了--于是决定把博客搬至cnblogs. Markdown 测试 \(\frac{-b\pm \sqrt{b^2-4ac}}{2a} ...
- java异常处理的面试题
package test; public class Test { public static int method(int i) throws Exception { try { return 10 ...