转载请注明出处: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的更多相关文章

  1. 【翻译】MongoDB指南/CRUD操作(四)

    [原文地址]https://docs.mongodb.com/manual/ CRUD操作(四) 1 查询方案(Query Plans) MongoDB 查询优化程序处理查询并且针对给定可利用的索引选 ...

  2. 【翻译】MongoDB指南/CRUD操作(三)

    [原文地址]https://docs.mongodb.com/manual/ CRUD操作(三) 主要内容: 原子性和事务(Atomicity and Transactions),读隔离.一致性和新近 ...

  3. 【翻译】MongoDB指南/CRUD操作(二)

    [原文地址]https://docs.mongodb.com/manual/ MongoDB CRUD操作(二) 主要内容: 更新文档,删除文档,批量写操作,SQL与MongoDB映射图,读隔离(读关 ...

  4. 【翻译】MongoDB指南/CRUD操作(一)

    [原文地址]https://docs.mongodb.com/manual/ MongoDB CRUD操作(一) 主要内容:CRUD操作简介,插入文档,查询文档. CRUD操作包括创建.读取.更新和删 ...

  5. 【原】无脑操作:express + MySQL 实现CRUD

    基于node.js的web开发框架express简单方便,很多项目中都在使用.这里结合MySQL数据库,实现最简单的CRUD操作. 开发环境: IDE:WebStorm DB:MySQL ------ ...

  6. Hibernate(4)——主键生成策略、CRUD 基础API区别的总结 和 注解的使用

    俗话说,自己写的代码,6个月后也是别人的代码……复习!复习!复习!涉及的知识点总结如下: hibernate的主键生成策略 UUID 配置的补充:hbm2ddl.auto属性用法 注解还是配置文件 h ...

  7. 学习SpringMVC——你们要的REST风格的CRUD来了

    来来来,让一下,客官,您要的REST清蒸CRUD来了,火候刚刚好,不油不腻,请慢用~~~ 如果说前面是准备调料,洗菜,切菜,摆盘,那么今天就来完整的上道菜,主要说的是基于REST风格实现数据的增删改查 ...

  8. Elasticsearch的CRUD:REST与Java API

    CRUD(Create, Retrieve, Update, Delete)是数据库系统的四种基本操作,分别表示创建.查询.更改.删除,俗称"增删改查".Elasticsearch ...

  9. ASP.NET Core Web API Cassandra CRUD 操作

    在本文中,我们将创建一个简单的 Web API 来实现对一个 “todo” 列表的 CRUD 操作,使用 Apache Cassandra 来存储数据,在这里不会创建 UI ,Web API 的测试将 ...

随机推荐

  1. Channel Allocation (poj 1129 dfs)

    Language: Default Channel Allocation Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 12 ...

  2. NFS 配置服务

    NFS 配置服务 北京市海淀区  张俊浩 一.NFS.即网络文件系统(Network File System,NFS).一种使用于分散式文件系统的协议,由升阳公司开发.于1984年向外发布.功能是通过 ...

  3. lintcode 1: Data Stream Median

    Data Stream Median Numbers keep coming, return the median of numbers at every time a new number adde ...

  4. SSL探03

    本文探讨了Openssl的Engine机械.Openssl硬件引擎(Engine)可以使用户比較easy地将自己的硬件增加到openssl中去,替换其提供的软件算法. ENGINE 是 OPENSSL ...

  5. 【iOS7一些总结】9、与列表显示(在):列表显示UITableView

    列表显示,顾名思义它是在一个列表视图的形式显示在屏幕上的数据的内容.于ios在列表视图UITableView达到.这个类在实际应用中频繁,是很easy理解.这里将UITableView的主要使用方法总 ...

  6. Struts2 + uploadify 多文件上传完整的例子!

    首先,我这里使用的是  Jquery  Uploadify3.2版本号  导入相关的CSS  JS    <link rel="stylesheet" type=" ...

  7. 《Swift程序设计语言》中国翻译和学习笔记page23

    ·<The Swift Programming Language>中文翻译及读书笔记,附件中为英文原版教程 因21页之前内容和技术关系不大,不做翻译整理,从第21页開始 · 页 1 本页主 ...

  8. Codeforces Round #107 (Div. 2)---A. Soft Drinking

    Soft Drinking time limit per test 2 seconds memory limit per test 256 megabytes input standard input ...

  9. 定义你自己ViewGroup

    尊重原创:http://blog.csdn.net/yuanzeyao/article/details/40264433 好久都没有写文章了,如今利用周末的时间对一些知识进行总结.便于加深理解,今天我 ...

  10. MyBatis与Spring设置callSettersOnNulls

    项目中集成Mybatis与Spring,使用的是Mybatis3.2.7,以及Spring4.0.5,mybatis-spring-1.2.2;由于项目组成员想要偷懒,将数据从DB中查询出来时须要将字 ...