SettingsProvider该CRUD
转载请注明出处:http://blog.csdn.net/droyon/article/details/35558697
什么时候delete要么update时间。需要清空缓存并重新加载数据。
1、invalidateCache()//得到当前用户的SettingsCache。remove全部。
public SettingsCache cacheForTable(final int callingUser, String tableName) {
if (TABLE_SYSTEM.equals(tableName)) {
return getOrConstructCache(callingUser, sSystemCaches);
}
if (TABLE_SECURE.equals(tableName)) {
return getOrConstructCache(callingUser, sSecureCaches);
}
if (TABLE_GLOBAL.equals(tableName)) {
return sGlobalCache;
}
return null;
}
二、bulkInsert
public int bulkInsert(Uri uri, ContentValues[] values) {
final int callingUser = UserHandle.getCallingUserId();//得到请求用户id
SettingsCache cache = cacheForTable(callingUser, args.table);//得到SettingsCache
int numValues = values.length;
for (int i = 0; i < numValues; i++) {
if (db.insert(args.table, null, values[i]) < 0) return 0;
SettingsCache.populate(cache, values[i]);
if (LOCAL_LOGV) Log.v(TAG, args.table + " <- " + values[i]);
} 得到SettingsCache(getOrConstructCache ----》 getOrEstablishDatabase ----》 establishDbTracking ---》 startAsyncCachePopulation(userHandle);)
1、if (TABLE_SYSTEM.equals(tableName)) {
return getOrConstructCache(callingUser, sSystemCaches);
}
if (TABLE_SECURE.equals(tableName)) {
return getOrConstructCache(callingUser, sSecureCaches);
}
if (TABLE_GLOBAL.equals(tableName)) {
return sGlobalCache;
}
2、private SettingsCache getOrConstructCache(int callingUser, SparseArray<SettingsCache> which) {
getOrEstablishDatabase(callingUser); // ignore return value; we don't need it
return which.get(callingUser);
}
3、private DatabaseHelper getOrEstablishDatabase(int callingUser) {
if (callingUser >= Process.SYSTEM_UID) {
if (USER_CHECK_THROWS) {
throw new IllegalArgumentException("Uid rather than user handle: " + callingUser);
} else {
Slog.wtf(TAG, "establish db for uid rather than user: " + callingUser);
}
} long oldId = Binder.clearCallingIdentity();
try {
DatabaseHelper dbHelper = mOpenHelpers.get(callingUser);
if (null == dbHelper) {
establishDbTracking(callingUser);
dbHelper = mOpenHelpers.get(callingUser);
}
return dbHelper;
} finally {
Binder.restoreCallingIdentity(oldId);
}
}
4、private void startAsyncCachePopulation(int userHandle) {
new CachePrefetchThread(userHandle).start();
}
class CachePrefetchThread extends Thread {
private int mUserHandle; CachePrefetchThread(int userHandle) {
super("populate-settings-caches");
mUserHandle = userHandle;
} @Override
public void run() {
fullyPopulateCaches(mUserHandle);
}
}
5、fullyPopulateCaches
private void fullyPopulateCaches(final int userHandle) {
DatabaseHelper dbHelper = mOpenHelpers.get(userHandle);
// Only populate the globals cache once, for the owning user
if (userHandle == UserHandle.USER_OWNER) {
fullyPopulateCache(dbHelper, TABLE_GLOBAL, sGlobalCache);
}
fullyPopulateCache(dbHelper, TABLE_SECURE, sSecureCaches.get(userHandle));
fullyPopulateCache(dbHelper, TABLE_SYSTEM, sSystemCaches.get(userHandle));
}
得到DatabaseHelper。
DatabaseHelper dbH = getOrEstablishDatabase(
TABLE_GLOBAL.equals(args.table) ? UserHandle.USER_OWNER : callingUser);
插入到数据库,更新数据到SettingsCache。 for (int i = 0; i < numValues; i++) {
if (db.insert(args.table, null, values[i]) < 0) return 0;
SettingsCache.populate(cache, values[i]);
if (LOCAL_LOGV) Log.v(TAG, args.table + " <- " + values[i]);
} 发送通知。
sendNotify(uri, callingUser);
三、Insert
@Override
public Uri insert(Uri url, ContentValues initialValues) {
return insertForUser(url, initialValues, UserHandle.getCallingUserId());
}
insetForUser
1、转换table数据表。
if (name != null) {
if (sSecureGlobalKeys.contains(name) || sSystemGlobalKeys.contains(name)) {
if (!TABLE_GLOBAL.equals(args.table)) {
if (LOCAL_LOGV) Slog.i(TAG, "Rewrite of insert() of now-global key " + name);
}
args.table = TABLE_GLOBAL; // next condition will rewrite the user handle
}
}
2、得到SettingsCache
SettingsCache cache = cacheForTable(desiredUserHandle, args.table);
3、if (SettingsCache.isRedundantSetValue(cache, name, value)) {
return Uri.withAppendedPath(url, name);
}
4、得到DatabaseHelper
DatabaseHelper dbH = getOrEstablishDatabase(desiredUserHandle);
5、inset插入。
final long rowId = db.insert(args.table, null, initialValues);
mutationCount.decrementAndGet();
if (rowId <= 0) return null;
6、SettingsCache.populate(cache, initialValues); // before we notify
7、notify
sendNotify(url, desiredUserHandle);
四、delete
- 得到DatabaseHelper
DatabaseHelper dbH = getOrEstablishDatabase(callingUser); - delete,
int count = db.delete(args.table, args.where, args.args); - invalidateCache删除SettingsCache元素,并发送通知告知变化(invalidateCache -- -》 )
invalidateCache(callingUser, args.table); // before we notify
sendNotify(url, callingUser);
又一次填充SettingsCache缓冲区。
(startAsyncCachePopulation(callingUser); ---》 new CachePrefetchThread(userHandle).start();)
startAsyncCachePopulation(callingUser);
五、update
- 得到DatabaseHelper
DatabaseHelper dbH = getOrEstablishDatabase(callingUser)。 - 运行update
int count = db.update(args.table, initialValues, args.where, args.args); - invalidateCache删除SettingsCache元素。发通知更新。
invalidateCache(callingUser, args.table); // before we notify
sendNotify(url, callingUser);
又一次填充SettingsCache缓冲区。
startAsyncCachePopulation(callingUser);
六、query ---》 queryForUser
- 构建查询条件
SQLiteQueryBuilder qb = new SQLiteQueryBuilder();
qb.setTables(args.table); - 开启查询
Cursor ret = qb.query(db, select, args.where, args.args, null, null, sort); - 设置监听并通知。
AbstractCursor c = (AbstractCursor) ret;
c.setNotificationUri(getContext().getContentResolver(), url, forUser);
版权声明:本文博客原创文章。博客,未经同意,不得转载。
SettingsProvider该CRUD的更多相关文章
- 【翻译】MongoDB指南/CRUD操作(四)
[原文地址]https://docs.mongodb.com/manual/ CRUD操作(四) 1 查询方案(Query Plans) MongoDB 查询优化程序处理查询并且针对给定可利用的索引选 ...
- 【翻译】MongoDB指南/CRUD操作(三)
[原文地址]https://docs.mongodb.com/manual/ CRUD操作(三) 主要内容: 原子性和事务(Atomicity and Transactions),读隔离.一致性和新近 ...
- 【翻译】MongoDB指南/CRUD操作(二)
[原文地址]https://docs.mongodb.com/manual/ MongoDB CRUD操作(二) 主要内容: 更新文档,删除文档,批量写操作,SQL与MongoDB映射图,读隔离(读关 ...
- 【翻译】MongoDB指南/CRUD操作(一)
[原文地址]https://docs.mongodb.com/manual/ MongoDB CRUD操作(一) 主要内容:CRUD操作简介,插入文档,查询文档. CRUD操作包括创建.读取.更新和删 ...
- 【原】无脑操作:express + MySQL 实现CRUD
基于node.js的web开发框架express简单方便,很多项目中都在使用.这里结合MySQL数据库,实现最简单的CRUD操作. 开发环境: IDE:WebStorm DB:MySQL ------ ...
- Hibernate(4)——主键生成策略、CRUD 基础API区别的总结 和 注解的使用
俗话说,自己写的代码,6个月后也是别人的代码……复习!复习!复习!涉及的知识点总结如下: hibernate的主键生成策略 UUID 配置的补充:hbm2ddl.auto属性用法 注解还是配置文件 h ...
- 学习SpringMVC——你们要的REST风格的CRUD来了
来来来,让一下,客官,您要的REST清蒸CRUD来了,火候刚刚好,不油不腻,请慢用~~~ 如果说前面是准备调料,洗菜,切菜,摆盘,那么今天就来完整的上道菜,主要说的是基于REST风格实现数据的增删改查 ...
- Elasticsearch的CRUD:REST与Java API
CRUD(Create, Retrieve, Update, Delete)是数据库系统的四种基本操作,分别表示创建.查询.更改.删除,俗称"增删改查".Elasticsearch ...
- ASP.NET Core Web API Cassandra CRUD 操作
在本文中,我们将创建一个简单的 Web API 来实现对一个 “todo” 列表的 CRUD 操作,使用 Apache Cassandra 来存储数据,在这里不会创建 UI ,Web API 的测试将 ...
随机推荐
- Cocos2d-x场景功能描述的生命周期
层(Layer)的生命周期函数有例如以下: init().初始化层调用. onEnter().进入层时候调用. onEnterTransitionDidFinish(). 进入层并且过渡动画结束时候调 ...
- 集差集 哈希表 比较数据库的照片和server画面上,将server垃圾上的图片删除
SSH 骨架code: public String deleRubbishAd(){ int deleADcount = 0; rubbishADtp = configDao.rubbishADtp( ...
- 【工具】JAVA 在单元读取文件并比较
package test20140709; import java.io.BufferedReader; import java.io.File; import java.io.FileReader; ...
- 在AcGIS随着大数据的生成DEM
在ArcGIS产生DEM时间.数据来源是经常有的高程点.轮廓线,该高程点.等高线密集,可能有几千万.甚至亿高程点.轮廓线. 如果您使用这些矢量数据生成TIN.不能实现的,由于生成TIN时,支持的最大结 ...
- MyReport报表引擎2.0.0.0新功能
Web报表引擎:Web上的良好的打印解决方式,WinForm的打印预览体现,报表自己主动化,支持直接打印,页小计,统计,转成金额大写,一维码显示等功能,满足中国式报表的常见功能需求.Web报表编辑器: ...
- 微软系统工具套件SysinternalsSuite各个工具功能说明
下载地址:http://download.sysinternals.com/files/SysinternalsSuite.zip 工具名 工具说明 Accesschk Windows ...
- JAVA运行程序代码段
我记得那时候刚毕业.学习JAVA恐惧是这里,它是关于JAVA称号.我总是不正确.如今,这最后审查.看了好半天.得赶紧把刚才学习到的那点东西记下来. 一.关于static的代码段运行顺序 运行结果例如以 ...
- javascript中间preventDefault与stopPropagation角色介绍
preventDefault的作用是什么方法,它? 我们知道,例如,<a href="http://www.baidu.com">百度</a>,这是html ...
- RDIFramework.NET ━ .NET高速信息系统开发框架钜献 V2.9 版本震撼发布
RDIFramework.NET ━ .NET高速信息化系统开发框架钜献 V2.9 版本号震撼公布 全新体验.全新感觉.2015钜献! 继上个版本号"RDIFramework.NET V2 ...
- Java Web项目结构
Java Web项目结构(一般) 1.Java src 2.JRE System Library 3.Java EE 6 Libraries 4.Web App Libraries 5.WebRoot ...