You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
110 lines
4.2 KiB
110 lines
4.2 KiB
8 months ago
|
/**
|
||
|
* 功能:本地内容同步操作
|
||
|
* @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();
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|