From b873c5a6656a08588d12e1b91b8bfb0eaff6b3bc Mon Sep 17 00:00:00 2001 From: bingdawan <3598407655@qq.com> Date: Sun, 31 Mar 2024 15:09:35 +0800 Subject: [PATCH] part5 --- GTaskManager.java part5.txt | 144 +++++++++++++++++++++++++++++++++++ class GTaskManager.java.docx | Bin 0 -> 11404 bytes 2 files changed, 144 insertions(+) create mode 100644 GTaskManager.java part5.txt create mode 100644 class GTaskManager.java.docx diff --git a/GTaskManager.java part5.txt b/GTaskManager.java part5.txt new file mode 100644 index 0000000..09cf527 --- /dev/null +++ b/GTaskManager.java part5.txt @@ -0,0 +1,144 @@ + /** + * 功能:更新远端的Node,包含meta更新(updateRemoteMeta) + * @author TTS + * @param node + * ----同步操作的基础数据类型 + * @param c + * --Cursor + * @throws NetworkFailureException + */ + private void updateRemoteNode(Node node, Cursor c) throws NetworkFailureException { + if (mCancelled) { + return; + } + + SqlNote sqlNote = new SqlNote(mContext, c); + + // update remotely + node.setContentByLocalJSON(sqlNote.getContent()); + GTaskClient.getInstance().addUpdateNode(node); //GTaskClient用途为从本地登陆远端服务器 + + // update meta + updateRemoteMeta(node.getGid(), sqlNote); + + // move task if necessary + if (sqlNote.isNoteType()) { + Task task = (Task) node; + TaskList preParentList = task.getParent(); + //preParentList为通过node获取的父节点列表 + + String curParentGid = mNidToGid.get(sqlNote.getParentId()); + //curParentGid为通过光标在数据库中找到sqlNote的mParentId,再通过mNidToGid由long类型转为String类型的Gid + + if (curParentGid == null) { + Log.e(TAG, "cannot find task's parent tasklist"); + throw new ActionFailureException("cannot update remote task"); + } + TaskList curParentList = mGTaskListHashMap.get(curParentGid); + //通过HashMap找到对应Gid的TaskList + + if (preParentList != curParentList) { //????????????? + preParentList.removeChildTask(task); + curParentList.addChildTask(task); + GTaskClient.getInstance().moveTask(task, preParentList, curParentList); + } + } + + // clear local modified flag + sqlNote.resetLocalModified(); + //commit到本地数据库 + sqlNote.commit(true); + } + + /** + * 功能:升级远程meta。 meta---元数据----计算机文件系统管理数据---管理数据的数据。 + * @author TTS + * @param gid + * ---GoogleID为String类型 + * @param sqlNote + * ---同步前的数据库操作,故使用类SqlNote + * @throws NetworkFailureException + */ + private void updateRemoteMeta(String gid, SqlNote sqlNote) throws NetworkFailureException { + if (sqlNote != null && sqlNote.isNoteType()) { + MetaData metaData = mMetaHashMap.get(gid); + if (metaData != null) { + metaData.setMeta(gid, sqlNote.getContent()); + GTaskClient.getInstance().addUpdateNode(metaData); + } else { + metaData = new MetaData(); + metaData.setMeta(gid, sqlNote.getContent()); + mMetaList.addChildTask(metaData); + mMetaHashMap.put(gid, metaData); + GTaskClient.getInstance().createTask(metaData); + } + } + } + + /** + * 功能:刷新本地,给sync的ID对应上最后更改过的对象 + * @author TTS + * @return void + * @throws NetworkFailureException + */ + private void refreshLocalSyncId() throws NetworkFailureException { + if (mCancelled) { + return; + } + + // get the latest gtask list //获取最近的(最晚的)gtask list + mGTaskHashMap.clear(); + mGTaskListHashMap.clear(); + mMetaHashMap.clear(); + initGTaskList(); + + Cursor c = null; + 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) + }, NoteColumns.TYPE + " DESC"); //query语句:五个参数,NoteColumns.TYPE + " DESC"-----为按类型递减顺序返回查询结果。new String[] {String.valueOf(Notes.TYPE_SYSTEM), String.valueOf(Notes.ID_TRASH_FOLER)}------为选择参数。"(type<>? AND parent_id<>?)"-------指明返回行过滤器。SqlNote.PROJECTION_NOTE--------应返回的数据列的名字。Notes.CONTENT_NOTE_URI--------contentProvider包含所有数据集所对应的uri + if (c != null) { + while (c.moveToNext()) { + String gid = c.getString(SqlNote.GTASK_ID_COLUMN); + Node node = mGTaskHashMap.get(gid); + if (node != null) { + mGTaskHashMap.remove(gid); + ContentValues values = new ContentValues(); //在ContentValues中创建键值对。准备通过contentResolver写入数据 + values.put(NoteColumns.SYNC_ID, node.getLastModified()); + mContentResolver.update(ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI, //进行批量更改,选择参数为NULL,应该可以用insert替换,参数分别为表名和需要更新的value对象。 + c.getLong(SqlNote.ID_COLUMN)), values, null, null); + } else { + Log.e(TAG, "something is missed"); + throw new ActionFailureException( + "some local items don't have gid after sync"); + } + } + } else { + Log.w(TAG, "failed to query local note to refresh sync id"); + } + } finally { + if (c != null) { + c.close(); + c = null; + } + } + } + + /** + * 功能:获取同步账号,mAccount.name + * @author TTS + * @return String + */ + public String getSyncAccount() { + return GTaskClient.getInstance().getSyncAccount().name; + } + + /** + * 功能:取消同步,置mCancelled为true + * @author TTS + */ + public void cancelSync() { + mCancelled = true; + } +} diff --git a/class GTaskManager.java.docx b/class GTaskManager.java.docx new file mode 100644 index 0000000000000000000000000000000000000000..5e045a0343dbdf9a65316fd0ea9f6eed97b727b8 GIT binary patch literal 11404 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 literal 0 HcmV?d00001