parent
5aa1274c51
commit
0254ddc1cb
@ -0,0 +1,109 @@
|
||||
/**
|
||||
* 功能:本地内容同步操作
|
||||
* @throws NetworkFailureException
|
||||
* @return 无返回值
|
||||
*/
|
||||
private void syncContent() throws NetworkFailureException { //本地内容同步操作
|
||||
int syncType;
|
||||
Cursor c = null; //数据库指针
|
||||
String gid; //GoogleID
|
||||
Node node; //Node包含Sync_Action的不同类型
|
||||
|
||||
mLocalDeleteIdMap.clear(); //HashSet<Long>类型
|
||||
|
||||
if (mCancelled) {
|
||||
return;
|
||||
}
|
||||
|
||||
// for local deleted note
|
||||
try {
|
||||
c = mContentResolver.query(Notes.CONTENT_NOTE_URI, SqlNote.PROJECTION_NOTE,
|
||||
"(type<>? AND parent_id=?)", new String[] {
|
||||
String.valueOf(Notes.TYPE_SYSTEM), String.valueOf(Notes.ID_TRASH_FOLER)
|
||||
}, null);
|
||||
if (c != null) {
|
||||
while (c.moveToNext()) {
|
||||
gid = c.getString(SqlNote.GTASK_ID_COLUMN);
|
||||
node = mGTaskHashMap.get(gid);
|
||||
if (node != null) {
|
||||
mGTaskHashMap.remove(gid);
|
||||
doContentSync(Node.SYNC_ACTION_DEL_REMOTE, node, c);
|
||||
}
|
||||
|
||||
mLocalDeleteIdMap.add(c.getLong(SqlNote.ID_COLUMN));
|
||||
}
|
||||
} else {
|
||||
Log.w(TAG, "failed to query trash folder");
|
||||
}
|
||||
} finally {
|
||||
if (c != null) {
|
||||
c.close();
|
||||
c = null;
|
||||
}
|
||||
}
|
||||
|
||||
// sync folder first
|
||||
syncFolder();
|
||||
|
||||
// for note existing in database
|
||||
try {
|
||||
c = mContentResolver.query(Notes.CONTENT_NOTE_URI, SqlNote.PROJECTION_NOTE,
|
||||
"(type=? AND parent_id<>?)", new String[] {
|
||||
String.valueOf(Notes.TYPE_NOTE), String.valueOf(Notes.ID_TRASH_FOLER)
|
||||
}, NoteColumns.TYPE + " DESC");
|
||||
if (c != null) {
|
||||
while (c.moveToNext()) {
|
||||
gid = c.getString(SqlNote.GTASK_ID_COLUMN);
|
||||
node = mGTaskHashMap.get(gid);
|
||||
if (node != null) {
|
||||
mGTaskHashMap.remove(gid);
|
||||
mGidToNid.put(gid, c.getLong(SqlNote.ID_COLUMN)); //通过hashmap建立联系
|
||||
mNidToGid.put(c.getLong(SqlNote.ID_COLUMN), gid); //通过hashmap建立联系
|
||||
syncType = node.getSyncAction(c);
|
||||
} else {
|
||||
if (c.getString(SqlNote.GTASK_ID_COLUMN).trim().length() == 0) {
|
||||
// local add
|
||||
syncType = Node.SYNC_ACTION_ADD_REMOTE;
|
||||
} else {
|
||||
// remote delete
|
||||
syncType = Node.SYNC_ACTION_DEL_LOCAL;
|
||||
}
|
||||
}
|
||||
doContentSync(syncType, node, c);
|
||||
}
|
||||
} else {
|
||||
Log.w(TAG, "failed to query existing note in database");
|
||||
}
|
||||
|
||||
} finally {
|
||||
if (c != null) {
|
||||
c.close();
|
||||
c = null;
|
||||
}
|
||||
}
|
||||
|
||||
// go through remaining items
|
||||
Iterator<Map.Entry<String, Node>> iter = mGTaskHashMap.entrySet().iterator(); //Iterator迭代器
|
||||
while (iter.hasNext()) {
|
||||
Map.Entry<String, Node> entry = iter.next();
|
||||
node = entry.getValue();
|
||||
doContentSync(Node.SYNC_ACTION_ADD_LOCAL, node, null);
|
||||
}
|
||||
|
||||
// mCancelled can be set by another thread, so we neet to check one by //thread----线程
|
||||
// one
|
||||
// clear local delete table
|
||||
if (!mCancelled) {
|
||||
if (!DataUtils.batchDeleteNotes(mContentResolver, mLocalDeleteIdMap)) {
|
||||
throw new ActionFailureException("failed to batch-delete local deleted notes");
|
||||
}
|
||||
}
|
||||
|
||||
// refresh local sync id
|
||||
if (!mCancelled) {
|
||||
GTaskClient.getInstance().commitUpdate();
|
||||
refreshLocalSyncId();
|
||||
}
|
||||
|
||||
}
|
||||
|
Loading…
Reference in new issue