您的位置:首页 > 编程语言 > PHP开发

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可以完全相同。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: