SQLite轻量级数据库--ContentProvider

Android中程序间数据的共享是通过Provider/Resolver进行的。提供数据(内容)的就叫Provider,Resovler提供接口对这个内容进行解读。
 
四大主键都需要在AndroidManifest里面注册
步骤:
1.写一个类继承extends ContentProvider
2.重写对应方法
3.在AndroidManifest.xml注册
注册一个地址
注册:
<provider
android:name="com.example.day14_4.MyProvider"
android:exported="true"
android:authorities="com.qf.android.7806"></provider>
其中android:name="com.example.day14_4.MyProvider"是服务器所在地址,exported设置为true使之可以被其他工程访问。authorities是服务器名称。
 
 
contentResolver使用这个Provider时,查询时:
Uri uri=Uri.parse("content://android.qianmeng.7806");其中content://必须要写上去,否则会出错。
 
Provider建设使用:
1.建设一个类继承SqliteopenHelper用来建立一个数据库li.db,确定需要创建的表
2.建设MyProvider继承ContentProvider用来给数据库li.db和外边的数据提供同一的接口进行交互
3.在MyProvider里面添写匹配uri(UriMatcher,contentUris),增删改查的方法.当然,最重要的,首先在onCreate方法中将sqliteopenHelper数据源给添加进来(感觉这个就是个增删改查的平台,适配器)
4.数据库中有多个表格时,建议封装表格类来进行划分。使得代码比较清晰。
 
package com.example.day_contentprovider;
 
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.database.sqlite.SQLiteOpenHelper;
 
public class DBHelper extends SQLiteOpenHelper {
public DBHelper(Context context){
super(context,"qf.db",null,1);
}
public DBHelper(Context context, String name, CursorFactory factory, int version) {
super(context, name, factory, version);
// TODO Auto-generated constructor stub
}
 
@Override
public void onCreate(SQLiteDatabase db) {
// TODO Auto-generated method stub
String sql="create table stu(_id integer primary key autoincrement,name text,age integer)";
db.execSQL(sql);
sql="create table tea(_id integer primary key autoincrement,name text,num integer)";
db.execSQL(sql);
}
 
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// TODO Auto-generated method stub
 
}
 
}
 
②和③:
package com.example.day_contentprovider;
 
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;
import android.util.Log;
/***
* 增删改查方法写完之后,一定的写上
* getContext().getContentResolver().notifyChange(uri, null);这句,通知数据库进行更新
* @author Administrator
*
*/
public class MyProvider extends ContentProvider {
//注册的主机地址
final static String TEST_URI="com.li";
//定义匹配结果代码常量
final static int STU_MATCH=1;
final static int STU_SINGLE_MATCH=2;
final static int STU_SINGLE=5;
final static int TEA_MATCH=3;
final static int TEA_SINGLE_MATCH=4;
final static int TEA_SINGLE=6;
static UriMatcher matcher;
static{
matcher=new UriMatcher(UriMatcher.NO_MATCH);//如果直接写-1,可读性不是很好
//添加stu表的匹配
//content://com.li//stu
matcher.addURI(TEST_URI, "stu", STU_MATCH);
//content://com.li//stu/6-->6可以用#来表示
matcher.addURI(TEST_URI, "stu/#", STU_SINGLE_MATCH);
//content://com.li//stu/name/张无忌-->张无忌可以用*来表示...String类型使用*号表示
matcher.addURI(TEST_URI , "stu/name/*", STU_SINGLE);
//content://com.li//tea
matcher.addURI(TEST_URI, "tea", TEA_MATCH);
//content://com.li//tea/4-->可以用#来表示。。。数字类型使用#号表示
matcher.addURI(TEST_URI, "tea/#", TEA_SINGLE_MATCH);
//content://com.li//tea/name/'刘宇'-->刘宇可以用*来表示
matcher.addURI(TEST_URI, "tea/name/*", TEA_SINGLE);
}
//声明DBHelper
DBHelper helper;
//数据库删除
@Override
public int delete(Uri uri, String selection, String[] selectionArgs) {
// 获得code
int code=matcher.match(uri);
SQLiteDatabase db=helper.getWritableDatabase();
int result=0;
String where;
Log.e("delete", code+"----"+TEA_SINGLE);
switch (code) {
case STU_MATCH: //第一种方法:直接在selection中添加条件,然后查找删除
result=StuDao.delete(db, selection, selectionArgs);
break;
case STU_SINGLE_MATCH:{ //第二种方法:获取uri后面表名的_id,然后判断selection里面是否有条件。然后集合起来进行判断查找删除
 
//content://com.li/stu/2
//取出id
long id=ContentUris.parseId(uri);
//构造条件表达式:where _id=id and selection
where="_id="+id;
if(selection!=null){
where =where+"and"+selection;
}
result=StuDao.delete(db, where, selectionArgs);
break;
}
case STU_SINGLE:{ //第三种方法:使用uri.getLastPathSegment()获取uri后面列表里面的列(column)中的具体name(条件),
//然后判断selection里面是否还有其他条件。最后集合起来进行判断查找删除
//获取后面的条件
//content://com.li/stu/name/"'张丰1'"
String name=uri.getLastPathSegment();
//构造条件表达式
where="name="+name;
if(selection!=null){
where=where+"and"+selection;
}
result=StuDao.delete(db, where, selectionArgs);
break;
}
case TEA_MATCH:
result=TeaDao.delete(db, selection, selectionArgs);
break;
case TEA_SINGLE_MATCH:
//取出id
long id1=ContentUris.parseId(uri);
//构造条件表达式:where _id=id and selection
where="_id="+id1;
if(selection!=null){
where=where+"and"+selection;
}
result=TeaDao.delete(db, where, selectionArgs);//StuDao和TeaDao千万别搞混乱了
break;
case TEA_SINGLE:{
//获取后面的条件
//content://com.li/tea/name/"'张丰1'"
String name=uri.getLastPathSegment();
where="name="+name;
if(selection!=null){
where=where+"and"+selection;
}
result=TeaDao.delete(db, where, selectionArgs);
break;
}
default:
break;
}
// 通知数据更新
getContext().getContentResolver().notifyChange(uri, null);
return result;
}
 
 
@Override
public Uri insert(Uri uri, ContentValues values) {
// TODO Auto-generated method stub
SQLiteDatabase db=helper.getReadableDatabase();
//插入id
long id=0;
//获取匹配结果代码
int code=matcher.match(uri);
//根据匹配结果,决定操作哪张数据表
switch(code){
case STU_MATCH:
//id=helper.getWritableDatabase().insert("stu", null, values);
id=StuDao.insert(db, values);
break;
case TEA_MATCH:
//id=helper.getWritableDatabase().insert("tea", null, values);
id=TeaDao.insert(db, values);
break;
default:
break;
}
db.close();
//通知数据更新
getContext().getContentResolver().notifyChange(uri, null);
//利用ContentUris
Uri newUri=ContentUris.withAppendedId(uri, id);
return newUri;
}
 
 
@Override
public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
// TODO Auto-generated method stub
//获取匹配结果值
int code=matcher.match(uri);
SQLiteDatabase db=helper.getWritableDatabase();
//结果返回
Cursor cs = null;
switch(code){
case STU_MATCH:
cs=StuDao.query(db, projection, selection, selectionArgs, sortOrder);
break;
case TEA_MATCH:
cs=TeaDao.query(db, projection, selection, selectionArgs, sortOrder);
break;
}
/**
* 主要用来刷新数据使用,如果这句话没有,在UI界面数据则无法改变(但是数据已经进入数据库)。
* 主要是用来刷新界面使用
*/
// 更新数据源
cs.setNotificationUri(getContext().getContentResolver(), uri);
return cs;
}
 
@Override
public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {
// TODO Auto-generated method stub
SQLiteDatabase db=helper.getReadableDatabase();
int code=matcher.match(uri);
int result=0;
Log.e("update", STU_SINGLE+"---"+code);//放在这里可以看到code是否匹配
String where;
switch (code) {
case STU_MATCH:
result=StuDao.update(db, values, selection, selectionArgs);
break;
case STU_SINGLE:
//content://com.li/name/张无忌
//获取最后一个参数
String name=uri.getLastPathSegment();
//构造条件表达式
where="name="+name;
if(selection!=null){
where=where+" and "+selection;
}
result=StuDao.update(db, values, where, selectionArgs);
break;//不添加则会出现no such column: age (code 1): , while compiling: UPDATE tea SET name=?,age=?
 
case TEA_MATCH:
TeaDao.update(db, values, selection, selectionArgs);
break;
case TEA_SINGLE:
//获取最后一个参数
String name1=uri.getLastPathSegment();
//构造条件表达式
where="name="+name1;
if(selection!=null){
where=where+" and "+selection;//name='ad' and age>? new String[]{"100"}。。。//selectionArgs在数据库中会自动加载进去
}
result=StuDao.update(db, values, selection, selectionArgs);
default:
break;
}
Log.e("tag", result+"");
//通知数据更新
getContext().getContentResolver().notifyChange(uri, null);//一定得写这些
//表示返回了多少条数据
return result;
}
@Override
public String getType(Uri uri) {
// TODO Auto-generated method stub
return null;
}
 
@Override
public boolean onCreate() {
// TODO Auto-generated method stub
helper=new DBHelper(getContext());
if(helper!=null){
return true;
}
return false;
}
}
④封装表格类
stu类:
package com.example.day_contentprovider;
 
import android.content.ContentValues;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.net.Uri;
 
/**
* stu表工具类
* @author Administrator
*
*/
public class StuDao {
//表名已经确定
static final String NAME="stu";
public static int delete(SQLiteDatabase db, String arg1, String[] arg2) {
return db.delete(NAME, arg1, arg2);
}
 
/**
* 插入到stu表中
* @param db
* @param uri
* @param values
* @return
*/
public static long insert(SQLiteDatabase db, ContentValues values) {
// TODO Auto-generated method stub
 
return db.insert(NAME, null, values);
}
 
 
public static Cursor query(SQLiteDatabase db, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
// TODO Auto-generated method stub
return db.query(NAME, projection, selection, selectionArgs, null, null, sortOrder);
}
 
public static int update(SQLiteDatabase db, ContentValues values, String selection, String[] selectionArgs) {
// TODO Auto-generated method stub
return db.update(NAME, values, selection, selectionArgs);
 
}
}
Tea类:
package com.example.day_contentprovider;
 
import android.content.ContentValues;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
 
public class TeaDao {
//因为表名已经确定
static final String NAME="tea";
public static int delete(SQLiteDatabase db, String arg1, String[] arg2) {
return db.delete(NAME, arg1, arg2);
}
 
/**
* 插入到stu表中
* @param db
* @param uri
* @param values
* @return
*/
public static long insert(SQLiteDatabase db, ContentValues values) {
// TODO Auto-generated method stub
 
return db.insert(NAME, null, values);
}
 
 
public static Cursor query(SQLiteDatabase db, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
// TODO Auto-generated method stub
return db.query(NAME, projection, selection, selectionArgs, null, null, sortOrder);
}
 
public static int update(SQLiteDatabase db, ContentValues values, String selection, String[] selectionArgs) {
// TODO Auto-generated method stub
return db.update(NAME, values, selection, selectionArgs);
 
}
}
 
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

tiwolf_li

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值