From 248da00e4a3690e4900b8b9a459cc0440dd582e8 Mon Sep 17 00:00:00 2001 From: Conquer_CN <2832035049@qq.com> Date: Thu, 13 Apr 2023 20:37:51 +0800 Subject: [PATCH 1/4] =?UTF-8?q?=E7=B2=BE=E8=AF=BB=E6=8A=A5=E5=91=8A?= =?UTF-8?q?=E9=83=A8=E5=88=86=E6=8F=90=E4=BA=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- doc/精读报告/gtask/data/MetaData.doc | 118 +++++++++++++++++++++++ 1 file changed, 118 insertions(+) create mode 100644 doc/精读报告/gtask/data/MetaData.doc diff --git a/doc/精读报告/gtask/data/MetaData.doc b/doc/精读报告/gtask/data/MetaData.doc new file mode 100644 index 0000000..f876671 --- /dev/null +++ b/doc/精读报告/gtask/data/MetaData.doc @@ -0,0 +1,118 @@ +/* + * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package net.micode.notes.gtask.data; + +import android.database.Cursor; +import android.util.Log; + +import net.micode.notes.tool.GTaskStringUtils; + +import org.json.JSONException; +import org.json.JSONObject; + + +public class MetaData extends Task { + /* + * 功能描述:得到类的简写名称存入字符串TAG中 + * 实现过程:调用getSimpleName ()函数 + */ + private final static String TAG = MetaData.class.getSimpleName(); + private String mRelatedGid = null; + /* + * 功能描述:设置数据,即生成元数据库 + * 实现过程:调用JSONObject库函数put (),Task类中的setNotes ()和setName ()函数 + */ + public void setMeta(String gid, JSONObject metaInfo) { + //对函数块进行注释 + try { + metaIwnfo.put(GTaskStringUtils.META_HEAD_GTASK_ID, gid); + /* + * 将这对键值放入metaInfo这个jsonobject对象中 + */ + } catch (JSONException e) { + Log.e(TAG, "failed to put related gid"); + /* + * 输出错误信息 + */ + } + setNotes(metaInfo.toString()); + setName(GTaskStringUtils.META_NOTE_NAME); + } + /* + * 功能描述:获取相关联的Gid + */ + public String getRelatedGid() { + return mRelatedGid; + } + /* + * 功能描述:判断当前数据是否为空,若为空则返回真即值得保存 + */ + @Override + public boolean isWorthSaving() { + return getNotes() != null; + } + /* + * 功能描述:使用远程json数据对象设置元数据内容 + * 实现过程:调用父类Task中的setContentByRemoteJSON ()函数 + */ + @Override + public void setContentByRemoteJSON(JSONObject js) { + super.setContentByRemoteJSON(js); + if (getNotes() != null) { + try { + JSONObject metaInfo = new JSONObject(getNotes().trim()); + mRelatedGid = metaInfo.getString(GTaskStringUtils.META_HEAD_GTASK_ID); + } catch (JSONException e) { + Log.w(TAG, "failed to get related gid"); + /* + * 输出警告信息 + */ + mRelatedGid = null; + } + } + } + /* + * 功能描述:使用本地json数据对象设置元数据内容,一般不会用到,若用到,则抛出异常 + */ + @Override + public void setContentByLocalJSON(JSONObject js) { + // this function should not be called + throw new IllegalAccessError("MetaData:setContentByLocalJSON should not be called"); + /* + * 传递非法参数异常 + */ + } + /* + * 功能描述:从元数据内容中获取本地json对象,一般不会用到,若用到,则抛出异常 + */ + @Override + public JSONObject getLocalJSONFromContent() { + throw new IllegalAccessError("MetaData:getLocalJSONFromContent should not be called"); + /* + * 传递非法参数异常 + */ + } + + @Override + public int getSyncAction(Cursor c) { + throw new IllegalAccessError("MetaData:getSyncAction should not be called"); + /* + * 传递非法参数异常 + */ + } + +} From 1ca8bfa8603e0797c8f78beece540b41498657bb Mon Sep 17 00:00:00 2001 From: Conquer_CN <2832035049@qq.com> Date: Thu, 13 Apr 2023 22:22:35 +0800 Subject: [PATCH 2/4] =?UTF-8?q?4/13=20=E7=B2=BE=E8=AF=BB=E6=8A=A5=E5=91=8A?= =?UTF-8?q?=E6=8F=90=E4=BA=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- doc/精读报告/data/Contact.doc | Bin 0 -> 28672 bytes doc/精读报告/data/Notes.doc | Bin 0 -> 40960 bytes doc/精读报告/data/NotesDatabaseHelper.doc | Bin 0 -> 58368 bytes doc/精读报告/data/NotesProvider.doc | Bin 0 -> 52224 bytes doc/精读报告/gtask/data/Node.doc | 104 ++++ doc/精读报告/gtask/data/SqlData.doc | 218 +++++++ doc/精读报告/gtask/data/SqlNote.doc | 566 ++++++++++++++++++ doc/精读报告/gtask/data/Task.doc | 351 +++++++++++ doc/精读报告/gtask/data/TaskList.doc | 401 +++++++++++++ 9 files changed, 1640 insertions(+) create mode 100644 doc/精读报告/data/Contact.doc create mode 100644 doc/精读报告/data/Notes.doc create mode 100644 doc/精读报告/data/NotesDatabaseHelper.doc create mode 100644 doc/精读报告/data/NotesProvider.doc create mode 100644 doc/精读报告/gtask/data/Node.doc create mode 100644 doc/精读报告/gtask/data/SqlData.doc create mode 100644 doc/精读报告/gtask/data/SqlNote.doc create mode 100644 doc/精读报告/gtask/data/Task.doc create mode 100644 doc/精读报告/gtask/data/TaskList.doc diff --git a/doc/精读报告/data/Contact.doc b/doc/精读报告/data/Contact.doc new file mode 100644 index 0000000000000000000000000000000000000000..fc86dec7b4d2e5b02e96b40e1938e4c80c816a62 GIT binary patch literal 28672 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%0D<-bmoZ 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 literal 0 HcmV?d00001 diff --git a/doc/精读报告/data/NotesProvider.doc b/doc/精读报告/data/NotesProvider.doc new file mode 100644 index 0000000000000000000000000000000000000000..921721eeeeb9a676f124b5c23f98fb362305a524 GIT binary patch literal 52224 zcmeHw30zcF`~P7P(NHm!6u0Y$Iw}sMx!?{W3M%`ehKd6Wiw*-018S}%87?WB<&v4X z6j_;Nn%QPqnkl)ITbgV3W?A~0W?C`-?{n`QXNN(p{Qcj#e7>A}&wieB&U2pgoMjH| zuYcynH~r5ttEV6HU=@a1%*)K)4eu)c?aNp?-pQ`QU@(yNSOBlC=l>7|F0KEVg|k|o zj9rQUh$@jW)GQuv##ZYXtIN{HrHxZErD$pS&(qtFb(zUn{J7dVgr_@Ox?6u44E1hX zIeOZugo-h5j|2R(94HLOM7Mj+|R*1!_43IhZxhLSr2MNp{q7q z`APn)%_P{n!)dtD-B~lR31eFk@LW^IdKtqvr*3BTa60gGt(+ORcVzPX@NhgnZu0VT zcltho4?XBZMRF7`x3`YR`kUxu{_t?-cFw%>a8<>}{W%k-Gk$n{oKC#G&3v@1VFT^) z+cn1Rxqoi*G(tfKYNB&NSL$Wd{^;TUnl-EZTXMbo|2!QY6R$7IhX6~SpQ=nA-jV4j zJa3QObQGT3^LY5TBa{2HHm&Jw?ase>yu2Q*&8pn3{oku^USB+)&YC>G)ioW(PrNzJ zhq3$y;8$q%HQ0mrU(3@IBZ%v{-zkuy0!4;Ouj*Y# zsFRbMpQqCcDs6@?FDFBx%FkCMs8zc3>?oBM0d>8teWd4U^=hqN5hj_jy1b&CjH>-5 z>2eCHiYr;ADO5Z56)7g{FcPE?rP8No+sO+RHceHaR)iJm3i52rblbgPf+k0=RwTp? zgE7z;$|gl3CQ`Gp*Q+P#6^Zzlq|edVmZK21ieY(KW@NXimiXI|+Bi`r713hlQO?5h zG=;fZQz{Ppvpl9}YF5A$EZX=U22;ZdSuWGUzBjAGa`2uHTOIrguvNoUz%B=KfILV~ zYJ6#pp(&;e%oFs0Db4~m&}f$ivj8C?01aYQBUS}VWT9*T8wOdF(hI_0ujmmeWwG-U z-a`WuyPGNF|RIA;*+k9i!Nai{4cq)=0i5puA*1nfV(oWSyHQ+2)88AbUOR52dT) zB>O_-TPmX(_SZ5usU>@gTLTb9{S88V#>c*^ONsq=={fn6a> zLpY+Q0BA%C72uuMNP$iM1;jJSSh@_*Q(%>sS71{>*IFWF1(t*o<*+ERM$%a};?gmB z;ezO%2~mqAw>pSX`pXyn7KwhP5)3Z;r>Zg^8lqt<9t28OCF83&{fuJSP(|)NW8b5rG)2ggoUGHI?C4hFJ zsJ}3@LVM*SI(EB9WiwAJl_j9v48~tL-V(*MDXs1{WwUG()cbipITvUee`}1rKKq;6 z$KWwvUTDuvZnu{cpN~OHjuLB}Xwsf#m-L!kN8~7fL?^{ueyTXNxajMJr;^93Zb4)ys@|Yd>L+SD9KWOI1)sC(@p9*lk z4E#wwS#HKJ6re;B>L&tppHF80D z5z|hMj!6tpjZ6%WY7e=?_~aS|C50*@BPl*oE=d)kNr@3L@sWum0|glg8?rzFj;RAf z6GN*VHmJ2(=;|k5Ac~;IC=$X$Db+9OgRZ`O+f>Wggb?6|~P6uI9J7s7)L8s2wsS6-z7YO=nwa{*q zww;iktAmr4-~9GjTWqf%#n@uphJHvfGncH z=oDziF9g;Bt`p%(|8wB3!J9N{=Hjg#8--Tg4sR-$8KSRj_#-KZSmJUB#o&F;7XSK zGZy_Zh7AG#3`4Js#Cx<^9L`HS2}TM?azpjfllU8#bS&j<1@bfyMMq^RiB$mqoI=)~0U5sC4kV(+GA8YsKX z9q^SH9~mW&504!d8Wt{>!JRmSamJxYh>nbn4Nnw9Nv$=oUAy+}h0p|nyxQ-4#9bB3C1fjbgGG}G>uvz@tRchwnB}bJUUg7$gr4bdj)AnB#>sRiqNpcNcc*Q z3?EMMwsS6Gsdl8WHu;u`@k{)gW}5V-Kvu*WO&l2;Zk-T%A@zP^Yk&+){Ze5iWu&67 z#9(%o1b@-!QIYsh(j)y(MQfGhJoAy()E6y#Ml{04;xAkbY1uR55Pvv&=SZ^_UwMD5 ztPeVu5|{KTCp7ycoMxdgH%WY{C_!ah#JrzUT!Td4QD!ll=DU*YMAWpEHzXb) zu;Gv+h%z)sFy&2>Bdobc0&2xXW6nnelrEAD6=Ue{kf%`Gp$Jd>r>b;f;gfPCwE=UU z)ra-72~Ao7@{zQK+@>C@D z0-6=lIAzM4)T&K0ZJL4qm{2QAKAgs;F!UVauQcw-Apv)aj!JvAqm_wm!TA-QPeg?X_n7hA2%&ivK)J=(#uGii%6s>%_p?t zNG=!ogdQd4Iu@b?mD#@hN_5dfve1b+C&_`dE#~}Unn-06m8z}<($Y|jIZQsBbSY1d z=@fl4WyzT0qNo_{3{y;&R16byQGk4t^kLHa@Oh0Oy61@Uu{n21VWZ)nxKSP(hrFkw zJd#8b2zzs%B=JaEAjf{B*lhiUBK|Cdx0JqkJxZo^T9Q^S1|cPxsy*^E#jMTp(3T}n zhcB8pYEfR2=gjMZhmcx3>EA9V{4r0Wv5BtSR|1PeAC{y&YmJS7Jf#^^vTTJ4V+)E0 zt!NIV5;b6Ia0p3r$hCyjrtIa-k_yyMoh=W|_by~jPm|h?ZFver8CNfkiUQiS?c7U} zM`_fQ8(Rytd;3)9bM2cc3!){BC8ggd*2iFKwUnFRp~);RQf2*8WSb*S>2%PB+KjE{ zsF$7k=ApQmZln;^h{DwJ<%yvKhJ`C=78oex>+;5_)Ac!d+CWSVG&ZlHx~zggL0hQN z82{gv3Hi*Co6w@`V|38_n@yRxTbfR-8gH6xl65+i@8W#x_H4A5P1HFVLSLa!m!rs1 z>tj{=>;!dIF3o@B?a4;o*-lF72$7Mdm{6$JO?FsNbI~<&AjwC4Nk+@bu*m^0Kt~~8 zr7KV;a0@+$m9LhHXm^JB1^U_d_jGKEz4AZLaT4E!q~;Y{^4$f7YU; zO0cBJ?RIaeXR!1{%`PWXkl$`TLaV-FClsbmHS4n6w!JW=j?>GIoI5x&Isd8??VWg7 zQ(W{3)?(aKgU2}LQr0o)!6#|dq}e^!=tYWSjv8YCtsF?B9<4X2;X@A@ZjvZvvZ|I3}XZ77$m)$q>rHSI|tf@$*`AX0X?KXK7!JSZaX&Hw>6E}l3v5Uj37gd zk}Oa96QT%dK1fGGD>o)7MCM?$<7MHdwY0?Ttxd~OlFGzq|CTOQNdngK678HH8);;w z6u7R_a@J?5&vrD9TIYa&^PEVdIhQJ8QBI<70!o~9yImEC5~>0;&tZ?kg=7l>a}`=$ zscyQwUr6$CW$DoxBdzzb=nm25R4*k-tJ=dZ#Rn1yh$~--gQc75nnWxKD>E*IEZQ2yHX(J=K!7N+0X;Qkz5g&>vkuY)+mJ(8p>Nc*b zmXz0aiA-_Oqg78dW+R1WHB$h`ykVNtJc-t>sozQ3WI5*hG_&Abp4z@NH@4;P(rR{f z``|F}^(@G;)RU!kTjJ3&*pX&Lij(xtrg5Z~=q~YMT0d97U!KM6&G8(Ta~y6;JeYsk zH`6et5YHWNcMikD(7Y`Zz9h|iWwJc){m-S{igRuhzBi+<47^*5QqUMW5&tJ-!Ru(hSs#-xhYK>Z}9-1erXNrmTB2e3sX5>krIN?UbYTkO>u3F1MdroNNkaA%fCoHuZQi-KC6QT|6 zSFxwjuq<&hXh!>dsN4cdZThmV1K#f5nYA?aa>DYs;-bGt8!%j~IpPzvAI5oYfClv@ zt;3Kefx<`L)(9xYT9l+ewT(TkGI5Hj5ym{6J-x%=v;)Xz*i=uGsI^6FSy#8b64 zZEMIfKN6=4MNVi;q@Lh(UTh_eO64?cPgG<;l`^coeD8sIycW=x_>2$rL^*U7b&QF}W;BJ6@YN zQA^q?aXAwjDYHaPVsB6oEsEx3P8Jv1MT)?y^D}d&r|@^>(YmEcJxywF)b=N1{LBVF zr8cEz#Q%v;nZ^;)`&*BkH&ayei^epJrhSq77NspME_x#F-4xT<#na?{%d&OTd`wy8 zeC+PWcD`fPwv^S;Hkc?uGK4e^(^?mw=Z8Z2q&=UsFM^LRmivTgWz~E&)x_7N`Le`g zrL{g9og}G*bKS}$E?bIAwHpl{A<0do{~!sGbjp0>0Jn*Sft-w058VQ%u1Xhu}Kh{mTYtEu&gLPZRyD5KNx@Z~sh@A3Q zskoEfxX)6ZMLQ5-1K3XQZOeVWo@Zo#>#d5NhO?X8TN4H-D4(-LR}gaPA$ zg}@fzYv2a(P%WH-1jYc;nz}{V*^N05;M9Sr>kQ*}wtdD)1YShU24O0*8Q0KoL%=9ss@vTGU7S0DBO@ zfgwOP@DxxEbjInVY+xm@23QBY1~kLbySIT)fdhayPC33rCqHrOEf9Df_zI|tQ+b)d zF5oL5wlQb`MB}vP0^lX!7Qp;*k`M60>CM_eTVNcp1b7Mf8elllmki7V<^!d`Yrr?a zisp>{`42o^e%U9p8=`Tbe($FKovC|!^?nOvxc#_3(0FcB122E$2PK2k-dPz`{j9m8 zKFIrDWqr@Q-|;?Y-rp+gYky-2T~SxofUN4D_#WqZoZp%AI%_^hJkAk+Bi>dSU;75U z&8G#%1;ABF{}K(X>Yv7&mjJ38hI--kQ-=4GfO|`fb-)tf3jksV3js2KDZq0;8So|0 zycJ`Ufl{Chcop!HG1dVH1ysNipbR(<^ly#!0u%ttfHL4H&3f zPkoH{ud4c1RsG7kPuc5Fyf3-x|Nf|dXZRZDY4-RT=Vj)6jCfcxpa>`dz5;#(Du9TG zabFPNs{en91{h|{<$qpRQK%b7^%Z5Tvk5RYU2!iI(6}4s!oWAcDF6phSu-FO_#9~5 z1MvZKfd#<(01IZUD-Z$<1jYi>frdTdA6No>0{jL*CCcQ$D&TuS7K5C zCl2Ek9WMDB6{Rr{|{0{h}poqXgAOgq$9tRc!14kimz)L{0(QpG618)I8 z0NOE#JJrdt|JGee2+SkN+s!!sr&C|7tX|FQ)Ve+$)unkon%ALu{ki)8{n7uq){vWg z&;R|o&ToAN##}?p*IuP_0JNV*Bd+Y*TZO*2tN5IDwkyqiEytOaX4-{7+HTXS5ve3H zOmX=BQG0%*eWj$kcJ`!{`B|-gn2^ve9(z>c<>IEb{#n{3U|t7~cL~_$oYoj@ZTWs$ z%asP618dW{-2;y6#dKSQGc{z=rAw>I|yFa-fY44>oR1RVt@MpUUU|n|URJK%? zw1!9fUWlS}Iz`%dC!MdBR&QywfK~%&r%wS^bqnBI4Zi}`cxkT!)gt+yh?r%4CTubGl?CqH2Zrr@{-snuN@l+&JS}|6Od+E&g zwU~1f(|Jp&pAcW7lm9x@yIS0dZOPr_qP?Y^v{w3WaRt7T>kKcbF7n^;wt6y*sgFr?lxCRbbap($G~W?zU!JmWTfH3KseHsW0r#VP z&|0kwpGrk9%M#ga3-=0YZ! zl{6()aoEc0j#Kvk&z|&8wxR#ab0b^s$Y(j`T)TSnBYU)W&5tBGpWn2_HOtidOfvxM zvp95$wX%~g|IGYIlG{x!MOtO@8Z|tn?UXLj=jW7W`KEn3XGKb%?0RPB8m#aBvz)(F zu3NP9Yb%#JYE71NJ~_@NCqe=ynkNBt_bJVcNi!Y}?Kzz+r*nVyhJ2SIf~e3Mo!3UG&t1}2SY{EivN{%I|y3)VyI>nxHgd5#3%!mDL*9RIu|?F zdv*lfsYmeCOzo1->-oqbwMl8r5ZF}w(JcXY+7li1b)KrD8n?c8ljoaH`#J&Mt7uf&6Se(l#k&xO6#%-!tw6Gu6-pN_rwZTWyCAJDi<`ynK4A4xKFmlBslpUUnFvAhw)vIR*xcK-V_ z)_P<|oJp#MM4V3^2#_382wLYs2T1YJI7_SgByZ4u0J^=6R&40^fT+FFeXnVD*843b zEUuL|?}5D3WV)Wemjcf0rF689va&st_V!Pj@11n*|GPi-|5axntGzv}*85lcVGrwc z;5%UUSRC0=;cN_W3TT*yGcmxQfUExhB^nSrF+2ZBdyaXXEw-w+#SZGOLpt_60|$Wo z43q=tpvGQnKnpAb0yFUq3Y97K*N0OKL_-{ zbYM2ncmmFS0c(JlfKLD)9nPHt(}DTGGGHaJ3Rn%?)lO`iz`s-N{H+i6eXsI*73cD# z^WQPl7wy$&Rdwl1JvypGsy|o%|CeY$t;?+c-$`F`)Q_s_L+1U*RsZ)#{Sz-EK4wuL ze=7%aMgFf-z|{ZUl&o`Uuv?c{ch+*#;|gKZuFzJSylcvU)}^a!1ORO|;RcvZ2_B6% zo$>G~eZ}ox&%G-H_mBcDyz1e~95*(}tsbk%Jj6d5AiR;rGGJ8|=JKtEpUC@RagOdSJ1%q}YfZqXc(6cd+ z3`_?~fz`k!UM{FuG?#0YNx3t*wbRl|!cfceysEPa_5JGN@wye;GV77tHJz-e#Xw*sZWuZGPq zxi6)cC(~y7mu8prfzF^Adx%&?*CSrct+t0odZ_^$6=N?hBPJg^)WfqOazI6I#V($z_mKf_&CrG$z)T6t)9P^VS>`KQ$dZdj07hF~?s|p7WT0<36hO^_E@R{^9%b z9#77UoU z*t)6th`zsExVbFgT-~Rd@YTK)^DwLpvL{DGFL&8Wyy68apeWku7U_qUld3Vs?Age$Tsj-Q^pv^sU%9@8;Ph z{}KFFZ1CE7F0B9F?6XCEKbrCQo+sA5+{Qa)QvU3)O!r}5UH6MW+GFg-g=KpTn|CVr zt%~`0#v6eb!acP;mJG}JF73s#pz{eIl$NPCeBI)}mTfnW{Dq>}7IggNXZ>cOfO7%d z*~jopy1D8gv;R>lt@y*LXdyoPqH6CHd_&GodvRjv@gC{#$-~p$+Pm?+-&oj6|Ipp5 z54~{W=!NsMdVG1h;o;|o))^VNvSyvR>T*TNJ6EO#zTC9zn}}wg1!~UjZuI@dNsafs z{Zxa~k)IdDO>2F)^oiHEd@CH;((!Ps%YomHc{gBO-+6e#lnd$9e? zd-=Z^|071lZ7s!14sA2vnHu(`k>8GQI@otc(6t%CzkKj!#!s!gFPe3|QIG#Vv}p0- z-Os$eJ!Smm-;RwwelR6s)sPosBZju{mruJG*1k^H0|)wDoAJuLuoV^cpa1shUy9Zz z{TW*O#bezEy>sKa<)^>gS3dtY?a8T)<1Tv_gpL^X>%612KYa3hzowzmS63pUlf`sT5aZvB^ZIX+@!{b?fxo%0`>?{j1J z{J{~Qw5gZu)vWofQzaW;^Q-;LGv14i-AHTr*f)QjExq>UjiaxgK0VcNY5(BV9WQ*; zbMwJ9W982d=ya|9W%&cg9{l>)$7N-{X)^yMQwEnDnX2qDcK7H%V{f$xAMnXjD^d^i zulVBory9N8xzQTkoYz_%J<>nn-B)&ueS1Uh)zwRzbb98C^eDS7ULW%6 z;)`FguP^V6PEc(9^2c#&yME@s`r6vCiJQL})$x%@VTNzq|MU7=x3*mIU-Dy6r!yyh z_L_9?lku^0gM!ZNy?*`Cua3MC+Wy10X1?LKb;bG(>r-b97;^5Q`}Ww4uXW3OuUrTl z^v?5FuIpYIJ^J|$`{PRMj4W#3Ak1&C`dz;l!*-ouu_1E<=Jf3udByj7tL3SNYd3#7 zU2&x-!gs)_Hu6mOiOE7p0;?XK)n+^CZv^Lw^o^O$QrBQwfBs`JP+ z58bUF5AQj@wB5oPeJ5Z2?z{i)PdM?&Gi}~^>fDYcQ~uaF+|XyncYpo0cVgZP)1P0l zYWD*T@^Z^xX;HLt%DHRLJ@iKEhr!c+yYO7g7ka&&H{t7t&yIdjb@u18>6aDr#?Gqi zv2Axy+kKAG&hn_XDz%wQi1h z@X1}hRT*v*o2)I|_57G^Yc)-@zbrVvBX{M(sFS0M7mV84RK9i1N&j}SX>*3ETYu_T z?lCuQj(fB8i?2-46u+51v7Yyve{LUoYh|tOOHO&5J6wOl_H{!aP40eSz=?pzw+$QR z+3M7@c}16}6b>5wp7vbprnUBat*Lu;^sr7nP7O$(BU}1~Vs6>RE6oGK9@_I|@r|fa zLnBJ`Gu!|Ah(}=Y(99QhPJe3k>Co7dD^;i0KmGY2UF0Ce^Sw(tH#nZLc2LQhPoMa? zG`Q=VFU+mKPJXrSGX2LBm;Y5sh8_|6+Szn-~Pzcbzj_| zNgtl}?VzHK8-8m1z@>}FGvAE<#aFdnQ?sU~)(hY68FhB~>fixWmw(^4Wc$TmlNavX z`NOgQ^!s_?urn|d2T@-xc& z)St88f9CgtUbs4=$E_VRC*1nEU~t_JUzo7_^%M1HXDDqlXd?jv6PvzLN z?hD?YzkB(g^FQCzV2x+pC+B_`|6s{0KZZ=I)gV7}-O}f`H(Iq|?da|i3wzBAFMMrz zQSxIMAC8e{{ggkfO@e;?ik7Fg4@4J~ z9_T$KDDX)0z>OWRZ;tJ>iH#eXc;=6-HBTQJKmA=#nc%s5g7Ud~i7OAq?qBojtegE> zf3RXfQ`vxJ}V3r&~$Mrzh72Y`8h@kCBbDUmIWY zee$R$9>4PO;*=-fy87axS*uTk?%LVvm!S_|+BNs8{?S^E`n}%h%l97n^Xk|(dv^K$ z5*-};+oSq@mt_%e>b8_M3l`kRG;f%YSJ(Uf+Iwq{Ts5QMshmfO$|uJ4dh$@=z^8qq zde0rXFJYVFLX+mxp1HYW+lpVBG#j@q;~VcOkB!^(Qo`%n6@^bN*?DN=l&z&#SH^Yy zbyZGMqr=_4P1^UCa=b^uhwqPiy2ps}Q9j+uFI~yGxGLz~pEf_zqer`p(eBMw-Q0h$ zaQ{JHpKJPJG9q1 zSo*?N4CzfV@YD5zW`lZ=B+rO8W&^xYzKN>+iLznwjmIZ?=jDC1-FH#jZ%Yom{E}8d1HBbbsyEsI~#|az*E5y1MO#JiYS3+{BwRHwLd=nEah=?MtDbzjq+w zM&Y#8|9#GF>SqBTr1?%c%$htKyTY*fuVDW!fw_%v) z7b)Afe|j1PlZx)<-ibLDc;U_Lu_OM*4z-NHS^_kMR)U^p@}PA^GdKL zzjaL3;*BY$Blcnvg&pfStQ&zTj%&3nb5lu^h#gu3QWj%1@HZNzzg(NX`t*lzB^0T3 z1^6+EzOv2=rA)we;&~bPowdHQq{Km;f@MO1UZu@YY4Wt{zOu>c0$Kllb!zuf^-9<1 zqEz_;BG4A}QuUQ(>-G7)f`SUtA%3a~6nVIp9B$H2ao|&z6-2*bkBD<*M;oxmN6c0s`PYBcHqPK!foI#+1&Q?Ft>S_ z`{~MUx^kOt+@>41>CSDs%YCU3eI+NZFcxa+V zH<)^Kk#5hTl?;4h?uJ`Gfj$8Fp<9mWrdzu0l5RYtTkq)RE86`+J0NHklvcv{Y6!eB zh{sF-WI$^m0B8&J0(t{|0m@W=pdJ(*!7!n(xlkPyMe4D0{1J6Vdcxbuh8UE42VeTF^?-seAi>1SLC97tt%9P_2bTJi{WT#uLc~+ z{{WZ|8tvU+PuHp^um`SC;XXnFzHBcg!wmTE%{)EOv{`=-H!KQe{fvZD_Im}DPCEggm8 z_2@$YNO`mg;17K%=2;P_+6d%63{^u(j&(yBLPS&STll8f$UeYmFX}At9ccWf${}~e zD4H~Tqi>=KnIT4h0mg5taI%jz+IKL1qy32X3ZqGNME)|2{<<2!yBkfhalk#Az70fi zXxlA+Q;lqiK>U$>k#8cRvBj9Z6F~>JC`DB6?p_`>JZrdncp4P!Ov)s-gNRIzm=MfF zXi#W>9_?0*hDpE08jqcNbXSlT?%kS|y1BC&HQe0YYI?cXs7Yb*n76cm+;v1cXs?I#KJE|otM)a!(H;?2->5yGPs z42D_Sk_|nrj3n~_7ikKv)dqW91985j7dT8m*o|h>*cw*GHnDfuZudRzjRZfTiO^hV zD=397!oxx@!J}1onVZsG>7lHpd_Y-8Sx;GC*+}`2vW2pHMX!o}6(JP^D;}vBRWYW* z&ERgRVW?@SW$-c7HTWBv8d@6q8bS=C45JNW3}-}+B<1Sv{|8|AaSDD{axGhroHrJl z3Es-uN*`rirLVG~(ofl3IkF<9VswS4!5ew$ZAdYkHC(864!mowuJJZo$sV5x=3((X z3hqF-o5$T0c*v~!(#M~qQgQHv#*#y=D~5W^EdcLj#=6BYHNzf6=84AM#cq79q;6p0 z<_m5`%w2jW!65Kwwb6-~D?KLx%B{g*O&w1*uRvgaOWzq|dZQ4o=YNj^73g)f#X;J# z?9_73Jn_QSn=#qGuP*Xt9oua_PJ^5V4%8XQy%eBcvJ9Zcz7C*fy9uDixC5Y3Y9ByD z$}xaOxJv+yP=5l{HoXxU4d8N^J}|q&B+(!QW?h)WU_wM-i7K0Gg{~>J6=|G%p_u zlji#xfad$8Z6zJSQ~+vxRt%6p_gx3ro5#~Um^7tik}j1@(&|a` zV_z{&SUEJw&Gon_;G%$w0xk-;DBz-iivlhRxG3PFfQtey3b-iXqJT7yr@1%HscHS3 z=J7O#r}cVTo2GSon(y1$vM0{vX`WAO_%xqy2s8p{PEYfGS|6u*J8iaW3N!;~cP6dR zw*&;B6(9pz0|7uApe@i2kOS=jEQ#Z`QSqnPard0~GwUn}Cg~%f4iIhKu>`0*zALM^Ie-E_^!a#oB=SyfPp|bFbEh7L;#V%5MU@U42S|~6JHEKVdG%N z0|`JPfS;1Z?YoQ(2gsfD7mon=30U04$graezcUM@0_6S|kY;?RZ^A$M&@Mo_Ggv^$ z=@w}ncKB82@nbdIcz&r3dDWuUB<=lxL8QF>Y`R?5koG`iz-Fe=wlk=v!freI9k@Gr z>S8Y-rBCgaOlRT2=t)IS^(#ZY-o-l0*k*AAh9p2G5i>JJP zPkKY1zMJ@)f^?I13|hfBa;etyAT)xgaWm><8whiyfNY b75FI3#mNyxFuT_CtqGO2T$kIwO@aRhHt?M5 literal 0 HcmV?d00001 diff --git a/doc/精读报告/gtask/data/Node.doc b/doc/精读报告/gtask/data/Node.doc new file mode 100644 index 0000000..fabe296 --- /dev/null +++ b/doc/精读报告/gtask/data/Node.doc @@ -0,0 +1,104 @@ +/* + * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package net.micode.notes.gtask.data; + +import android.database.Cursor; + +import org.json.JSONObject; +/* + * 应该是同步操作的基础数据类型,定义了相关指示同步操作的常量 +*/ +public abstract class Node { + //定义了各种用于表征同步状态的常量 + public static final int SYNC_ACTION_NONE = 0;// 本地和云端都无可更新内容(即本地和云端内容一致) + + public static final int SYNC_ACTION_ADD_REMOTE = 1;// 需要在远程云端增加内容 + + public static final int SYNC_ACTION_ADD_LOCAL = 2;// 需要在本地增加内容 + + public static final int SYNC_ACTION_DEL_REMOTE = 3;// 需要在远程云端删除内容 + + public static final int SYNC_ACTION_DEL_LOCAL = 4;// 需要在本地删除内容 + + public static final int SYNC_ACTION_UPDATE_REMOTE = 5;// 需要将本地内容更新到远程云端 + + public static final int SYNC_ACTION_UPDATE_LOCAL = 6;// 需要将远程云端内容更新到本地 + + public static final int SYNC_ACTION_UPDATE_CONFLICT = 7;// 同步出现冲突 + + public static final int SYNC_ACTION_ERROR = 8;// 同步出现错误 + + private String mGid; + + private String mName; + + private long mLastModified; + //记录最后一次修改时间 + private boolean mDeleted; + //表征是否被删除 + public Node() { + mGid = null; + mName = ""; + mLastModified = 0; + mDeleted = false; + } + + public abstract JSONObject getCreateAction(int actionId); + + public abstract JSONObject getUpdateAction(int actionId); + + public abstract void setContentByRemoteJSON(JSONObject js); + + public abstract void setContentByLocalJSON(JSONObject js); + + public abstract JSONObject getLocalJSONFromContent(); + + public abstract int getSyncAction(Cursor c); + + public void setGid(String gid) { + this.mGid = gid; + } + + public void setName(String name) { + this.mName = name; + } + + public void setLastModified(long lastModified) { + this.mLastModified = lastModified; + } + + public void setDeleted(boolean deleted) { + this.mDeleted = deleted; + } + + public String getGid() { + return this.mGid; + } + + public String getName() { + return this.mName; + } + + public long getLastModified() { + return this.mLastModified; + } + + public boolean getDeleted() { + return this.mDeleted; + } + +} diff --git a/doc/精读报告/gtask/data/SqlData.doc b/doc/精读报告/gtask/data/SqlData.doc new file mode 100644 index 0000000..ff9ab81 --- /dev/null +++ b/doc/精读报告/gtask/data/SqlData.doc @@ -0,0 +1,218 @@ +/* + * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/* + * Description:用于支持小米便签最底层的数据库相关操作,和sqlnote的关系上是子集关系,即data是note的子集(节点)。 + * SqlData其实就是也就是所谓数据中的数据 + */ +package net.micode.notes.gtask.data; + +import android.content.ContentResolver; +import android.content.ContentUris; +import android.content.ContentValues; +import android.content.Context; +import android.database.Cursor; +import android.net.Uri; +import android.util.Log; + +import net.micode.notes.data.Notes; +import net.micode.notes.data.Notes.DataColumns; +import net.micode.notes.data.Notes.DataConstants; +import net.micode.notes.data.Notes.NoteColumns; +import net.micode.notes.data.NotesDatabaseHelper.TABLE; +import net.micode.notes.gtask.exception.ActionFailureException; + +import org.json.JSONException; +import org.json.JSONObject; + + +public class SqlData { + /* + * 功能描述:得到类的简写名称存入字符串TAG中 + * 实现过程:调用getSimpleName ()函数 + */ + private static final String TAG = SqlData.class.getSimpleName(); + + private static final int INVALID_ID = -99999; + /* + * 来自Notes类中定义的DataColumn中的一些常量 + */ + // 集合了interface DataColumns中所有SF常量 + public static final String[] PROJECTION_DATA = new String[] { + DataColumns.ID, DataColumns.MIME_TYPE, DataColumns.CONTENT, DataColumns.DATA1, + DataColumns.DATA3 + }; +/* + * 以下五个变量作为sql表中5列的编号 + */ + public static final int DATA_ID_COLUMN = 0; + + public static final int DATA_MIME_TYPE_COLUMN = 1; + + public static final int DATA_CONTENT_COLUMN = 2; + + public static final int DATA_CONTENT_DATA_1_COLUMN = 3; + + public static final int DATA_CONTENT_DATA_3_COLUMN = 4; + + private ContentResolver mContentResolver; + //判断是否直接用Content生成,是为true,否则为false + private boolean mIsCreate; + + private long mDataId; + + private String mDataMimeType; + + private String mDataContent; + + private long mDataContentData1; + + private String mDataContentData3; + + private ContentValues mDiffDataValues; + /* + * 功能描述:构造函数,用于初始化数据 + * 参数注解:mContentResolver用于获取ContentProvider提供的数据 + * 参数注解: mIsCreate表征当前数据是用哪种方式创建(两种构造函数的参数不同) + */ + public SqlData(Context context) { + mContentResolver = context.getContentResolver(); + mIsCreate = true; + mDataId = INVALID_ID; + mDataMimeType = DataConstants.NOTE; + mDataContent = ""; + mDataContentData1 = 0; + mDataContentData3 = ""; + mDiffDataValues = new ContentValues(); + } + + public SqlData(Context context, Cursor c) { + mContentResolver = context.getContentResolver(); + mIsCreate = false; + loadFromCursor(c); + mDiffDataValues = new ContentValues(); + } + /* + * 功能描述:从光标处加载数据 + * 从当前的光标处将五列的数据加载到该类的对象 + */ + private void loadFromCursor(Cursor c) { + mDataId = c.getLong(DATA_ID_COLUMN); + mDataMimeType = c.getString(DATA_MIME_TYPE_COLUMN); + mDataContent = c.getString(DATA_CONTENT_COLUMN); + mDataContentData1 = c.getLong(DATA_CONTENT_DATA_1_COLUMN); + mDataContentData3 = c.getString(DATA_CONTENT_DATA_3_COLUMN); + } + /* + * 功能描述:设置用于共享的数据,并提供异常抛出与处理机制 + */ + public void setContent(JSONObject js) throws JSONException { + //如果传入的JSONObject对象中有DataColumns.ID这一项,则设置,否则设为INVALID_ID + long dataId = js.has(DataColumns.ID) ? js.getLong(DataColumns.ID) : INVALID_ID; + if (mIsCreate || mDataId != dataId) { + mDiffDataValues.put(DataColumns.ID, dataId); + } + mDataId = dataId; + + String dataMimeType = js.has(DataColumns.MIME_TYPE) ? js.getString(DataColumns.MIME_TYPE) + : DataConstants.NOTE; + if (mIsCreate || !mDataMimeType.equals(dataMimeType)) { + mDiffDataValues.put(DataColumns.MIME_TYPE, dataMimeType); + } + mDataMimeType = dataMimeType; + + String dataContent = js.has(DataColumns.CONTENT) ? js.getString(DataColumns.CONTENT) : ""; + if (mIsCreate || !mDataContent.equals(dataContent)) { + mDiffDataValues.put(DataColumns.CONTENT, dataContent); + } + mDataContent = dataContent; + + long dataContentData1 = js.has(DataColumns.DATA1) ? js.getLong(DataColumns.DATA1) : 0; + if (mIsCreate || mDataContentData1 != dataContentData1) { + mDiffDataValues.put(DataColumns.DATA1, dataContentData1); + } + mDataContentData1 = dataContentData1; + + String dataContentData3 = js.has(DataColumns.DATA3) ? js.getString(DataColumns.DATA3) : ""; + if (mIsCreate || !mDataContentData3.equals(dataContentData3)) { + mDiffDataValues.put(DataColumns.DATA3, dataContentData3); + } + mDataContentData3 = dataContentData3; + } + /* + * 功能描述:获取共享的数据内容,并提供异常抛出与处理机制 + */ + public JSONObject getContent() throws JSONException { + if (mIsCreate) { + Log.e(TAG, "it seems that we haven't created this in database yet"); + return null; + //创建JSONObject对象。并将相关数据放入其中,并返回。 + } + JSONObject js = new JSONObject(); + js.put(DataColumns.ID, mDataId); + js.put(DataColumns.MIME_TYPE, mDataMimeType); + js.put(DataColumns.CONTENT, mDataContent); + js.put(DataColumns.DATA1, mDataContentData1); + js.put(DataColumns.DATA3, mDataContentData3); + return js; + } + /* + * 功能描述:commit函数用于把当前造作所做的修改保存到数据库 + */ + public void commit(long noteId, boolean validateVersion, long version) { + + if (mIsCreate) { + if (mDataId == INVALID_ID && mDiffDataValues.containsKey(DataColumns.ID)) { + mDiffDataValues.remove(DataColumns.ID); + } + + mDiffDataValues.put(DataColumns.NOTE_ID, noteId); + Uri uri = mContentResolver.insert(Notes.CONTENT_DATA_URI, mDiffDataValues); + try { + mDataId = Long.valueOf(uri.getPathSegments().get(1)); + } catch (NumberFormatException e) { + Log.e(TAG, "Get note id error :" + e.toString()); + throw new ActionFailureException("create note failed"); + } + } else { + if (mDiffDataValues.size() > 0) { + int result = 0; + if (!validateVersion) { + result = mContentResolver.update(ContentUris.withAppendedId( + Notes.CONTENT_DATA_URI, mDataId), mDiffDataValues, null, null); + } else { + result = mContentResolver.update(ContentUris.withAppendedId( + Notes.CONTENT_DATA_URI, mDataId), mDiffDataValues, + " ? in (SELECT " + NoteColumns.ID + " FROM " + TABLE.NOTE + + " WHERE " + NoteColumns.VERSION + "=?)", new String[] { + String.valueOf(noteId), String.valueOf(version) + }); + } + if (result == 0) { + Log.w(TAG, "there is no update. maybe user updates note when syncing"); + } + } + } + + mDiffDataValues.clear(); + mIsCreate = false; + } + /* + * 功能描述:获取当前id + */ + public long getId() { + return mDataId; + } +} diff --git a/doc/精读报告/gtask/data/SqlNote.doc b/doc/精读报告/gtask/data/SqlNote.doc new file mode 100644 index 0000000..6e3e842 --- /dev/null +++ b/doc/精读报告/gtask/data/SqlNote.doc @@ -0,0 +1,566 @@ +/* + * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package net.micode.notes.gtask.data; + +import android.appwidget.AppWidgetManager; +import android.content.ContentResolver; +import android.content.ContentValues; +import android.content.Context; +import android.database.Cursor; +import android.net.Uri; +import android.util.Log; + +import net.micode.notes.data.Notes; +import net.micode.notes.data.Notes.DataColumns; +import net.micode.notes.data.Notes.NoteColumns; +import net.micode.notes.gtask.exception.ActionFailureException; +import net.micode.notes.tool.GTaskStringUtils; +import net.micode.notes.tool.ResourceParser; + +import org.json.JSONArray; +import org.json.JSONException; +import org.json.JSONObject; + +import java.util.ArrayList; + + +public class SqlNote { + /* + * 功能描述:得到类的简写名称存入字符串TAG中 + * 实现过程:调用getSimpleName ()函数 + */ + private static final String TAG = SqlNote.class.getSimpleName(); + + private static final int INVALID_ID = -99999; + // 集合了interface NoteColumns中所有SF常量(17个) + public static final String[] PROJECTION_NOTE = new String[] { + NoteColumns.ID, NoteColumns.ALERTED_DATE, NoteColumns.BG_COLOR_ID, + NoteColumns.CREATED_DATE, NoteColumns.HAS_ATTACHMENT, NoteColumns.MODIFIED_DATE, + NoteColumns.NOTES_COUNT, NoteColumns.PARENT_ID, NoteColumns.SNIPPET, NoteColumns.TYPE, + NoteColumns.WIDGET_ID, NoteColumns.WIDGET_TYPE, NoteColumns.SYNC_ID, + NoteColumns.LOCAL_MODIFIED, NoteColumns.ORIGIN_PARENT_ID, NoteColumns.GTASK_ID, + NoteColumns.VERSION + }; + + public static final int ID_COLUMN = 0; + + public static final int ALERTED_DATE_COLUMN = 1; + + public static final int BG_COLOR_ID_COLUMN = 2; + + public static final int CREATED_DATE_COLUMN = 3; + + public static final int HAS_ATTACHMENT_COLUMN = 4; + + public static final int MODIFIED_DATE_COLUMN = 5; + + public static final int NOTES_COUNT_COLUMN = 6; + + public static final int PARENT_ID_COLUMN = 7; + + public static final int SNIPPET_COLUMN = 8; + + public static final int TYPE_COLUMN = 9; + + public static final int WIDGET_ID_COLUMN = 10; + + public static final int WIDGET_TYPE_COLUMN = 11; + + public static final int SYNC_ID_COLUMN = 12; + + public static final int LOCAL_MODIFIED_COLUMN = 13; + + public static final int ORIGIN_PARENT_ID_COLUMN = 14; + + public static final int GTASK_ID_COLUMN = 15; + + public static final int VERSION_COLUMN = 16; + //一下定义了17个内部的变量,其中12个可以由content中获得,5个需要初始化为0或者new + private Context mContext; + + private ContentResolver mContentResolver; + + private boolean mIsCreate; + + private long mId; + + private long mAlertDate; + + private int mBgColorId; + + private long mCreatedDate; + + private int mHasAttachment; + + private long mModifiedDate; + + private long mParentId; + + private String mSnippet; + + private int mType; + + private int mWidgetId; + + private int mWidgetType; + + private long mOriginParent; + + private long mVersion; + + private ContentValues mDiffNoteValues; + + private ArrayList mDataList; + + + /* + * 功能描述:构造函数 + * 参数注解: mIsCreate用于标示构造方式 + */ + //构造函数只有context,对所有的变量进行初始化 + public SqlNote(Context context) { + mContext = context; + mContentResolver = context.getContentResolver(); + mIsCreate = true; + mId = INVALID_ID; + mAlertDate = 0; + mBgColorId = ResourceParser.getDefaultBgId(context); + mCreatedDate = System.currentTimeMillis();//调用系统函数获得创建时间 + mHasAttachment = 0; + mModifiedDate = System.currentTimeMillis();//最后一次修改时间初始化为创建时间 + mParentId = 0; + mSnippet = ""; + mType = Notes.TYPE_NOTE; + mWidgetId = AppWidgetManager.INVALID_APPWIDGET_ID; + mWidgetType = Notes.TYPE_WIDGET_INVALIDE; + mOriginParent = 0; + mVersion = 0; + mDiffNoteValues = new ContentValues(); + mDataList = new ArrayList(); + } + /* + * 功能描述:构造函数 + * 参数注解: mIsCreate用于标示构造方式 + */ + //构造函数有context和一个数据库的cursor,多数变量通过cursor指向的一条记录直接进行初始化 + public SqlNote(Context context, Cursor c) { + mContext = context; + mContentResolver = context.getContentResolver(); + mIsCreate = false; + loadFromCursor(c); + mDataList = new ArrayList(); + if (mType == Notes.TYPE_NOTE) + loadDataContent(); + mDiffNoteValues = new ContentValues(); + } + /* + * 功能描述:构造函数 + * 参数注解: mIsCreate用于标示构造方式 + */ + public SqlNote(Context context, long id) { + mContext = context; + mContentResolver = context.getContentResolver(); + mIsCreate = false; + loadFromCursor(id); + mDataList = new ArrayList(); + if (mType == Notes.TYPE_NOTE) + loadDataContent(); + mDiffNoteValues = new ContentValues(); + + } +/* + * 功能描述:通过id从光标处加载数据 +*/ + private void loadFromCursor(long id) { + Cursor c = null; + try { + c = mContentResolver.query(Notes.CONTENT_NOTE_URI, PROJECTION_NOTE, "(_id=?)", + new String[] { + String.valueOf(id) + }, null);//通过id获得对应的ContentResolver中的cursor + if (c != null) { + c.moveToNext(); + loadFromCursor(c);//然后加载数据进行初始化,这样函数 + + //SqlNote(Context context, long id)与SqlNote(Context context, long id)的实现方式基本相同 + } else { + Log.w(TAG, "loadFromCursor: cursor = null"); + } + } finally { + if (c != null) + c.close(); + } + } + /* + * 功能描述:通过游标从光标处加载数据 + */ + + private void loadFromCursor(Cursor c) { + //直接从一条记录中的获得以下变量的初始值 + mId = c.getLong(ID_COLUMN); + mAlertDate = c.getLong(ALERTED_DATE_COLUMN); + mBgColorId = c.getInt(BG_COLOR_ID_COLUMN); + mCreatedDate = c.getLong(CREATED_DATE_COLUMN); + mHasAttachment = c.getInt(HAS_ATTACHMENT_COLUMN); + mModifiedDate = c.getLong(MODIFIED_DATE_COLUMN); + mParentId = c.getLong(PARENT_ID_COLUMN); + mSnippet = c.getString(SNIPPET_COLUMN); + mType = c.getInt(TYPE_COLUMN); + mWidgetId = c.getInt(WIDGET_ID_COLUMN); + mWidgetType = c.getInt(WIDGET_TYPE_COLUMN); + mVersion = c.getLong(VERSION_COLUMN); + } + /* + * 功能描述:通过content机制获取共享数据并加载到数据库当前游标处 + */ + private void loadDataContent() { + Cursor c = null; + mDataList.clear(); + try { + c = mContentResolver.query(Notes.CONTENT_DATA_URI, SqlData.PROJECTION_DATA, + "(note_id=?)", new String[] { + String.valueOf(mId) + }, null); + if (c != null) { + if (c.getCount() == 0) { + Log.w(TAG, "it seems that the note has not data"); + return; + } + while (c.moveToNext()) { + SqlData data = new SqlData(mContext, c); + mDataList.add(data); + } + } else { + Log.w(TAG, "loadDataContent: cursor = null"); + } + } finally { + if (c != null) + c.close(); + } + } + /* + * 功能描述:设置通过content机制用于共享的数据信息 + + */ + public boolean setContent(JSONObject js) { + try { + JSONObject note = js.getJSONObject(GTaskStringUtils.META_HEAD_NOTE); + if (note.getInt(NoteColumns.TYPE) == Notes.TYPE_SYSTEM) { + Log.w(TAG, "cannot set system folder"); + } else if (note.getInt(NoteColumns.TYPE) == Notes.TYPE_FOLDER) { + // for folder we can only update the snnipet and type + String snippet = note.has(NoteColumns.SNIPPET) ? note + .getString(NoteColumns.SNIPPET) : ""; + if (mIsCreate || !mSnippet.equals(snippet)) { + mDiffNoteValues.put(NoteColumns.SNIPPET, snippet); + } + mSnippet = snippet; + + int type = note.has(NoteColumns.TYPE) ? note.getInt(NoteColumns.TYPE) + : Notes.TYPE_NOTE; + if (mIsCreate || mType != type) { + mDiffNoteValues.put(NoteColumns.TYPE, type); + } + mType = type; + } else if (note.getInt(NoteColumns.TYPE) == Notes.TYPE_NOTE) { + JSONArray dataArray = js.getJSONArray(GTaskStringUtils.META_HEAD_DATA); + long id = note.has(NoteColumns.ID) ? note.getLong(NoteColumns.ID) : INVALID_ID; + if (mIsCreate || mId != id) { + mDiffNoteValues.put(NoteColumns.ID, id); + } + mId = id; + + long alertDate = note.has(NoteColumns.ALERTED_DATE) ? note + .getLong(NoteColumns.ALERTED_DATE) : 0; + if (mIsCreate || mAlertDate != alertDate) { + mDiffNoteValues.put(NoteColumns.ALERTED_DATE, alertDate); + } + mAlertDate = alertDate; + + int bgColorId = note.has(NoteColumns.BG_COLOR_ID) ? note + .getInt(NoteColumns.BG_COLOR_ID) : ResourceParser.getDefaultBgId(mContext); + if (mIsCreate || mBgColorId != bgColorId) { + mDiffNoteValues.put(NoteColumns.BG_COLOR_ID, bgColorId); + } + mBgColorId = bgColorId; + + long createDate = note.has(NoteColumns.CREATED_DATE) ? note + .getLong(NoteColumns.CREATED_DATE) : System.currentTimeMillis(); + if (mIsCreate || mCreatedDate != createDate) { + mDiffNoteValues.put(NoteColumns.CREATED_DATE, createDate); + } + mCreatedDate = createDate; + + int hasAttachment = note.has(NoteColumns.HAS_ATTACHMENT) ? note + .getInt(NoteColumns.HAS_ATTACHMENT) : 0; + if (mIsCreate || mHasAttachment != hasAttachment) { + mDiffNoteValues.put(NoteColumns.HAS_ATTACHMENT, hasAttachment); + } + mHasAttachment = hasAttachment; + + long modifiedDate = note.has(NoteColumns.MODIFIED_DATE) ? note + .getLong(NoteColumns.MODIFIED_DATE) : System.currentTimeMillis(); + if (mIsCreate || mModifiedDate != modifiedDate) { + mDiffNoteValues.put(NoteColumns.MODIFIED_DATE, modifiedDate); + } + mModifiedDate = modifiedDate; + + long parentId = note.has(NoteColumns.PARENT_ID) ? note + .getLong(NoteColumns.PARENT_ID) : 0; + if (mIsCreate || mParentId != parentId) { + mDiffNoteValues.put(NoteColumns.PARENT_ID, parentId); + } + mParentId = parentId; + + String snippet = note.has(NoteColumns.SNIPPET) ? note + .getString(NoteColumns.SNIPPET) : ""; + if (mIsCreate || !mSnippet.equals(snippet)) { + mDiffNoteValues.put(NoteColumns.SNIPPET, snippet); + } + mSnippet = snippet; + + int type = note.has(NoteColumns.TYPE) ? note.getInt(NoteColumns.TYPE) + : Notes.TYPE_NOTE; + if (mIsCreate || mType != type) { + mDiffNoteValues.put(NoteColumns.TYPE, type); + } + mType = type; + + int widgetId = note.has(NoteColumns.WIDGET_ID) ? note.getInt(NoteColumns.WIDGET_ID) + : AppWidgetManager.INVALID_APPWIDGET_ID; + if (mIsCreate || mWidgetId != widgetId) { + mDiffNoteValues.put(NoteColumns.WIDGET_ID, widgetId); + } + mWidgetId = widgetId; + + int widgetType = note.has(NoteColumns.WIDGET_TYPE) ? note + .getInt(NoteColumns.WIDGET_TYPE) : Notes.TYPE_WIDGET_INVALIDE; + if (mIsCreate || mWidgetType != widgetType) { + mDiffNoteValues.put(NoteColumns.WIDGET_TYPE, widgetType); + } + mWidgetType = widgetType; + + long originParent = note.has(NoteColumns.ORIGIN_PARENT_ID) ? note + .getLong(NoteColumns.ORIGIN_PARENT_ID) : 0; + if (mIsCreate || mOriginParent != originParent) { + mDiffNoteValues.put(NoteColumns.ORIGIN_PARENT_ID, originParent); + } + mOriginParent = originParent; + + for (int i = 0; i < dataArray.length(); i++) { + JSONObject data = dataArray.getJSONObject(i); + SqlData sqlData = null; + if (data.has(DataColumns.ID)) { + long dataId = data.getLong(DataColumns.ID); + for (SqlData temp : mDataList) { + if (dataId == temp.getId()) { + sqlData = temp; + } + } + } + + if (sqlData == null) { + sqlData = new SqlData(mContext); + mDataList.add(sqlData); + } + + sqlData.setContent(data); + } + } + } catch (JSONException e) { + Log.e(TAG, e.toString()); + e.printStackTrace(); + return false; + } + return true; + } + /* + * 功能描述:获取content机制提供的数据并加载到note中 + */ + public JSONObject getContent() { + try { + JSONObject js = new JSONObject(); + + if (mIsCreate) { + Log.e(TAG, "it seems that we haven't created this in database yet"); + return null; + } + + JSONObject note = new JSONObject(); + if (mType == Notes.TYPE_NOTE) { + //类型为note时 + note.put(NoteColumns.ID, mId); + note.put(NoteColumns.ALERTED_DATE, mAlertDate); + note.put(NoteColumns.BG_COLOR_ID, mBgColorId); + note.put(NoteColumns.CREATED_DATE, mCreatedDate); + note.put(NoteColumns.HAS_ATTACHMENT, mHasAttachment); + note.put(NoteColumns.MODIFIED_DATE, mModifiedDate); + note.put(NoteColumns.PARENT_ID, mParentId); + note.put(NoteColumns.SNIPPET, mSnippet); + note.put(NoteColumns.TYPE, mType); + note.put(NoteColumns.WIDGET_ID, mWidgetId); + note.put(NoteColumns.WIDGET_TYPE, mWidgetType); + note.put(NoteColumns.ORIGIN_PARENT_ID, mOriginParent); + js.put(GTaskStringUtils.META_HEAD_NOTE, note); + + JSONArray dataArray = new JSONArray(); + for (SqlData sqlData : mDataList) { + JSONObject data = sqlData.getContent(); + if (data != null) { + dataArray.put(data); + } + } + js.put(GTaskStringUtils.META_HEAD_DATA, dataArray); + } else if (mType == Notes.TYPE_FOLDER || mType == Notes.TYPE_SYSTEM) { + note.put(NoteColumns.ID, mId); + note.put(NoteColumns.TYPE, mType); + note.put(NoteColumns.SNIPPET, mSnippet); + js.put(GTaskStringUtils.META_HEAD_NOTE, note); + } + + return js; + } catch (JSONException e) { + Log.e(TAG, e.toString()); + e.printStackTrace(); + } + return null; + } +/* + * 功能描述:给当前id设置父id + */ + public void setParentId(long id) { + mParentId = id; + mDiffNoteValues.put(NoteColumns.PARENT_ID, id); + } + + /* + * 功能描述:给当前id设置Gtaskid + */ + public void setGtaskId(String gid) { + mDiffNoteValues.put(NoteColumns.GTASK_ID, gid); + } + + /* + * 功能描述:给当前id设置同步id + + */ + public void setSyncId(long syncId) { + mDiffNoteValues.put(NoteColumns.SYNC_ID, syncId); + } + + /* + * 功能描述:初始化本地修改,即撤销所有当前修改 + */ + public void resetLocalModified() { + mDiffNoteValues.put(NoteColumns.LOCAL_MODIFIED, 0); + } + + /* + * 功能描述:获得当前id + */ + public long getId() { + return mId; + } + + /* + * 功能描述:获得当前id的父id + */ + public long getParentId() { + return mParentId; + } + + /* + * 功能描述:获取小片段即用于显示的部分便签内容 + */ + public String getSnippet() { + return mSnippet; + } + /* + * 功能描述:判断是否为便签类型 + */ + public boolean isNoteType() { + return mType == Notes.TYPE_NOTE; + } + + /* + * 功能描述:commit函数用于把当前造作所做的修改保存到数据库 + */ + public void commit(boolean validateVersion) { + if (mIsCreate) { + if (mId == INVALID_ID && mDiffNoteValues.containsKey(NoteColumns.ID)) { + mDiffNoteValues.remove(NoteColumns.ID); + } + + Uri uri = mContentResolver.insert(Notes.CONTENT_NOTE_URI, mDiffNoteValues); + try { + mId = Long.valueOf(uri.getPathSegments().get(1)); + } catch (NumberFormatException e) { + Log.e(TAG, "Get note id error :" + e.toString()); + throw new ActionFailureException("create note failed"); + } + if (mId == 0) { + throw new IllegalStateException("Create thread id failed"); + } + + if (mType == Notes.TYPE_NOTE) { + for (SqlData sqlData : mDataList) { + //直接使用sqldata中的实现 + sqlData.commit(mId, false, -1); + } + } + } else { + if (mId <= 0 && mId != Notes.ID_ROOT_FOLDER && mId != Notes.ID_CALL_RECORD_FOLDER) { + Log.e(TAG, "No such note"); + throw new IllegalStateException("Try to update note with invalid id"); + } + if (mDiffNoteValues.size() > 0) { + mVersion ++; + int result = 0; + if (!validateVersion) { + //构造字符串 + result = mContentResolver.update(Notes.CONTENT_NOTE_URI, mDiffNoteValues, "(" + + NoteColumns.ID + "=?)", new String[] { + String.valueOf(mId) + }); + } else { + result = mContentResolver.update(Notes.CONTENT_NOTE_URI, mDiffNoteValues, "(" + + NoteColumns.ID + "=?) AND (" + NoteColumns.VERSION + "<=?)", + new String[] { + String.valueOf(mId), String.valueOf(mVersion) + }); + } + if (result == 0) { + Log.w(TAG, "there is no update. maybe user updates note when syncing"); + } + } + + if (mType == Notes.TYPE_NOTE) { + for (SqlData sqlData : mDataList) { + sqlData.commit(mId, validateVersion, mVersion); + } + } + } + + // refresh local info + loadFromCursor(mId); + if (mType == Notes.TYPE_NOTE) + loadDataContent(); + + mDiffNoteValues.clear(); + mIsCreate = false; + } +} diff --git a/doc/精读报告/gtask/data/Task.doc b/doc/精读报告/gtask/data/Task.doc new file mode 100644 index 0000000..72068a0 --- /dev/null +++ b/doc/精读报告/gtask/data/Task.doc @@ -0,0 +1,351 @@ +/* + * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package net.micode.notes.gtask.data; + +import android.database.Cursor; +import android.text.TextUtils; +import android.util.Log; + +import net.micode.notes.data.Notes; +import net.micode.notes.data.Notes.DataColumns; +import net.micode.notes.data.Notes.DataConstants; +import net.micode.notes.data.Notes.NoteColumns; +import net.micode.notes.gtask.exception.ActionFailureException; +import net.micode.notes.tool.GTaskStringUtils; + +import org.json.JSONArray; +import org.json.JSONException; +import org.json.JSONObject; + + +public class Task extends Node { + private static final String TAG = Task.class.getSimpleName(); + + private boolean mCompleted;//是否完成 + + private String mNotes; + + private JSONObject mMetaInfo;//将在实例中存储数据的类型 + + private Task mPriorSibling;//对应的优先兄弟Task的指针(待完善) + + private TaskList mParent;//所在的任务列表的指针 + + public Task() { + super(); + mCompleted = false; + mNotes = null; + mPriorSibling = null;//TaskList中当前Task前面的Task的指针 + mParent = null;//当前Task所在的TaskList + mMetaInfo = null; + } + + public JSONObject getCreateAction(int actionId) { + JSONObject js = new JSONObject(); + + try { + // action_type + js.put(GTaskStringUtils.GTASK_JSON_ACTION_TYPE, + GTaskStringUtils.GTASK_JSON_ACTION_TYPE_CREATE); + + // action_id + js.put(GTaskStringUtils.GTASK_JSON_ACTION_ID, actionId); + + // index + js.put(GTaskStringUtils.GTASK_JSON_INDEX, mParent.getChildTaskIndex(this)); + + // entity_delta + JSONObject entity = new JSONObject(); + entity.put(GTaskStringUtils.GTASK_JSON_NAME, getName()); + entity.put(GTaskStringUtils.GTASK_JSON_CREATOR_ID, "null"); + entity.put(GTaskStringUtils.GTASK_JSON_ENTITY_TYPE, + GTaskStringUtils.GTASK_JSON_TYPE_TASK); + if (getNotes() != null) { + entity.put(GTaskStringUtils.GTASK_JSON_NOTES, getNotes()); + } + js.put(GTaskStringUtils.GTASK_JSON_ENTITY_DELTA, entity); + + // parent_id + js.put(GTaskStringUtils.GTASK_JSON_PARENT_ID, mParent.getGid()); + + // dest_parent_type + js.put(GTaskStringUtils.GTASK_JSON_DEST_PARENT_TYPE, + GTaskStringUtils.GTASK_JSON_TYPE_GROUP); + + // list_id + js.put(GTaskStringUtils.GTASK_JSON_LIST_ID, mParent.getGid()); + + // prior_sibling_id + if (mPriorSibling != null) { + js.put(GTaskStringUtils.GTASK_JSON_PRIOR_SIBLING_ID, mPriorSibling.getGid()); + } + + } catch (JSONException e) { + Log.e(TAG, e.toString()); + e.printStackTrace(); + throw new ActionFailureException("fail to generate task-create jsonobject"); + } + + return js; + } + + public JSONObject getUpdateAction(int actionId) { + JSONObject js = new JSONObject(); + + try { + // action_type + js.put(GTaskStringUtils.GTASK_JSON_ACTION_TYPE, + GTaskStringUtils.GTASK_JSON_ACTION_TYPE_UPDATE); + + // action_id + js.put(GTaskStringUtils.GTASK_JSON_ACTION_ID, actionId); + + // id + js.put(GTaskStringUtils.GTASK_JSON_ID, getGid()); + + // entity_delta + JSONObject entity = new JSONObject(); + entity.put(GTaskStringUtils.GTASK_JSON_NAME, getName()); + if (getNotes() != null) { + entity.put(GTaskStringUtils.GTASK_JSON_NOTES, getNotes()); + } + entity.put(GTaskStringUtils.GTASK_JSON_DELETED, getDeleted()); + js.put(GTaskStringUtils.GTASK_JSON_ENTITY_DELTA, entity); + + } catch (JSONException e) { + Log.e(TAG, e.toString()); + e.printStackTrace(); + throw new ActionFailureException("fail to generate task-update jsonobject"); + } + + return js; + } + + public void setContentByRemoteJSON(JSONObject js) { + if (js != null) { + try { + // id + if (js.has(GTaskStringUtils.GTASK_JSON_ID)) { + setGid(js.getString(GTaskStringUtils.GTASK_JSON_ID)); + } + + // last_modified + if (js.has(GTaskStringUtils.GTASK_JSON_LAST_MODIFIED)) { + setLastModified(js.getLong(GTaskStringUtils.GTASK_JSON_LAST_MODIFIED)); + } + + // name + if (js.has(GTaskStringUtils.GTASK_JSON_NAME)) { + setName(js.getString(GTaskStringUtils.GTASK_JSON_NAME)); + } + + // notes + if (js.has(GTaskStringUtils.GTASK_JSON_NOTES)) { + setNotes(js.getString(GTaskStringUtils.GTASK_JSON_NOTES)); + } + + // deleted + if (js.has(GTaskStringUtils.GTASK_JSON_DELETED)) { + setDeleted(js.getBoolean(GTaskStringUtils.GTASK_JSON_DELETED)); + } + + // completed + if (js.has(GTaskStringUtils.GTASK_JSON_COMPLETED)) { + setCompleted(js.getBoolean(GTaskStringUtils.GTASK_JSON_COMPLETED)); + } + } catch (JSONException e) { + Log.e(TAG, e.toString()); + e.printStackTrace(); + throw new ActionFailureException("fail to get task content from jsonobject"); + } + } + } + + public void setContentByLocalJSON(JSONObject js) { + if (js == null || !js.has(GTaskStringUtils.META_HEAD_NOTE) + || !js.has(GTaskStringUtils.META_HEAD_DATA)) { + Log.w(TAG, "setContentByLocalJSON: nothing is avaiable"); + } + + try { + JSONObject note = js.getJSONObject(GTaskStringUtils.META_HEAD_NOTE); + JSONArray dataArray = js.getJSONArray(GTaskStringUtils.META_HEAD_DATA); + + if (note.getInt(NoteColumns.TYPE) != Notes.TYPE_NOTE) { + Log.e(TAG, "invalid type"); + return; + } + + for (int i = 0; i < dataArray.length(); i++) { + JSONObject data = dataArray.getJSONObject(i); + if (TextUtils.equals(data.getString(DataColumns.MIME_TYPE), DataConstants.NOTE)) { + setName(data.getString(DataColumns.CONTENT)); + break; + } + } + + } catch (JSONException e) { + Log.e(TAG, e.toString()); + e.printStackTrace(); + } + } + + public JSONObject getLocalJSONFromContent() { + String name = getName(); + try { + if (mMetaInfo == null) { + // new task created from web + if (name == null) { + Log.w(TAG, "the note seems to be an empty one"); + return null; + } + + JSONObject js = new JSONObject(); + JSONObject note = new JSONObject(); + JSONArray dataArray = new JSONArray(); + JSONObject data = new JSONObject(); + data.put(DataColumns.CONTENT, name); + dataArray.put(data); + js.put(GTaskStringUtils.META_HEAD_DATA, dataArray); + note.put(NoteColumns.TYPE, Notes.TYPE_NOTE); + js.put(GTaskStringUtils.META_HEAD_NOTE, note); + return js; + } else { + // synced task + JSONObject note = mMetaInfo.getJSONObject(GTaskStringUtils.META_HEAD_NOTE); + JSONArray dataArray = mMetaInfo.getJSONArray(GTaskStringUtils.META_HEAD_DATA); + + for (int i = 0; i < dataArray.length(); i++) { + JSONObject data = dataArray.getJSONObject(i); + if (TextUtils.equals(data.getString(DataColumns.MIME_TYPE), DataConstants.NOTE)) { + data.put(DataColumns.CONTENT, getName()); + break; + } + } + + note.put(NoteColumns.TYPE, Notes.TYPE_NOTE); + return mMetaInfo; + } + } catch (JSONException e) { + Log.e(TAG, e.toString()); + e.printStackTrace(); + return null; + } + } + + public void setMetaInfo(MetaData metaData) { + if (metaData != null && metaData.getNotes() != null) { + try { + mMetaInfo = new JSONObject(metaData.getNotes()); + } catch (JSONException e) { + Log.w(TAG, e.toString()); + mMetaInfo = null; + } + } + } + + public int getSyncAction(Cursor c) { + try { + JSONObject noteInfo = null; + if (mMetaInfo != null && mMetaInfo.has(GTaskStringUtils.META_HEAD_NOTE)) { + noteInfo = mMetaInfo.getJSONObject(GTaskStringUtils.META_HEAD_NOTE); + } + + if (noteInfo == null) { + Log.w(TAG, "it seems that note meta has been deleted"); + return SYNC_ACTION_UPDATE_REMOTE; + } + + if (!noteInfo.has(NoteColumns.ID)) { + Log.w(TAG, "remote note id seems to be deleted"); + return SYNC_ACTION_UPDATE_LOCAL; + } + + // validate the note id now + if (c.getLong(SqlNote.ID_COLUMN) != noteInfo.getLong(NoteColumns.ID)) { + Log.w(TAG, "note id doesn't match"); + return SYNC_ACTION_UPDATE_LOCAL; + } + + if (c.getInt(SqlNote.LOCAL_MODIFIED_COLUMN) == 0) { + // there is no local update + if (c.getLong(SqlNote.SYNC_ID_COLUMN) == getLastModified()) { + // no update both side + return SYNC_ACTION_NONE; + } else { + // apply remote to local + return SYNC_ACTION_UPDATE_LOCAL; + } + } else { + // validate gtask id + if (!c.getString(SqlNote.GTASK_ID_COLUMN).equals(getGid())) { + Log.e(TAG, "gtask id doesn't match"); + return SYNC_ACTION_ERROR; + } + if (c.getLong(SqlNote.SYNC_ID_COLUMN) == getLastModified()) { + // local modification only + return SYNC_ACTION_UPDATE_REMOTE; + } else { + return SYNC_ACTION_UPDATE_CONFLICT; + } + } + } catch (Exception e) { + Log.e(TAG, e.toString()); + e.printStackTrace(); + } + + return SYNC_ACTION_ERROR; + } + + public boolean isWorthSaving() { + return mMetaInfo != null || (getName() != null && getName().trim().length() > 0) + || (getNotes() != null && getNotes().trim().length() > 0); + } + + public void setCompleted(boolean completed) { + this.mCompleted = completed; + } + + public void setNotes(String notes) { + this.mNotes = notes; + } + + public void setPriorSibling(Task priorSibling) { + this.mPriorSibling = priorSibling; + } + + public void setParent(TaskList parent) { + this.mParent = parent; + } + + public boolean getCompleted() { + return this.mCompleted; + } + + public String getNotes() { + return this.mNotes; + } + + public Task getPriorSibling() { + return this.mPriorSibling; + } + + public TaskList getParent() { + return this.mParent; + } + +} diff --git a/doc/精读报告/gtask/data/TaskList.doc b/doc/精读报告/gtask/data/TaskList.doc new file mode 100644 index 0000000..37dad1c --- /dev/null +++ b/doc/精读报告/gtask/data/TaskList.doc @@ -0,0 +1,401 @@ +/* + * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package net.micode.notes.gtask.data; + +import android.database.Cursor; +import android.util.Log; + +import net.micode.notes.data.Notes; +import net.micode.notes.data.Notes.NoteColumns; +import net.micode.notes.gtask.exception.ActionFailureException; +import net.micode.notes.tool.GTaskStringUtils; + +import org.json.JSONException; +import org.json.JSONObject; + +import java.util.ArrayList; + + +public class TaskList extends Node { + private static final String TAG = TaskList.class.getSimpleName();//tag标记 + + private int mIndex;//当前TaskList的指针 + + private ArrayList mChildren;//类中主要的保存数据的单元,用来实现一个以Task为元素的ArrayList + + public TaskList() { + super(); + mChildren = new ArrayList(); + mIndex = 1; + } + /* (non-Javadoc) + * @see net.micode.notes.gtask.data.Node#getCreateAction(int) + * 生成并返回一个包含了一定数据的JSONObject实体 + */ + public JSONObject getCreateAction(int actionId) { + JSONObject js = new JSONObject(); + + try { + // action_type + js.put(GTaskStringUtils.GTASK_JSON_ACTION_TYPE, + GTaskStringUtils.GTASK_JSON_ACTION_TYPE_CREATE); + + // action_id + js.put(GTaskStringUtils.GTASK_JSON_ACTION_ID, actionId); + + // index + js.put(GTaskStringUtils.GTASK_JSON_INDEX, mIndex); + + // entity_delta + JSONObject entity = new JSONObject(); + entity.put(GTaskStringUtils.GTASK_JSON_NAME, getName()); + entity.put(GTaskStringUtils.GTASK_JSON_CREATOR_ID, "null"); + entity.put(GTaskStringUtils.GTASK_JSON_ENTITY_TYPE, + GTaskStringUtils.GTASK_JSON_TYPE_GROUP); + js.put(GTaskStringUtils.GTASK_JSON_ENTITY_DELTA, entity); + + } catch (JSONException e) { + Log.e(TAG, e.toString()); + e.printStackTrace(); + throw new ActionFailureException("fail to generate tasklist-create jsonobject"); + } + + return js; + } + + + /* (non-Javadoc) + * @see net.micode.notes.gtask.data.Node#getUpdateAction(int) + * 生成并返回一个包含了一定数据的JSONObject实体 + */ + public JSONObject getUpdateAction(int actionId) { + JSONObject js = new JSONObject(); + + try { + // action_type + js.put(GTaskStringUtils.GTASK_JSON_ACTION_TYPE, + GTaskStringUtils.GTASK_JSON_ACTION_TYPE_UPDATE); + + // action_id + js.put(GTaskStringUtils.GTASK_JSON_ACTION_ID, actionId); + + // id + js.put(GTaskStringUtils.GTASK_JSON_ID, getGid()); + + // entity_delta + JSONObject entity = new JSONObject(); + entity.put(GTaskStringUtils.GTASK_JSON_NAME, getName()); + entity.put(GTaskStringUtils.GTASK_JSON_DELETED, getDeleted()); + js.put(GTaskStringUtils.GTASK_JSON_ENTITY_DELTA, entity); + + } catch (JSONException e) { + Log.e(TAG, e.toString()); + e.printStackTrace(); + throw new ActionFailureException("fail to generate tasklist-update jsonobject"); + } + + return js; + } + + public void setContentByRemoteJSON(JSONObject js) { + if (js != null) { + try { + // id + if (js.has(GTaskStringUtils.GTASK_JSON_ID)) { + setGid(js.getString(GTaskStringUtils.GTASK_JSON_ID)); + } + + // last_modified + if (js.has(GTaskStringUtils.GTASK_JSON_LAST_MODIFIED)) { + setLastModified(js.getLong(GTaskStringUtils.GTASK_JSON_LAST_MODIFIED)); + } + + // name + if (js.has(GTaskStringUtils.GTASK_JSON_NAME)) { + setName(js.getString(GTaskStringUtils.GTASK_JSON_NAME)); + } + + } catch (JSONException e) { + Log.e(TAG, e.toString()); + e.printStackTrace(); + throw new ActionFailureException("fail to get tasklist content from jsonobject"); + } + } + } + + public void setContentByLocalJSON(JSONObject js) { + if (js == null || !js.has(GTaskStringUtils.META_HEAD_NOTE)) { + Log.w(TAG, "setContentByLocalJSON: nothing is avaiable"); + } + + try { + JSONObject folder = js.getJSONObject(GTaskStringUtils.META_HEAD_NOTE); + + if (folder.getInt(NoteColumns.TYPE) == Notes.TYPE_FOLDER) { + String name = folder.getString(NoteColumns.SNIPPET); + setName(GTaskStringUtils.MIUI_FOLDER_PREFFIX + name); + } else if (folder.getInt(NoteColumns.TYPE) == Notes.TYPE_SYSTEM) { + if (folder.getLong(NoteColumns.ID) == Notes.ID_ROOT_FOLDER) + setName(GTaskStringUtils.MIUI_FOLDER_PREFFIX + GTaskStringUtils.FOLDER_DEFAULT); + else if (folder.getLong(NoteColumns.ID) == Notes.ID_CALL_RECORD_FOLDER) + setName(GTaskStringUtils.MIUI_FOLDER_PREFFIX + + GTaskStringUtils.FOLDER_CALL_NOTE); + else + Log.e(TAG, "invalid system folder"); + } else { + Log.e(TAG, "error type"); + } + } catch (JSONException e) { + Log.e(TAG, e.toString()); + e.printStackTrace(); + } + } + + public JSONObject getLocalJSONFromContent() { + try { + JSONObject js = new JSONObject(); + JSONObject folder = new JSONObject(); + + String folderName = getName(); + if (getName().startsWith(GTaskStringUtils.MIUI_FOLDER_PREFFIX)) + folderName = folderName.substring(GTaskStringUtils.MIUI_FOLDER_PREFFIX.length(), + folderName.length()); + folder.put(NoteColumns.SNIPPET, folderName); + if (folderName.equals(GTaskStringUtils.FOLDER_DEFAULT) + || folderName.equals(GTaskStringUtils.FOLDER_CALL_NOTE)) + folder.put(NoteColumns.TYPE, Notes.TYPE_SYSTEM); + else + folder.put(NoteColumns.TYPE, Notes.TYPE_FOLDER); + + js.put(GTaskStringUtils.META_HEAD_NOTE, folder); + + return js; + } catch (JSONException e) { + Log.e(TAG, e.toString()); + e.printStackTrace(); + return null; + } + } + + public int getSyncAction(Cursor c) { + try { + if (c.getInt(SqlNote.LOCAL_MODIFIED_COLUMN) == 0) { + // there is no local update + if (c.getLong(SqlNote.SYNC_ID_COLUMN) == getLastModified()) { + // no update both side + return SYNC_ACTION_NONE; + } else { + // apply remote to local + return SYNC_ACTION_UPDATE_LOCAL; + } + } else { + // validate gtask id + if (!c.getString(SqlNote.GTASK_ID_COLUMN).equals(getGid())) { + Log.e(TAG, "gtask id doesn't match"); + return SYNC_ACTION_ERROR; + } + if (c.getLong(SqlNote.SYNC_ID_COLUMN) == getLastModified()) { + // local modification only + return SYNC_ACTION_UPDATE_REMOTE; + } else { + // for folder conflicts, just apply local modification + return SYNC_ACTION_UPDATE_REMOTE; + } + } + } catch (Exception e) { + Log.e(TAG, e.toString()); + e.printStackTrace(); + } + + return SYNC_ACTION_ERROR; + } + /* + * 功能:获得TaskList的大小,即mChildren的大小 + */ + public int getChildTaskCount() { + return mChildren.size(); + } + /** + * @param task + * @return 返回值为是否成功添加任务。 + * 功能:在当前任务表末尾添加新的任务。 + */ + public boolean addChildTask(Task task) { + boolean ret = false; + if (task != null && !mChildren.contains(task)) { + ret = mChildren.add(task); + if (ret) { + // need to set prior sibling and parent + task.setPriorSibling(mChildren.isEmpty() ? null : mChildren + .get(mChildren.size() - 1)); + task.setParent(this); + //注意:每一次ArrayList的变化都要紧跟相关Task中PriorSibling的更改 + //,接下来几个函数都有相关操作 + + } + } + return ret; + } + /** + * @param task + * @param index + * @return + * 功能:在当前任务表的指定位置添加新的任务。 + */ + public boolean addChildTask(Task task, int index) { + if (index < 0 || index > mChildren.size()) { + Log.e(TAG, "add child task: invalid index"); + return false; + } + + int pos = mChildren.indexOf(task); + if (task != null && pos == -1) { + mChildren.add(index, task); + + // update the task list + Task preTask = null; + Task afterTask = null; + if (index != 0) + preTask = mChildren.get(index - 1); + if (index != mChildren.size() - 1) + afterTask = mChildren.get(index + 1); + + task.setPriorSibling(preTask); + if (afterTask != null) + afterTask.setPriorSibling(task); + } + + return true; + } + /** + * @param task + * @return 返回删除是否成功 + * 功能:删除TaskList中的一个Task + */ + /** + * @param task + * @param index + * @return + * 功能:将当前TaskList中含有的某个Task移到index位置 + */ + public boolean removeChildTask(Task task) { + boolean ret = false; + int index = mChildren.indexOf(task); + if (index != -1) { + ret = mChildren.remove(task); + + if (ret) { + // reset prior sibling and parent + task.setPriorSibling(null); + task.setParent(null); + + // update the task list + if (index != mChildren.size()) { + mChildren.get(index).setPriorSibling( + index == 0 ? null : mChildren.get(index - 1)); + } + } + } + return ret; + } + /** + * @param gid + * @return返回寻找结果 + * 功能:按gid寻找Task + */ + public boolean moveChildTask(Task task, int index) { + + if (index < 0 || index >= mChildren.size()) { + Log.e(TAG, "move child task: invalid index"); + return false; + } + + int pos = mChildren.indexOf(task); + if (pos == -1) { + Log.e(TAG, "move child task: the task should in the list"); + return false; + } + + if (pos == index) + return true; + return (removeChildTask(task) && addChildTask(task, index)); + //利用已实现好的功能完成当下功能; + } + + + /** + * @param task + * @return + * 功能:返回指定Task的index + */ + public Task findChildTaskByGid(String gid) { + for (int i = 0; i < mChildren.size(); i++) { + Task t = mChildren.get(i); + if (t.getGid().equals(gid)) { + return t; + } + } + return null; + } + + + /** + * @param index + * @return + * 功能:返回指定index的Task + */ + public int getChildTaskIndex(Task task) { + return mChildren.indexOf(task); + } + + public Task getChildTaskByIndex(int index) { + if (index < 0 || index >= mChildren.size()) { + Log.e(TAG, "getTaskByIndex: invalid index"); + return null; + } + return mChildren.get(index); + } + + + /** + * @param gid + * @return + * 功能:返回指定gid的Task + */ + public Task getChilTaskByGid(String gid) { + for (Task task : mChildren) {//一种常见的ArrayList的遍历方法(四种,见精读笔记) + + if (task.getGid().equals(gid)) + return task; + } + return null; + } + + + + public ArrayList getChildTaskList() { + return this.mChildren; + } + + public void setIndex(int index) { + this.mIndex = index; + } + + public int getIndex() { + return this.mIndex; + } +} From a75ef7d92a6025db09dbf2f5f59ec001e1ddea3d Mon Sep 17 00:00:00 2001 From: m3yv74fzq <1710331409@qq.com> Date: Thu, 20 Apr 2023 21:03:16 +0800 Subject: [PATCH 3/4] ADD file via upload --- QQ图片20230420210242.jpg | Bin 0 -> 17274 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 QQ图片20230420210242.jpg diff --git a/QQ图片20230420210242.jpg b/QQ图片20230420210242.jpg new file mode 100644 index 0000000000000000000000000000000000000000..9723bd989e2e0235789c1830d3b72165022c01a7 GIT binary patch literal 17274 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 UZ*%Woy8c&E=b!YN5Tob*A9$b<(f|Me literal 0 HcmV?d00001 From a631cec69c31ba11a4e6975713e6e60f53989856 Mon Sep 17 00:00:00 2001 From: m3yv74fzq <1710331409@qq.com> Date: Thu, 20 Apr 2023 21:12:47 +0800 Subject: [PATCH 4/4] ADD file via upload --- doc/用例图.docx | Bin 0 -> 53043 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 doc/用例图.docx diff --git a/doc/用例图.docx b/doc/用例图.docx new file mode 100644 index 0000000000000000000000000000000000000000..dccec79714b32295690942117ce2e159a36353da GIT binary patch literal 53043 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 Mp#W>aZJ59Q7X_Da&Hw-a literal 0 HcmV?d00001