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