Android--ContentProvider小demo

之前我写过一篇文章,只是简单地介绍了一下CintentProvider的概念性的东西,今天给大家带来了一个小Demo,首先呢,我要和大家分享一下我对于android

中内容提供者的一些看法


1.我们都知道在JavaWeb中,我们可以通过POST与GET方法来获取数据,在我们的android里,我们可以类比一下,所谓内容提供者,就是可以为我们提供数据

2.通过ContentProvider我们可以进行跨应用进行数据访问

3.有提供数据的,自然就会有解析数据的,android为我们提供了一个和ContentProvider一块使用的---ContentResolver,专门用来解析数据

4.其实简单地我们就可以理解为:内容提供者就是提供数据的数据源,供访问

5.内容提供者为我们提供了一套访问数据的接口,我们可以通过ContentResolver进行访问数据

6.在我们新建一个ContentProvider时,不可以new出来,因为我们访问的数据几乎都是一些私有数据,存放在数据库里面

7.ContentProvider提供了一套访问数据的规则

8.ContentProvider是可以实现跨应用进行数据的获取的,注意:跨应用!!!跨应用!!! 切记


好啦,下面就让我们通过一个小例子来看一下吧:

在这里我首先把这个demo的框架介绍一下,后边会附上源码以及结果

1.我们创建一个类,让其继承ContentProvider,

2.我们要创建一个数据库的类

3.写好相关的权限问题,在这里特别说一下,我们的ContentProvider是有权限的,不是说谁都可以访问的

4.在配置文件里要声明


1.我们创建一个ContentProvider的子类

package com.example.contentproviderdck;

import android.content.ContentProvider;
import android.content.ContentUris;
import android.content.ContentValues;
import android.content.UriMatcher;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.net.Uri;

public class PersonProvider extends ContentProvider {
private DBHelper helper;
//下面我们定义一个匹配Uri的规则
//默认的规则是不匹配的
private static final UriMatcher MATCHER=new UriMatcher(UriMatcher.NO_MATCH);
private static final int PERSONS=1;//操作多条记录
private static final int PERSON=2;//操作单条记录
//下面我们写一个代码块
static{
//往MATCHER里面添加匹配规则
MATCHER.addURI("com.example.contentproviderdck.PersonProvider",
"person",
PERSONS);
//com.example.contentproviderdck.PersonProvider/person/张
MATCHER.addURI("com.example.contentproviderdck.PersonProvider",
"person/#",
PERSON);
//com.example.contentproviderdck.PersonProvider/person/1
}

//delete from person where _id=?
//使用通配符
@Override
public int delete(Uri uri, String selection, String[] selectionArgs) {
// TODO Auto-generated method stub
//从uri中匹配的规则
int flag=MATCHER.match(uri);
//得到数据库
SQLiteDatabase database=helper.getWritableDatabase();
switch (flag) {
//单条记录
case PERSON:
String where_values="_id=?";
if(selection!=null&&!selection.equals("")){

}
database.delete("person", whereClause, whereArgs);
break;
//多条记录
case PERSONS:
break;
}
return 0;
}

@Override
public String getType(Uri uri) {
// TODO Auto-generated method stub
//解析Uri,判断mime的类型
int flag=MATCHER.match(uri);
switch (flag) {
case PERSON:
//这是插入单行记录
//这是语法,就像关键字一样
return "vnd.android.cursor.item.person";
case PERSONS:
//这是插入多行记录
return "vnd.android.cursor.dir.persons";
}
return null;
}

@Override
public Uri insert(Uri uri, ContentValues values) {
// TODO Auto-generated method stub
Uri result=null;
//解析Uri,这一步很重要,不可以省略
int flag=MATCHER.match(uri);
switch (flag) {
case PERSONS:
//插入操作调用数据库的访问方法
SQLiteDatabase database=helper.getWritableDatabase();
//该方法返回一个插入哪个行的的行号
long id=database.insert("person",null, values);//将数据插入数据库
result=ContentUris.withAppendedId(uri, id);
System.out.println("插入成功"+result.toString());
break;
}
return result;
}

@Override
public boolean onCreate() {
// TODO Auto-generated method stub
helper=new DBHelper(getContext());
return false;
}

@Override
public Cursor query(Uri uri, String[] projection, String selection, String[] selectionargs,
String sortorder) {
// TODO Auto-generated method stub
//我们首先要获取一个可以读的数据库
SQLiteDatabase database=helper.getReadableDatabase();
return null;
}

@Override
public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {
// TODO Auto-generated method stub
return 0;
}

}

我们在这里定义了一个Static代码块,static代码块是先执行的,同时static代码块里的东西会存储在全局变量区,这样可以是程序执行起来更快

2.定义一个数据库类

package com.example.contentproviderdck;

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

public class DBHelper extends SQLiteOpenHelper {
private static String name="mydb.db";
private static int version=1;
public DBHelper(Context context) {
super(context, name,null, version);
// TODO Auto-generated constructor stub
}

//这是数据库初始化
@Override
public void onCreate(SQLiteDatabase db) {
// TODO Auto-generated method stub

String sql="create table person" +
"(_id integer primary key autoincrement," +
"name varchar(64)," +
"address varchar(64))";

db.execSQL(sql);

}

//这是更新数据库时使用的
//一次创建完不就OK了,一般境况下不会更新数据库版本
@Override
public void onUpgrade(SQLiteDatabase db, int arg1, int arg2) {
// TODO Auto-generated method stub

}

}

在这里要说明一下,我们一般情况下不会用到数据库更新,你试想一下,你创建了一个数据库,除非你要对数据库中表的结构进行改变,要不然还要进行数据备份,很麻烦的

3.因为我们的内容提供者是我们app的四大基本组件之一,所以我们要在配置文件里面进行声明;


4.我们写一个测试类

首先我们要在清单文件里面进行配置:


我们点击add,之后我们要把前两项写上,我们点击选择,默认就可以,但是我们还需要在清单文件里面进行声明:


5.当我们运行的时候,我们可以以这样的方式进行运行


6.现在我们首先来看一下运行结果,我们床建立一个数据库,下面我们就来看一下是否创建成功并且插入数据


根据运行结果我们可以发现,我们的内容提供者的确给我们提供了数据,我们并且成功进行了创建


好啦,下面我为代价解释几个比较难懂的地点

首先我们的demo中用到了uri,那么内容提供者和我们的uri有什么关系呢

其实,在我们的android中,内容提供者是靠我们的Uri来进行访问的,好啦,因为这一点太过重要,所以我会单独的写一篇博客,用来讲解内容提供者中的Uri


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值