SQLite轻量级数据库--ContentProvider
发布时间:2020-12-12 19:29:06 所属栏目:百科 来源:网络整理
导读:Android中程序间数据的共享是通过Provider/Resolver进行的。提供数据(内容)的就叫Provider,Resovler提供接口对这个内容进行解读。 四大主键都需要在AndroidManifest里面注册 步骤: 1.写一个类继承extends ContentProvider 2.重写对应方法 3.在AndroidMan
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); } } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |