SettingsProvider之增删改查

转载请注明出处: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之增删改查

时间: 2024-10-26 09:07:26

SettingsProvider之增删改查的相关文章

Python 模拟SQL对文件进行增删改查

1 #!/usr/bin/env python 2 # _*_ coding:UTF-8 _*_ 3 # __auth__: Dalhhin 4 # Python 3.5.2,Pycharm 2016.3.2 5 # 2017/05/15 6 7 import sys,os 8 9 def where(dbfile,where_list): #条件是一个list 10 11 def and_or_where(sub_where_list): 12 '''获取and或同时含有and.or关键字的条

【黑马Android】(04)数据库的创建和sql语句增删改查/LinearLayout展示列表数据/ListView的使用和BaseAdater/内容提供者创建

数据库的创建和sql语句增删改查 1. 加载驱动. 2. 连接数据库. 3. 操作数据库. 创建表: create table person( _id integer primary key, name varchar(20), age integer ); 添加: insert into person(name, age) values('lisi', 19); 删除: delete from person where _id = 1; 修改: update person set name =

ssm框架搭建+easyui增删改查实现

闲来无事,看了看别人的博客文档也跟着敲了敲,特地记录下来,方便以后学习: spring版本:4.0.6 mybatis版本:3.2.5 所有jar包打包下载:http://pan.baidu.com/s/1qLEaU 1.项目目录结构 其中,controller包下存放控制层文件,dao下存放各个model类相关的数据库操作接口,entity下放置各种model类,mappers下放置各个dao对应的映射文件,service服务层就不说了,放置各种service接口,impl是其具体实现类. 2

【Android】Sqlite数据库增删改查

Android系统内置一个Sqlite数据库,如果app需要使用Sqlite数据库数据库存储数据,Android会为此app生成一个.db文件.这个数据库在data/data/<package_name>/databases里面,其中<package_name>为该安卓app的工程包名,这个目录必须root后才能看到.在Windows,单机的应用程序,存储数据,基本放到一个文件里面,正如游戏的存档,基本就是把当前的游戏状态存到一个用户很难找到的文件里面.每次存档读档就是一个从这个存

夺命雷公狗---Thinkphp----12之文章的增删改查(图片上传和关联查询)

我们由于表分析的不够完善,所以我们来加多一个tid的字段,到时候主要目的是为了更好的遍历出文章是属于那个分类下的,表如下所示: 那么下一步我们就开始创建一个ArticleController.class.php的控制器,用来管理文章的增删改查操作,所以我们开始第一步来实现文章的添加,我们先来实现他的增加功能: public function add(){ if(IS_POST){ $data['title'] = I('title'); $data['tid'] = I('tid'); $dat

MyBatis增删改查模板

1. 首先,和Spring整合一下 <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springfra

用基本数据结构修改后的学生信息管理系统(增删改查)

package com.xt.student.system; //创建学生类存放信息 public class Student {//声明变量private String stuNo; private String stuName; private String gender; private int age; private int score; //对变量进行封装 public String getStuNo() {return stuNo;} public void setStuNo(St

第二周作业__增删改查

html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,abbr,acronym,address,big,cite,code,del,dfn,em,img,ins,kbd,q,s,samp,small,strike,strong,sub,sup,tt,var,b,u,i,center,dl,dt,dd,ol,ul,li,fieldset,form,label,legend,table,caption

zookeeper基本命令,增删改查

zookeeper被广泛的使用,由于项目中用到了dubbo框架,所以今天也来简单分享一下zookeeper的简单命令,来查询服务和节点信息,不说了,直接来增删改查命令. -h命令: [zk: localhost:2189(CONNECTED) 35] h ZooKeeper -server host:port cmd args addauth scheme auth close config [-c] [-w] [-s] connect host:port create [-s] [-e] [-