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 ...
随机推荐
- Python之数据结构改造
{ "appList":[ { "id" : 120, "name" : "BIGDATA", "alias& ...
- Restrictions.like("字段field","%表达式exp%");
Restrictions.like("字段field","%表达式exp%");用hql语句就是 from table where field like '%e ...
- Java基本类型转换
1.自动类型转换 java所有的数值型变量都可以相互转换,如果系统支持把某种基本类型的值直接付赋给另一个基本类型的变量,则这种方式被称为自动类型转换. 当把一个表数范围小的数值或变量直接赋给另一个表数 ...
- D2007在win7下bordbk105N.dll 莫名其妙的问题。
已经装过一次win7下d2007.再装一次就出现许多莫名其妙的问题.其中之一: Windows 7 64bit Delphi Debugger Fix / Workaround 2013-08-28 ...
- ACDream - Power Sum
先上题目: Power Sum Time Limit: 20000/10000MS (Java/Others) Memory Limit: 128000/64000KB (Java/Others) S ...
- 【ACM】hdu_1234_开门人和关门人_201307300845
开门人和关门人Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Subm ...
- javaScript面向对象继承方法经典实现
转自原文javaScript面向对象继承方法经典实现 JavaScript的出现已经将近20多年了,但是对这个预言的褒贬还是众说纷纭.很多人都说JavaScript不能算是面向对象的变成语言.但是Ja ...
- winrar为啥有广告了?能去掉么?
winrar为啥有广告了?能去掉么? 学习了:http://blog.csdn.net/chenchunlin526/article/details/54580686 学习了:https://jing ...
- hdoj1051Wooden Sticks
/*这道题目是先要排序的,依照长度或者重量排都能够. 当长度(重量)同样时就依照重量(长度)排, 从大到小或从小到大都能够! 这里我懂的.没有问题! 排序之后,问题就能够简化,(如果依照长度不等 ...
- hibernate之7.one2many双向
表结构 实体类关系 实体类源代码 Student package com.demo.model; import java.io.UnsupportedEncodingException; import ...