安卓学习笔记之自定义ContentProvider
2016-05-14 20:31
597 查看
步骤
自定义provider类继承ContentProvider实现ContentProvider的抽象方法
在清单文件中配置provider
<provider android:name="com.yu.peoplecontentprovider.PeopleContentProvider" android:authorities="com.yu.peoplecontentprovider" <!- 设置exported为true 使外部可访问--> android:exported="true" />
使用UriMatcher对象添加匹配
// authorities:用于匹配的域名; static String authorities = "com.yu.peoplecontentprovider"; // 创建uri匹配器 static final UriMatcher sMatcher = new UriMatcher(UriMatcher.NO_MATCH); static { //添加匹配规则 //参数1:用于匹配的域名 //参数2:路径 , *表示text的占位符,#表示使用数字的占位符 //参数3:匹配码 sMatcher.addURI(authorities, "info", 1);// com.yu.peoplecontentprovider/info sMatcher.addURI(authorities, "relation", 2);//com.yu.peoplecontentprovider/relation sMatcher.addURI(authorities, "info/#", 3);// com.yu.peoplecontentprovider/info/# }
通过uri匹配执行对应的增删改查等操作
创建数据库以供操作
创建测试应用
具体代码
provider的创建
package com.yu.peoplecontentprovider;
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 PeopleContentProvider extends ContentProvider {
SQLiteDatabase db;
// authorities:用于匹配的域名; static String authorities = "com.yu.peoplecontentprovider"; // 创建uri匹配器 static final UriMatcher sMatcher = new UriMatcher(UriMatcher.NO_MATCH); static { //添加匹配规则 //参数1:用于匹配的域名 //参数2:路径 , *表示text的占位符,#表示使用数字的占位符 //参数3:匹配码 sMatcher.addURI(authorities, "info", 1);// com.yu.peoplecontentprovider/info sMatcher.addURI(authorities, "relation", 2);//com.yu.peoplecontentprovider/relation sMatcher.addURI(authorities, "info/#", 3);// com.yu.peoplecontentprovider/info/# }
@Override
public boolean onCreate() {
DBhelper dbHelper = new DBhelper(getContext());
db = dbHelper.getWritableDatabase();
return true;
}
/**
* 通过匹配查询
*/
@Override
public Cursor query(Uri uri, String[] projection, String selection,
String[] selectionArgs, String sortOrder) {
Cursor cursor = null;
int match = sMatcher.match(uri);
switch (match) {
case 1:
cursor = db.query("info", null, selection, selectionArgs, null, null, sortOrder);
break;
case 2:
cursor = db.query("relation", null, selection, selectionArgs, null, null, sortOrder);
break;
case 3:
// 匹配com.yu.peoplecontentprovider/info/#
// 取出uri末尾携带的数字】
long id = ContentUris.parseId(uri);
System.out.println("id:"+id);
cursor = db.query("info", null, "_id=?", new String[]{id+""}, null, null, null);
break;
}
return cursor;
}
/**
* 通过uri返回数据的 MIME type
*/
@Override
public String getType(Uri uri) {
int match = sMatcher.match(uri);
switch (match) {
case 1:
return "vnd.android.cursor.dir/info";
case 2:
return "vnd.android.cursor.dir/relation";
case 3:
return "vnd.android.cursor.item/info/#";
}
return null;
}
/**
* 通过匹配插入数据库
*/
@Override
public Uri insert(Uri uri, ContentValues values) {
if (sMatcher.match(uri)== 1) {
db.insert("info", null, values);
}
if (sMatcher.match(uri) == 2) {
db.insert("relation", null, values);
}
return uri;
}
/**
* 通过匹配删除内容
*/
@Override
public int delete(Uri uri, String selection, String[] selectionArgs) {
int rowsAffected=0;
if (sMatcher.match(uri) ==1) {
rowsAffected = db.delete("info", selection, selectionArgs);
}
if (sMatcher.match(uri) == 2) {
rowsAffected = db.delete("relation", selection, selectionArgs);
}
return rowsAffected;
}
/**
* 通过匹配更新数据库
*/
@Override
public int update(Uri uri, ContentValues values, String selection,
String[] selectionArgs) {
int rowsAffected=0;
if (sMatcher.match(uri) == 1) {
rowsAffected = db.update("info", values, selection, selectionArgs);
}
if (sMatcher.match(uri) == 2) {
rowsAffected = db.update("relation", values, selection, selectionArgs);
}
return rowsAffected;
}
}
数据库创建帮助类
package com.yu.peoplecontentprovider; 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, "people.db", null, 2); } @Override public void onCreate(SQLiteDatabase db) { db.execSQL("create table info(_id integer primary key autoincrement,name text,age integer)"); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { db.execSQL("create table relation(_id integer primary key autoincrement,name text,age integer)"); } }
测试代码
package com.yu.testcontentprovider; import android.app.Activity; import android.content.ContentResolver; import android.content.ContentValues; import android.content.UriMatcher; import android.database.Cursor; import android.net.Uri; import android.os.Bundle; import android.os.Looper; import android.view.View; import android.widget.Toast; public class MainActivity extends Activity { ContentResolver resolver; String baseUri = "content://com.yu.peoplecontentprovider"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); resolver = getContentResolver(); } public void insert(View view) { ContentValues values = new ContentValues(); values.put("name", "eee"); values.put("age", 564); resolver.insert(Uri.parse(baseUri+"/relation"), values ); } public void update(View view) { ContentValues values = new ContentValues(); values.put("age", 4567); resolver.update(Uri.parse(baseUri+"/relation"), values , "name=?", new String[]{"eee"}); } public void delete(View view) { resolver.delete(Uri.parse(baseUri+"/relation"), "name=?", new String[]{"qqq"}); } public void query(View view) { final Cursor cursor = resolver.query(Uri.parse(baseUri+"/relation"), null, null, null, null); if (cursor != null) { Toast.makeText(getApplicationContext(), "查询", 0).show(); while (cursor.moveToNext()) { String name = cursor.getString(1); int age = cursor.getInt(2); System.out.println("------------------------------"); System.out.println("name:"+name+",age:"+age); } } } public void queryId(View view) { Cursor cursor = resolver.query(Uri.parse(baseUri+"/info/20"), null, null, null, null); if (cursor != null) { if (cursor.moveToNext()) { Toast.makeText(getApplicationContext(), "id查询", 0).show(); String name = cursor.getString(1); int age = cursor.getInt(2); System.out.println("------------------------------"); System.out.println("name"+name+",age:"+age); } } } public void getType(View view) { System.out.println(resolver.getType(Uri.parse(baseUri+"/info/20")));; } }
相关文章推荐
- PHP中的可变参数函数和可选参数函数
- php &$
- php中函数和方法的区别
- FragmentpagerAdapter和FragmentStatePagerAdapter的区别
- php发送错误日志邮件
- TP框架基础(一)
- PHP笔记②所有输出语句
- PHP之——在WAMPSERVER下增加多版本的PHP(PHP5.3,PHP5.4,PHP5.5)支持。
- 走入PHP的世界
- PHPCMS 后台模块开发之Ajax查询
- php.ini配置的完全解读
- PHP发生Call to undefined function imagecreate()错误的解决办法
- thinkphp后台向前台传值没有传过去的小问题
- thinkphp框架下404页面设置 仅三步
- Entity Framework 6 Recipes 2nd Edition(13-1)译 -> 优化TPT继承模型的查询
- php基于CodeIgniter实现图片上传、剪切功能
- PHP知识体系思维导图
- PHP5升级到PHP7注意点(windows环境)
- thinkphp3.2,URL重写
- PHP 升级到5.5后MySQL的代替法