zoukankan      html  css  js  c++  java
  • 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);



    版权声明:本文博客原创文章。博客,未经同意,不得转载。

  • 相关阅读:
    CSS 3中细线边框如何实现?
    【SPL标准库专题(1)】 SPL简介
    【PSR规范专题(5)】PSR-4 改进后的自动加载规范
    【PSR规范专题(4)】PSR-3 日志接口规范
    【PSR规范专题(3)】PSR-2 代码风格规范
    【PSR规范专题(2)】PSR-1 基本代码规范
    YII框架的依赖注入容器与服务定位器简述
    PHP 反射机制Reflection
    【Apache运维基础(5)】Apache的Rewrite攻略(2)
    【Apache运维基础(4)】Apache的Rewrite攻略(1)
  • 原文地址:https://www.cnblogs.com/zfyouxi/p/4642729.html
Copyright © 2011-2022 走看看