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

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

上一篇:【简单易用的傻瓜式图标设计工具】Logoist 3.1 for Mac


下一篇:Nginx 教程(1):基本概念