SQLite轻量级数据库--ContentProvider

SQLite轻量级数据库--ContentProvider,第1张

概述Android中程序间数据的共享是通过Provider/Resolver进行的。提供数据(内容)的就叫Provider,Resovler提供接口对这个内容进行解读。 四大主键都需要在AndroidManifest里面注册 步骤: 1.写一个类继承extends ContentProvider 2.重写对应方法 3.在AndroidManifest.xml注册 注册一个地址 注册: <provide 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轻量级数据库--ContentProvider全部内容,希望文章能够帮你解决SQLite轻量级数据库--ContentProvider所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/1166119.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-01
下一篇 2022-06-01

发表评论

登录后才能评论

评论列表(0条)

保存