ContentProvider使用例子
2016-05-17 14:12
681 查看
ContentProvider的简单例子
public class FirewallManagerProvider extends ContentProvider {
private final static UriMatcher mUriMatcher;
private static final int MATCH_CODE_MOBILE = 1;
private static final int MATCH_CODE_WIFI = 2;
public static final String AUTHORITY = "com.example.contentproviderdemo.provider.FirewallManagerProvider";
public static final Uri CONTENT_URI_FIREWALL_MOBILE = Uri
.parse("content://" + AUTHORITY + "/"
+ FirewallDatabaseHelper.MOBILE_TABLE);
public static final Uri CONTENT_URI_FIREWALL_WIFI = Uri.parse("content://"
+ AUTHORITY + "/" + FirewallDatabaseHelper.WIFI_TABLE);
static {
mUriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
mUriMatcher.addURI(AUTHORITY, FirewallDatabaseHelper.MOBILE_TABLE,
MATCH_CODE_MOBILE);
mUriMatcher.addURI(AUTHORITY, FirewallDatabaseHelper.WIFI_TABLE,
MATCH_CODE_WIFI);
}
private FirewallDatabaseHelper mHelper;
@Override
public boolean onCreate() {
mHelper = FirewallDatabaseHelper.getInstance(getContext()
.getApplicationContext());
return false;
}
@Override
public Cursor query(Uri uri, String[] projection, String selection,
String[] selectionArgs, String sortOrder) {
return null;
}
@Override
public String getType(Uri uri) {
return null;
}
@Override
public Uri insert(Uri uri, ContentValues values) {
SQLiteDatabase db = mHelper.getWritableDatabase();
long rowId;
Uri result = null;
switch (mUriMatcher.match(uri)) {
case MATCH_CODE_MOBILE:
// 插入后返回的是当前所在的行号
rowId = db.insert(FirewallDatabaseHelper.MOBILE_TABLE, null, values);
if (rowId > 0) {
// 将行号添加到URI的末尾,做为结果返回
result = ContentUris.withAppendedId(CONTENT_URI_FIREWALL_MOBILE, rowId);
getContext().getContentResolver().notifyChange(uri, null);
}
break;
case MATCH_CODE_WIFI:
rowId = db.insert(FirewallDatabaseHelper.WIFI_TABLE, null, values);
if (rowId > 0) {
result = ContentUris.withAppendedId(CONTENT_URI_FIREWALL_WIFI, rowId);
getContext().getContentResolver().notifyChange(uri, null);
}
break;
default:
throw new IllegalArgumentException("Unknown URI " + uri);
}
return result;
}
@Override
public int delete(Uri uri, String selection, String[] selectionArgs) {
return 0;
}
@Override
public int update(Uri uri, ContentValues values, String selection,
String[] selectionArgs) {
return 0;
}
}
FirewallDatabaseHellper:
public class FirewallDatabaseHelper extends SQLiteOpenHelper {
private static final String DATABASE_NAME = "firewall.db";
private static final int DATABASE_VERSION = 1;
public static final String MOBILE_TABLE = "mobile";
public static final String WIFI_TABLE = "wifi";
private static FirewallDatabaseHelper mInstance;
public static synchronized FirewallDatabaseHelper getInstance(Context context) {
if (mInstance == null) {
mInstance = new FirewallDatabaseHelper(context);
}
return mInstance;
}
private FirewallDatabaseHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
public FirewallDatabaseHelper(Context context, String name,
CursorFactory factory, int version) {
super(context, name, factory, version);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL("create table if not exists mobile ("
+ " _id integer primary key autoincrement ,"
+ " pkg_name text unique not null ,"
+ " uid int " + ");");
db.execSQL("create table if not exists wifi ("
+ " _id integer primary key autoincrement ,"
+ " pkg_name text unique not null ,"
+ " uid int " + ");");
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
}
provider在Manifest中的注册:
添加自定义权限,注意是permission:
<permission
android:name="com.example.contentproviderdemo.provider.FirewallManagerProvider"
android:protectionLevel="normal" >
</permission>
注册:
<provider
android:name="com.example.contentproviderdemo.provider.FirewallManagerProvider"
android:authorities="com.example.contentproviderdemo.provider.FirewallManagerProvider"
android:exported="true"
android:permission="com.example.contentproviderdemo.provider.FirewallManagerProvider" >
</provider>
第三方应用调用以及监听数据库变化:
public class MainActivity extends Activity {
public static final String AUTHORITY = "com.example.contentproviderdemo.provider.FirewallManagerProvider";
public static final Uri CONTENT_URI_FIREWALL_MOBILE = Uri
.parse("content://" + AUTHORITY + "/mobile");
public static final Uri CONTENT_URI_FIREWALL_WIFI = Uri.parse("content://"
+ AUTHORITY + "/wifi");
private MyContentObserver myContentObserver;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button button1 = (Button) findViewById(R.id.button1);
button1.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
insertData();
}
});
ContentResolver resolver = getContentResolver();
myContentObserver = new MyContentObserver(new Handler());
// notifyForDescendents: 为false时,表示精确匹配,为true时,表示可以同时匹配其派生的URI
resolver.registerContentObserver(CONTENT_URI_FIREWALL_MOBILE, false,
myContentObserver);
}
private class MyContentObserver extends ContentObserver {
public MyContentObserver(Handler handler) {
super(handler);
}
@Override
public void onChange(boolean selfChange) {
super.onChange(selfChange);
System.out.println("数据库发生了变化");
}
}
private void insertData() {
ContentValues values = new ContentValues();
values.put("pkg_name", "cn.hehe");
values.put("uid", 10013);
try {
Uri insertUri = getContentResolver().insert(
CONTENT_URI_FIREWALL_MOBILE, values);
long rowId = ContentUris.parseId(insertUri);
if (rowId > 0) {
System.out.println("插入成功");
}
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
protected void onDestroy() {
super.onDestroy();
getContentResolver().unregisterContentObserver(myContentObserver);
}
}
Manifest中需要添加权限,注意是uses-permission:
<uses-permission android:name="com.example.contentproviderdemo.provider.FirewallManagerProvider" />
provider节点下exported属性的说明:
这个属性用于指示该provider算法能被其他应用程序调用或进行交互。设置为true,则能够被调用或交互;设置为false时,只有同一个应用程序的组件或者带有相同用户ID的应用程序才能调用。
provider节点下可以声明的权限相关属性有:readPermission、writePermission、permission。
readPermission:使用Content Provider的查询功能所必需的权限,即调用ContentProvider里面的query()方法的权限。
writePermission:使用Content Provider的修改功能所必需的权限,即调用insert()、delete()、update()方法的权限。
permission:客户端读、写Content Provider中数据所必需的权限名称。本属性为一次性设置读和写权限提供了快捷途径。不过,readPermission和writePermission属性优先于本属性。即如果同时设置了readPermission属性和permission权限,则声明readPermission权限的应用才能读取。
SQLiteQueryBuilder中的setProjectionMap,
这里的ProjectionMap必须是一个hashmap,更重要的是:
If a projection map is set it must contain all column names the user may request, even if the key and value are the same
qb.setProjectionMap(sCallsProjectionMap);
这个函数的作用是在qb里设置数据库字段的别名,即用户定义列名->数据库列名,在执行qb.query时可以使用用户定义列名设置projection、selection等。
如果不需要对列名进行映射,可以不调用这个函数。但是如果调用,必须对所有列都进行映射,映射中key和value可以完全相同。
public class FirewallManagerProvider extends ContentProvider {
private final static UriMatcher mUriMatcher;
private static final int MATCH_CODE_MOBILE = 1;
private static final int MATCH_CODE_WIFI = 2;
public static final String AUTHORITY = "com.example.contentproviderdemo.provider.FirewallManagerProvider";
public static final Uri CONTENT_URI_FIREWALL_MOBILE = Uri
.parse("content://" + AUTHORITY + "/"
+ FirewallDatabaseHelper.MOBILE_TABLE);
public static final Uri CONTENT_URI_FIREWALL_WIFI = Uri.parse("content://"
+ AUTHORITY + "/" + FirewallDatabaseHelper.WIFI_TABLE);
static {
mUriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
mUriMatcher.addURI(AUTHORITY, FirewallDatabaseHelper.MOBILE_TABLE,
MATCH_CODE_MOBILE);
mUriMatcher.addURI(AUTHORITY, FirewallDatabaseHelper.WIFI_TABLE,
MATCH_CODE_WIFI);
}
private FirewallDatabaseHelper mHelper;
@Override
public boolean onCreate() {
mHelper = FirewallDatabaseHelper.getInstance(getContext()
.getApplicationContext());
return false;
}
@Override
public Cursor query(Uri uri, String[] projection, String selection,
String[] selectionArgs, String sortOrder) {
return null;
}
@Override
public String getType(Uri uri) {
return null;
}
@Override
public Uri insert(Uri uri, ContentValues values) {
SQLiteDatabase db = mHelper.getWritableDatabase();
long rowId;
Uri result = null;
switch (mUriMatcher.match(uri)) {
case MATCH_CODE_MOBILE:
// 插入后返回的是当前所在的行号
rowId = db.insert(FirewallDatabaseHelper.MOBILE_TABLE, null, values);
if (rowId > 0) {
// 将行号添加到URI的末尾,做为结果返回
result = ContentUris.withAppendedId(CONTENT_URI_FIREWALL_MOBILE, rowId);
getContext().getContentResolver().notifyChange(uri, null);
}
break;
case MATCH_CODE_WIFI:
rowId = db.insert(FirewallDatabaseHelper.WIFI_TABLE, null, values);
if (rowId > 0) {
result = ContentUris.withAppendedId(CONTENT_URI_FIREWALL_WIFI, rowId);
getContext().getContentResolver().notifyChange(uri, null);
}
break;
default:
throw new IllegalArgumentException("Unknown URI " + uri);
}
return result;
}
@Override
public int delete(Uri uri, String selection, String[] selectionArgs) {
return 0;
}
@Override
public int update(Uri uri, ContentValues values, String selection,
String[] selectionArgs) {
return 0;
}
}
FirewallDatabaseHellper:
public class FirewallDatabaseHelper extends SQLiteOpenHelper {
private static final String DATABASE_NAME = "firewall.db";
private static final int DATABASE_VERSION = 1;
public static final String MOBILE_TABLE = "mobile";
public static final String WIFI_TABLE = "wifi";
private static FirewallDatabaseHelper mInstance;
public static synchronized FirewallDatabaseHelper getInstance(Context context) {
if (mInstance == null) {
mInstance = new FirewallDatabaseHelper(context);
}
return mInstance;
}
private FirewallDatabaseHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
public FirewallDatabaseHelper(Context context, String name,
CursorFactory factory, int version) {
super(context, name, factory, version);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL("create table if not exists mobile ("
+ " _id integer primary key autoincrement ,"
+ " pkg_name text unique not null ,"
+ " uid int " + ");");
db.execSQL("create table if not exists wifi ("
+ " _id integer primary key autoincrement ,"
+ " pkg_name text unique not null ,"
+ " uid int " + ");");
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
}
provider在Manifest中的注册:
添加自定义权限,注意是permission:
<permission
android:name="com.example.contentproviderdemo.provider.FirewallManagerProvider"
android:protectionLevel="normal" >
</permission>
注册:
<provider
android:name="com.example.contentproviderdemo.provider.FirewallManagerProvider"
android:authorities="com.example.contentproviderdemo.provider.FirewallManagerProvider"
android:exported="true"
android:permission="com.example.contentproviderdemo.provider.FirewallManagerProvider" >
</provider>
第三方应用调用以及监听数据库变化:
public class MainActivity extends Activity {
public static final String AUTHORITY = "com.example.contentproviderdemo.provider.FirewallManagerProvider";
public static final Uri CONTENT_URI_FIREWALL_MOBILE = Uri
.parse("content://" + AUTHORITY + "/mobile");
public static final Uri CONTENT_URI_FIREWALL_WIFI = Uri.parse("content://"
+ AUTHORITY + "/wifi");
private MyContentObserver myContentObserver;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button button1 = (Button) findViewById(R.id.button1);
button1.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
insertData();
}
});
ContentResolver resolver = getContentResolver();
myContentObserver = new MyContentObserver(new Handler());
// notifyForDescendents: 为false时,表示精确匹配,为true时,表示可以同时匹配其派生的URI
resolver.registerContentObserver(CONTENT_URI_FIREWALL_MOBILE, false,
myContentObserver);
}
private class MyContentObserver extends ContentObserver {
public MyContentObserver(Handler handler) {
super(handler);
}
@Override
public void onChange(boolean selfChange) {
super.onChange(selfChange);
System.out.println("数据库发生了变化");
}
}
private void insertData() {
ContentValues values = new ContentValues();
values.put("pkg_name", "cn.hehe");
values.put("uid", 10013);
try {
Uri insertUri = getContentResolver().insert(
CONTENT_URI_FIREWALL_MOBILE, values);
long rowId = ContentUris.parseId(insertUri);
if (rowId > 0) {
System.out.println("插入成功");
}
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
protected void onDestroy() {
super.onDestroy();
getContentResolver().unregisterContentObserver(myContentObserver);
}
}
Manifest中需要添加权限,注意是uses-permission:
<uses-permission android:name="com.example.contentproviderdemo.provider.FirewallManagerProvider" />
provider节点下exported属性的说明:
这个属性用于指示该provider算法能被其他应用程序调用或进行交互。设置为true,则能够被调用或交互;设置为false时,只有同一个应用程序的组件或者带有相同用户ID的应用程序才能调用。
provider节点下可以声明的权限相关属性有:readPermission、writePermission、permission。
readPermission:使用Content Provider的查询功能所必需的权限,即调用ContentProvider里面的query()方法的权限。
writePermission:使用Content Provider的修改功能所必需的权限,即调用insert()、delete()、update()方法的权限。
permission:客户端读、写Content Provider中数据所必需的权限名称。本属性为一次性设置读和写权限提供了快捷途径。不过,readPermission和writePermission属性优先于本属性。即如果同时设置了readPermission属性和permission权限,则声明readPermission权限的应用才能读取。
SQLiteQueryBuilder中的setProjectionMap,
这里的ProjectionMap必须是一个hashmap,更重要的是:
If a projection map is set it must contain all column names the user may request, even if the key and value are the same
qb.setProjectionMap(sCallsProjectionMap);
这个函数的作用是在qb里设置数据库字段的别名,即用户定义列名->数据库列名,在执行qb.query时可以使用用户定义列名设置projection、selection等。
如果不需要对列名进行映射,可以不调用这个函数。但是如果调用,必须对所有列都进行映射,映射中key和value可以完全相同。
相关文章推荐
- XMl入门介绍及php操作XML
- php-5.3.27安装
- phpwind9.0 顶部和底部版权信息永久性修改
- PHP远程下载图片到本地
- php魔术方法总结
- setPadding()无效的原因分析
- phpstorm10.0.1和webstorm11注册
- laravel5.2、thinkphp5、thinkphp3.2.3性能AB测试
- EditPlus注册码在线生成,强大
- 七牛EVM云主机ftp环境搭建以及注意事项
- 一款不错的PHP在线文件管理系统,PHP WEBFTP
- php 利用远程图片创建新图片完善(jpg,png,gif)
- php 利用远程png图片创建新png图片
- PHP图片合成加水印并生成缩略图
- php写守护进程(Daemon)
- php 利用远程图片创建新图片(jpg,gif,png)
- ThinkPHP中的调试模式
- php getimagesize获取图片信息(.jpg,.gif,.png)
- File 方法中 getParentFile()的用法及作用
- php 利用远程jpg图片创建新jpg图片