安卓四大组件之ContentProvider

ContentProvider 是如何实现数据共享

  • 把自己数据库的数据提供给第三方应用,我们就通过ContentProvider来实现
  • 自定义一个类继承ContentProvider, 然后覆写query, insert, update, delete等方法。
  • 因为是四大组件之一,所以必须在AndroidManifest文件中进行注册

  • 三方通过ContentResolver来访问Provider

ContentProvider与sql相比有什么优势

  • ContentProvider只需要关心数据的uri,屏蔽了存储的细节
  • ContentProvider可以实现不同app之间的数据共享
  • ContentProvider不仅有增删改查和查询本应用下的数据库,还能增删改查本地文件,xml文件等

ContentProvider、ContentResolver、ContentObserver 之间的关系

  • ContentProvider 内容提供者,用于对外提供数据
  • ContentResolver 内容解析者,用于获取内容提供者提供的数据
    • ContentResolver.notifyChange(uri) 当数据库数据改变时,发送通知
    • ContentResolver.registerContentObserver() 监听消息。
  • ContentObserver 内容监听器,可以监听数据的改变状态

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

//1. 获取到assert 目录下的db 文件
AssetManager assetManager = getAssets();
InputStream is = assetManager.open("myuser.db");
   
//将文件拷贝到 /data/data/com.itheima.android.asserts.sqlite/databases/myuser.db
//如果databases 目录不存在则创建
File file = new File("/data/data/com.wata.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();

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

不要关联多表查询,减少链接时间,创建索引、将查询到的数据采用缓存策略等等

你可能感兴趣的:(安卓四大组件之ContentProvider)