四大组件之ContentProvider(内容观察者)&数据库

来源:互联网 发布:abbplc编程软件序列号 编辑:程序博客网 时间:2024/06/13 10:13

ContentProvider 如何实现数据共享

  • Android 中如果想将自己应用的数据(一般多为数据库中的数据)提供给第三发 app,那么我们只能通过 ContentProvider 来实现

  • ContentProvider 是应用程序之间共享数据的接口. 使用的时候首先自定义一个类继承 ContentProvider,然后覆写 queryinsertupdatedelete 等方法. 最后别忘了作为 android 四大组件之一必须在 AndroidManifest 文件中进行注册

<provider  android:exported="true"    android:name="cc.catface.contenProvider.provider.PersonContentPro vider"    android:authorities="cc.catface.person" />
  • 第三方 app 可以通过 ContentResolver 类来访问该 Provider

为什么要用 ContentProvider? 它和 sql 的实现上有什么差别?

  • ContentProvider 屏蔽了数据存储的细节,内部实现对用户完全透明,用户只需要关心操作数据的 uri 就可以了,ContentProvider 可以实现不同 app 之间共享

  • Sql 也有增删改查的方法,但是 sql 只能查询本应用下的数据库. 而 ContentProvider 还可以去增删改查本地 .xml 文件的读取等

ContentProvider、ContentResolver、ContentObserver 之间的关系

  • ContentProvider:内容提供者,用于对外提供数据

    • ContentResolver.notifyChange(uri):发出消息
  • ContentResolver:内容解析者,用于获取内容提供者提供的数据

  • ContentObserver:内容监听器,可以监听数据的改变状态

    • ContentResolver.registerContentObserver():监听消息

如何访问 asserts 资源目录下的数据库?

// 获取到 assert 目录下的 db 文件AssetManager assetManager = getAssets(); InputStream is = assetManager.open("myuser.db"); // 将文件拷贝到 /data/data/cc.catface.android.asserts.sqlite/databases/myuser.db // 如果 databases 目录不存在则创建File file = new File("/data/data/cc.catface.android.asserts.sqlite/databases"); if (!file.exists()) {    file.mkdirs();}FileOutputStream fos = new FileOutputStream(new File(file, "myuser.db")); byte[] buff = new byte[1024 * 8];int len = -1;while((len = is.read(buff)) != -1){    fos.write(buff, 0, len);}fos.close();is.close();

// 访问数据库SQLiteDatabase database = openOrCreateDatabase("myuser.db", MODE_PRIVATE, null);String sql = "select c_name from t_user"; Cursor cursor = database.rawQuery(sql, null); while(cursor.moveToNext()){    String string = cursor.getString(0);    Log.d("tag", string); }cursor.close();database.close();

如何在高并发下进行数据库查询

(回答广泛,可自由发挥) 比如:不要关联多表查询,减少链接时间,创建索引、将查询到的数据采用缓存策略等等

1 0