首页 > 代码库 > SettingsProvider之增删改查

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);