ContentProvider使用例子
来源:互联网 发布:软件中间件 编辑:程序博客网 时间:2024/06/07 03:39
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可以完全相同。
- ContentProvider使用例子
- ContentProvider使用例子
- ContentProvider例子
- ContentProvider的一个例子
- ContentProvider数据共享例子
- 自定义ContentProvider例子
- android contentProvider 小例子
- android contentProvider例子
- ContentProvider使用
- 使用ContentProvider
- 使用ContentProvider
- ContentProvider 使用
- ContentProvider使用
- ContentProvider使用
- 使用ContentProvider
- 使用ContentProvider
- 17 一个ContentProvider的例子
- 演示ContentProvider使用--获取通讯录所有联系人号码、email的例子
- Http状态码301和302概念简单区别及企业应用案例
- 《JAVA与模式》之策略模式
- TCP连接后保持连接
- 关于iOS之Runloop
- liunx下的命令 Ctrl+z 和 Ctrl+c 有区别
- ContentProvider使用例子
- C#三种字符串拼接方法性能浅析
- Android Telephony 框架分析
- 轮廓(contour)检测
- open系统调用在内核中的流程分析
- Java读/写文件工具类
- 数据库服务器、业务服务器上出现DW20.exe处理
- 为什么刚买来250G的硬盘插到电脑里只有大约232G?
- AX 数据库日志如何选择正确的表名和字段名?