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.1609"></provider>
其中android:name="com.example.day14_4.MyProvider"是服务器所在地址,exported设置为true使之可以被其他工程访问。authorities是服务器名称


contentResolver使用这个Provider时,查询时:
Uri uri=Uri.parse("content://android.qianfeng.1609");其中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,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,selectionArgs);
break;
}
case TEA_MATCH:
result=TeaDao.delete(db,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,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,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",values);
id=StuDao.insert(db,values);
break;
case TEA_MATCH:
//id=helper.getWritableDatabase().insert("tea",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[] 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,selectionArgs,sortOrder);
break;
case TEA_MATCH:
cs=TeaDao.query(db,sortOrder);
break;
}
/**
* 主要用来刷新数据使用,如果这句话没有,在UI界面数据则无法改变(但是数据已经进入数据库)。
* 主要是用来刷新界面使用
*/
// 更新数据源
cs.setNotificationUri(getContext().getContentResolver(),uri);
return cs;
}

@Override
public int update(Uri uri,ContentValues values,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,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,selectionArgs);
break;//不添加则会出现no such column: age (code 1):,while compiling: UPDATE tea SET name=?,age=?

case TEA_MATCH:
TeaDao.update(db,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,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,values);
}


public static Cursor query(sqliteDatabase db,String sortOrder) {
// Todo Auto-generated method stub
return db.query(NAME,sortOrder);
}

public static int update(sqliteDatabase db,String[] selectionArgs) {
// Todo Auto-generated method stub
return db.update(NAME,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,selectionArgs);
}
}

相关文章

SQLite架构简单,又有Json计算能力,有时会承担Json文件/RES...
使用Python操作内置数据库SQLite以及MySQL数据库。
破解微信数据库密码,用python导出微信聊天记录
(Unity)SQLite 是一个软件库,实现了自给自足的、无服务器...
安卓开发,利用SQLite实现登陆注册功能