From 75dd91474e9dc78a46f41a798a0779e0a462cb74 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=9C1=E2=80=9D?= <“2701956759@qq.com”> Date: Sun, 18 Jun 2023 14:53:42 +0800 Subject: [PATCH] Last --- ...220320008崔盼娣-实践总结报告.docx | Bin 0 -> 12778 bytes other/07_220320008崔盼娣_代码标注.txt | 576 ++++++++++++++++++ 2 files changed, 576 insertions(+) create mode 100644 other/07_220320008崔盼娣-实践总结报告.docx create mode 100644 other/07_220320008崔盼娣_代码标注.txt diff --git a/other/07_220320008崔盼娣-实践总结报告.docx b/other/07_220320008崔盼娣-实践总结报告.docx new file mode 100644 index 0000000000000000000000000000000000000000..d941e7f0852fe829aa764631c70d262040c4d479 GIT binary patch literal 12778 zcmb7r1yo$i(k|}qZXvk44DRmEKyY_=_u#Gx?jBr%I|K>t1PKIp=fOGm+;dO<`@i*G zuQkljU0+vq)!sF`tG`i{0f&GCd23K?G55{&zijH>nPK=7LVi>O-Fn@?; z1O^NPK|w(5!9YMz{!`4r-k!nT#yUG*Nuh@cBV=9f5qWg2$rT)9ybvM`fct(iNn*ws zd#<@bP6y`ED~gp#-=}Ra>vB{Ic`O!)PdLd_I!ia9j3-eNTvfOpq@!SWWuGzH`^l0_ zbk=wv9N8ys8EvKMBrq40kV1?qo>!pP3iu8|^G5g!%vTXV}=%sX&oAD40#ZHQfNvGJRM}W8 z!rw`Uz=q-DN2G$Q5_5e%(%Gb8(9x2MnuFpYZuJJmrGheI=$7R{m?%%G%O&t^m;@IM zB!LcOD3F>hl@iur4Tg-Qm&&krzyEP#4Yu&UZ;%^@BF&%~bjd_Plu-GUNQ=Lu0um;M zG>D*JDvbx@#T~Ik_hoUChIazM9#ywi8r3$6<^AsZxJBN}NKH+Cr-Aw45o0}up=wF( zNR`8_AGAMr}*OAjJ7@(8)=&Ziaz+CQi4Ok@TRJ&ub{S? zA(0xN?B?$8jIJ)%Zts8W%CQuUm-u!%z->9BR_hUe<=2}VH3|2N@)>Bix)mreLtihF zfIS00I0;(;+oA{z)LQZ`Ua$(gHqkkHNx#MaXH+a6#A;|?qk{Sx74&~Z#l^|l&gLyH zh4J5HUgI)&68IuA%qN%8sKc`q^SmGk;Icoac`w%_oR~zOjdbS6X(WHPAr>2Z^5cU4 zq{I1+2I^#}VLy3HaKmWBVOVu})CVf3(MmGF%=+E3sbYfJMjxW)ZWHIeczL|lveOUl zU^ZMXO{_=DD*GwoU_dkfTV_s|973N-u2o&b0|hcA9& zjgi?$W42y+*|s^pJqmi1*6XGll`-Y5F%AgBG^HQ>gU~1pSi;f_Wu=uX6AiDB+Rs*G z{VDM`)xY|A+b_5pHfG)Dt~wk|O0?k&U>mu}+sl4Hxjhc`MG4`OnsQ6aEAJJs=_wxv zHasxrh-1|t%<^yc~t2_O`ys4Acs2I%ukt;w8zAMV)?vM3 zpZDh4`PkFp6tdr`y;s6c6X`bsMHDm2_$K>#kDRQ-6SK7p3A(m-Xhgle$&&9Ae7lWG8(PzG`9$HYVgD^3k~wf3AA-g#<=VgadNaJI= z)e;m!nj+k@-fj7gh?ob3*So|Shct$lA+|O%B(0?JIG~60do446(22j7q5ue6mm3 ziLLjaCFY;GDJV$YVGmIN6R^J_=35yo!tk?_lOBO8Yr;DU;|eM1Q0+xbijvD>Tcg^i_~FuyopsCQ1~j(W?VDgs>hdO9aV6omtK*yMNr zY?lLjLVv^P1d^g%*wHiQcRleVf`A3&Aqour${NpqAx=)wVgO$Yk;tx37Vk;7kv|D4 zBQkLOL`chtLTWrc8nmo|z@;n{iw3E|Zx)6)pFhrW<^kuj(@Yb>L+F|(G5%$`FJSS0@A(fTN#Pwsv5>OpHWEAg2xp#6% zu7%*3CV4%|K{0xN$iilF=4>qBS;V(kJH>ObQbgG%fBF18b~1t>ynlv60iTU`KVZXv z&Mi@qrDoqDWl%YljCl!raT^*I7sfMoBa}jwbxx2%qTXe4S>WBTqAB1&d!`LDg%Kq9{IWe#h4PNWh6sd0Fo#RQQKoZPS`>x-itLz)pDtWT~xma!`v z8Dth^Cet=Vi<8&tdCAC^BAV z!>82!N_uZ4Vaunv$&dP6>12|bk))jT5oU0cnvE@-vv<`7aZoq`t)!5SR8>YxxF)4; zb#rO(s+wdr4t*bf!Qf}Qzs)~B-k9GGeu+bI;WmT(WTLpV<{YQ&q53KiADUj*O?2$G$dzdm65RAeLB271o^?VCn z$k}JCn%UD=J@*p&=R2{Lcn@0#v*{N&b;q|HWH4xR4&m;2n&&AAXq|-1xfrr1LI_r< z22G}-i{I{!l$maUuUA%70(Q-H5AY=my?{|GNwY{M+!GSq4<5cc$D+zERCMuEJzHG4 zS9#|_S6dxcMP+II_&MUuAsPcja5vdFo1sb#zq+gF5k)+q5-){DUNLFVC)h!2qedOw zA>|C+A$f~>U{BElt#Eu52kEd_aR^iC;OlFYY(>;T+=hJw4L`b0Wl7cX7k~e zl4tMWlpn(bF$D7d{+G+|;B*#lR|U^!wvU>>GC~DFt8ojE-e{Nfv`P*uQS`<-w=!*U z$tP!2u1%nH7hQ3h?gl_@XMD;Cr&5ZnC0(Xuu1?C|TJ*Sr4SN4ROJaW=4}VEjReze$c(#gN*doZD_+Ea-H;wzP9yZc$-GW69=%~ae|tX!Lz!X`q62(jK^QLPSx1;tcvtp!9X3VQ1YyuQL` zSaJiF7bKsaxg=-_u_0B1bFuz>6(!l@5*Qbn$YE+Z)9gqSky@2nai=5I&r=1wnC5H` z@{o9Py($6X7iXfM9r^&6eSL86J1jzTB2BhJ(cqmTEL7dB^TNko8IDaSa z+AiYoc%2u?GLaLre>bwX{>$QI|QP9_1Tu|&wCU9*Cdd2 zul;fC9x4G9!`#vxnNnkHdT*s{kj={#o76kV2+v8~xs@!D^!YZWf~Bb3 zVl#@db}c0-QU9ffmlGkfaMnt9U*X$n;-`ZJv$Nd*9vtZR-32i=8&Q>jhK$IXvjP0- z=2{FzFQo56%MCcHfW+y2`RMu(FHBLznv*QMY(~+(&;D6e4s&+}B@T`DU+?Y()}Jpp z&yS88ML(s zEP|?uM|E0RO$QH@IhI81xD_UZ=*0utxq|SBaP>@JFN_OWel|P~z#H2722*A%!11>S zmUHV3=Mlr-95XxSwBH)Ov)T}{K>%(ETRVC@9GY@EYAe-=e%~n-u5LRoxzwGS74b1{ zKbE<|Dj~FwXbR2!F>E&|sPk=z+m?Ii^2*yK5Us67Cq#ag#_9-zPw?exP%cJ45%x3pj=^o@rsRYem`z|{{7=t*(P!QwW8uz(O;`mpXdJ}o zy)I-$lUjZLe)RqhxGv4BffAX;Az#|#IAiYnUHawOa&#ADzVHppEDKwLoxPsVp6vnp zwOHhjkRl||!-;-0IOy^8EBTAS4hKCiXt{SkF!fsm!lVl~C@jD#8Kblu-`nF&S-QNV z^-MXQQf|A{RobpF(k%4?VP~pnwW)+N;7G5!wRKvU<00Ucni7 z;-8XIrOhUOnzEP<96fyMQPZNfCyCQy)`VvdnYALiSJnH@HS+LjBGygEs7QUkU^!Z( zJ~^j*%s1GOc1WVN_=tPo-b_9alde-w%*UkqXm}yroKv4Vvb>Jdhh57pN3|uQ9r#^0 zL<$36UDj?kEi*MjIyt4pE5&G{m#i_h4q(NK+P;3icBB7v)T{se`6K(1kBFAxGH-pa z=fLM{Y}Fnn4FyYB5nl@QD&Lm?Zr2|j&ML_zKDYNx>yHm^TzLV~nI06LpX=gg^5*7&TZU(|`JP^=#op31UUrdKq&5|3vm2NNLBDWUumj6Jb2!FH zY{w0`5}xjS{nPKC`^QSX@sFtxARu1wf9~r4*yA{vI6GU|n*FhbX;9a)+v36S{W|@G zOm&hJT*-#V69@)`_>%oah1rgRd1Fq-m>1&q%86jGD|_0KP2&P%k8Yitzx=EBDwDRB zQEB)Fkdf=618%og5=P&(W3O1L;fGq1I6z3%e&woB(?g%}}NWOBQ~XdRWaK3|WLneu*_B!s;e zO^(-udylnL5^PvY!ptBbFY+7%EaygX7+{(Y>CfoH@J7+Clq@5_dr)C(-Wmz05NPYm zP@+tQel|=-y{Hp5V+HmtxP4_ER6hQh4(LX5i!J}7}O7wA-BoM1&L{woK-9O@&UYHiiq*sMLj^xjF~Z;Yeajp1oYSEZ8c4T zHHMZrbNO7r#pivXu+4Gshh%_k?MKp8#f9ir4c3p`E6`;=Bt^m!=}BZih7rXD!Oz$O zbs&l1V}d77AQJ0}h{&0YR22M!xiNe`%2m4Xt&>r>2e6cVngmRfx$I`R45m)Cf{sx#Jbtked`WhzA(l!djnt6L!(q_Q z_zH%utQcmYts!i}XAGFrni8C&U7n#Bf_ofzNBU`yV>g_P=m$)du!CRunV@kTy^|+t zgdV1F#PASKKKpV0t(;PUIv=YeoT>OHaxyUhU2Ytatul`6R3zOcXN7?!Mje$$NCqBy zj2)9!)g^sc_zarF=9K-%MzWcZ3K#CWAOwaX)F86D?~Yt@qJexLOcD-hzmGQ|^A1og z7+Mkz?rMmDIYRCagapN}DZ}8+qb_a|DI9NLK@4O^pMLT>O$SfQoLuQm^Ia-(4@MP5 zg?e0PR^PT3mEs|tbURO>oFw!c$I+szfdGfF00cC?Q{EQKvT1tJZ)*SmzVm+cKar$S zxxa=1T}eeluK}{4iw{AYh#cQ9idJNxC!Wefc7M+A-I2OhYFrMH9n0KtVu=)7>29 z%Gn+c1wa3;=;8`Q{sE2{nr2#;KhcI5s0^hf19Ed=FhD9K*|BMmB@=1X zO4FjWAw?!>iNR?%(6qkq9f3HxlXLR;yW)NWHR9S20&CTUpcRBYiD7tp?)_iz@_Pe& z+V2U{g$E_~bI59D+{zDTznhDERm4pXBhC5D)?j7RiO@>KuEN7)iT8}=PJ$(HVbZZZ z3s3Zjt9KS;=%f|LfGplcBvb|8E+vk!<`66*nGSC$>2{8zMe|Ou{mC$)pd+AUP6a zE96K6hd~vG#my!-C4($B1%f#FneX!J_mCjACsabmLQHC{HY9+B%KQdHu69N)`-B)L7;&lEGw4jc!DyOg1jm0 z%GQNkc%np3zG8l7@^mJ%tRZ7=Wh%OZr_)0f4#V1u3@GLp5*6pd(6g@i3x9ayRN(0uA<_Hr5EJ*GK=Y5 zJs(P^?T$Ed)`014)6}wD`(&jUQ(e7*zmqNBU~o78IW57tJ&i5IOd z6L;S4-Mu?G(eLznxcmjUWYJ5zRXZQGcTYjkUT=4QI`1E@XIy{0{l4iFmY)kt90vh^ zLcxE2TmwN-Qf~y^CF08;CG;`eqBc<+tWZ+S;r3)?L3lljERvuZXuWqv1WoS%TCG5& z8T`QfNpkDd{hd7B2B?v9s)HGpZHcCM26Q5uBlI3Rx*K$^h{hp@bR~@&C2lyCLyPs` zLY_xvo@yRUv8Lw%5x&u3+NzImMLSWPKWn%6belpuP&A7gH|{mNV2OK?2eirpA#&H$ zZIO;W+CH|Lu6BoUpyeQn5^h7MXG*#(`H{YPaWF3NLd(p${j8>fDxf zKaiN|0aj^V5jv@g{)R8G((zLjl$(%S*DQHMjFfZx8 z1x*fgGr<#7GT`pICFp#|ym7fU`84sO^a_b`V$j4+Dt~@6CAnqXU2@IG;P|tYCw^~z z%~JN-uX8Wp^~+6b`>{u-H@hATlX?9T^e(<_$CLcrai>J^bZ3@wJL4skuHZ7P7gNdM zB`5}VaV=eF^?_6<2o}SZlX917UHxYhjfL%6N7Pb2K!tFIZ?h z7}Dq9sCwaJ7U48iTT7d(vU4(ko!=)EEuw;JSFF)^SX;v)a6;T0d1ilVnP)Z4jf+Xq zd(vRm>*BECX*@^ui&-JMjxGtRs8E|95H>vCn5FQyFc?Eea49rnW$PlMkul#;NojXx_$onVSRziX(BPB6oY1vU42`sjBSqR` zv})jM1sw1dw9eNwZIRVNx_Jm6Tu+BK$P~$$(7K zfYgMLIQqGDWuuJYsylVX>RfMvDLV1`7{f>pqtr`S){q*(x%b&IHgcl z6tf3KV)H}X6-TYb_@!gGc`ZNFQ_4!J_SKnbd)g7{cFqmu);_Q+Fn^J$@7e*=lAE1JxkL6qRAvPSY!0Z-#1}~C-*Qso#{St2Q+|?C|EC}E^rEwE39D)=MYJ7qG=kqZv+wkq?>j9-V z$$vZ_zaCb)*qGQl|M6v^y{fV-iRSmU?15O<7g?W_dJE2a$A~kzby@Xbq0*~e*%}nC zu^_>?eUTE~um*8q*Z*{!GFi`OGu?4SuvW!Y!I)l`Er$M>k$+ zadBI*-zp!U?#phm;v_4%WoyCE>e_V*N3}%KleA#MLtBTy^XY0KL$w4a1UCr;rq(jX=vhBC@Z=Z0}gsNL3l_`b}+O}YS~88jA)iCObG|(Hc@H&SxHVp z^&Y&p*MJo9B!PVY1J%6=SXryo+F>Af-2w(IgYPT4Z5BLMunBb)kD~Z>p56q6=b~-2 zG(=&cs^cdq9kleO;Vj`&M7Q`UB8?Cd$le;hwB}*j(K@oX7_^*$(ydOw3h1qhUML?{Pa?&6@jf6=^}4E?Jer;d?CYk8KnY#-au9_pb3JdkFtU+GH6U{z7L2~wow zB3hJ;9#zfmY}A&-LQwxMyn z$|w%QExK{iA6_so%H^S#HZe#A#G2`tT ze4w9^cCoKIzVpZ64xF=go6_^=vhuoG-UN?l414;5`=)3f(a$avs8PrH$)_d1vobvj zC78sZ7DUP;=M!_)kUIQPhZLFTsqi>l0$LlblhW~AP98;v#!WivQw{gDB`1dgWfw`6 zd;mKBgclDcy^RHyRs^9SN04L;#6{p;9$;BtXBTpTf`jYp{EXH@obnWUF`$@Ln2lZB z3}Ya&Z<5yWR4L*K=-m5AED5@QnbalH_wcng&P@Y}OSP4*M1abTEdu#Hw?DT}LJ_{~ zj;);;HqC4(XA=|zA~%df82+Gthb=^*?_#MU5S&@bSEIV3(^J~;Y#oVWtRq1SuX1AW z&=9xtLvoYFd7+29aV7Cma-P;2s2n?fgFa%=noIhuG`iUx`+b`6y!kbuPpU*f;ZZ1KGR#>^-1TwXrFOkD~d#pzn*@6P$J!kMfzVY_gmxkz(U-p)@nRll_7tIVq0M+&*#CD{IwTr)Mb*}zo7uADc{FL1C^-*cR6AEq}8;=T41T>q`F_zC2G)9jL?Bb-*r1cq1Xd{XCQx`q* z`~D{*EVfLLa47>+U31I8q6<38WbuF+!Mi_KBxx)MVNaa%hl=xUew9Gto)X!GY_)%%VglTc`(5QGrmUAxC*3uec(2&>sRta-=$%g z&yeav;!8^_Tj626Gs**W)taNd03}W__G}|aFbUe{97%{h{_*Z#meA!yM4%fPb16;$ zpJxcAy;So?rAGa{Z_V!Q!lY+P_W~~*LRY^bw1BDYa`&nQK0Gp zcNjpL8LK3xvDcVR+205P8#iT$mlHWACT+pet&HsEmXux5K2`uCnUPj-L2Z@WvpU5< zuoMC?Q_iLq{7|1{I2_N*CZZh^L_jmy0Px_DpvYlKvq8ug-mROxVAe<}oMOe(S|kAK zJFrLE`4=gK7#5*f-l{!(|g1SrqyF%IA z>);laKbh{6pc`bhgg*ml(TcdKfRI;MRJ#3%7g4!b=-1t$X-QwKo0L~FenLW4lUL6c z6-G0OMDY$&)q$LEa7}|__>%mz7t|CRw`B6bq$)OO2~@_AizqXBkq1PvCgB#1IyEhy zH=2YZSA{BZnk}ZHf+76qloKGn5oc{O_zN_O+0EUNu4Q^cz6K4zVQ9nnZcJ+;ZV=4N zZM3TW$0ow<=AfOg_U?4X!w*}GD24bA*bLy-plL?9FgzA0y3#$l24nX)OPyyK5uQ7# z-g?x<_L{&K0{x{D1|nhFHSJsTQ}Z=qgm52WF7qtwz|5U@$~b#Ig;Cd|S}U!J-!5k0 zzun?v7(OLzdTLl!;t`t4b2W+N!5dcum%;f)MMWNrfn|-;6xX&?5YY)3tfrKDWOy22 z&wUWK@)+>!rC||-t=ClA#c*pyn|sX5jUcl(Nuf2DU+gzw=YCRc{Al#b4GPD9tR0`iZ+P1@zwL6<}8>TrP)X_cM^9Ql-dvs4lQ@2Z8WTOou}+h zf$9%lexahMx(!YGMor(FMSCu0t44vkL=7)qLcKa{nrEH$Gx5tU2t76Mt8(66pK+QA zc%KO{9_$g-9(YLLKv7c{fEr7<4xjRHtlf{aq4BT75Y2uzNv+rcA`peiTPy z-PI-1J+G&rTf>W0#bF%6oA?;cw~~q=(D!xaxaK+^@)w(LdP57lWn?eP;{YOZgCG9S zJI;ST53Y18v(Q~4G*79ou!^U z$RouHoR4uAOS4i#4J{82<&wptQxt(;9@DKw#pT13QIIDFB25NbI(uI}E*dN<6jFTw z{}pn4VeD@z7JmcOpky71SWD%`JY`CbOa!x?{k|jWleXs-vCU1rkY-Y$*~~uxZLTG5 zqbycLE%OsTeT*A31b9M|AtXk9`EjSUO5IkuGRZQ5HeIpO;2WU)z@ev44wq4rx=$;w zAjP5>ZlrVjU%O$awvA0sW`PC9q&xFb8Wv3!q~bWR;#y|WSpdx#Ae?Ko*;tXsOFCq2j#7hWlx z+6~45Q>Yim@b(7thN%$zDEY`?;4Vk?Gr~%N_%nxMzbefI-}`3P){# zMTZMDP~egd|DzU^jzi!mtlAc{BtWq(Fvox%EXy>|W z%k9bt>kYYOuBM3p_i`N6>rJBXXkz_4vlEnzjQHtwZ1eSIdMnxeDZ}t4S(&gZ4bF@b z@=7Em9rNK_rXicQwiErCE$QP=n!bv-`WPqM;NunK*IZN8aq7roHsS3w|kHd5{vv{`Nz~}jRKL0%`zceF! z8T`>@1&E~v#a0=HP=%iL8`1XVFuxS*&b98d6*@n5UxREGH4zl;RI zSyQU#%)b}uW~TR54;aR zuhNT`nxM`*eL!Z%q!M0kVt|}H-Vw)EJzdyj&e-6b*S+~^ODpg2xl-UrA$@SSeC1$L zHnTwJlo{<@q7CXPz)9;X(w=wiOLRp_)WtRyN0|w+g`)WTe$_ve`TbEM{+mhsN}lsI zd?iX^yjFkTh>|)YuSxrL53jH4VQ=CDeA~)5B#qkkFrkRuB;O;)H>nx^%qyb-i{ekA zhrb7{Vg)Vt9cER$eUJw;0L742;*3XIz9CrGB>I>#VG1v49>^&6^=AY^J5uu5jB>kz z-nmyiDYZT|J|M{ul1jYyS9!NFCMc`kQ7r~*-Yv=d16-~UvG5I#0;FN;t$DU&rF{i< zNRQ=Tt5Sr3fa0tS1ZDz&P~~n)-QIgYy-e~Ns=C3ezECwd%zSoj)Xb5PYFDbeP{q>` zSELEqKKwb9bCO)#JKP$rn}Jz!6(J7w2)$$@L@h`@dD1-N+%5MJ&~e3iad5LSLJdX1 z`W?73fFn6MON|Tv$Q)_+-Dy?6>D6K%x3c{ns~bnfa+-e6SK+dZ&Uqkk$t7`s-AZu# z$B}idoa@N#aS1_L$5qK4ll=FvCy^6g!ovvbd-G%Xm%3A8Fq>m3 zz!@QUozFF+ZEo~_TwTXZ=(?f|C>RFF{~narxPX9yki7nNp!=^O`g4N+PSJeJG=H`? zruZuLUpeJ>rN3vMH_V?(L23TN{BfWB-;}*^*8gm8%HG<4FxdaO$lp2aZ^D1-qx?_U zzZmVmTl+ih`fqgI>(%^krGJsIe~16h5B?i23I3n(f3t=EZ;O5-!T#Ca7G3aqZ2T`u z?AwC>dr;nz)}QSSLP`6N%=EjlzbCOb;GdpS{3q~#q_p2>`n_!T_e>?P+3^pn|8tJt z;lDrS{S9xX_!s;i&wRh*e?L|K8z25ko&O(a?7zc*XBGbqAN" + Notes.ID_TRASH_FOLER + ") OR " + + NoteColumns.ID + "=" + Notes.ID_CALL_RECORD_FOLDER, null, null); + + if (folderCursor != null) { + if (folderCursor.moveToFirst()) { + do { + // Print folder's name + String folderName = ""; + if(folderCursor.getLong(NOTE_COLUMN_ID) == Notes.ID_CALL_RECORD_FOLDER) { + folderName = mContext.getString(R.string.call_record_folder_name); + } else { + folderName = folderCursor.getString(NOTE_COLUMN_SNIPPET); + } + if (!TextUtils.isEmpty(folderName)) { + ps.println(String.format(getFormat(FORMAT_FOLDER_NAME), folderName)); + } + String folderId = folderCursor.getString(NOTE_COLUMN_ID); + exportFolderToText(folderId, ps); + } while (folderCursor.moveToNext()); + } + folderCursor.close(); + } + + // Export notes in root's folder 将根目录里的便签导出(由于不属于任何文件夹,因此无法通过文件夹导出来实现这一部分便签的导出) + Cursor noteCursor = mContext.getContentResolver().query( + Notes.CONTENT_NOTE_URI, + NOTE_PROJECTION, + NoteColumns.TYPE + "=" + +Notes.TYPE_NOTE + " AND " + NoteColumns.PARENT_ID + + "=0", null, null); + + if (noteCursor != null) { + if (noteCursor.moveToFirst()) { + do { + ps.println(String.format(getFormat(FORMAT_NOTE_DATE), DateFormat.format( + mContext.getString(R.string.format_datetime_mdhm), + noteCursor.getLong(NOTE_COLUMN_MODIFIED_DATE)))); + // Query data belong to this note + String noteId = noteCursor.getString(NOTE_COLUMN_ID); + exportNoteToText(noteId, ps); + } while (noteCursor.moveToNext()); + } + noteCursor.close(); + } + ps.close(); + + return STATE_SUCCESS; + } + + /** + * Get a print stream pointed to the file {@generateExportedTextFile} + */ + private PrintStream getExportToTextPrintStream() { + File file = generateFileMountedOnSDcard(mContext, R.string.file_path, + R.string.file_name_txt_format); + if (file == null) { + Log.e(TAG, "create file to exported failed"); + return null; + } + mFileName = file.getName(); + mFileDirectory = mContext.getString(R.string.file_path); + PrintStream ps = null; + try { + FileOutputStream fos = new FileOutputStream(file); + ps = new PrintStream(fos); //将ps输出流输出到特定的文件,目的就是导出到文件,而不是直接输出 + } catch (FileNotFoundException e) { + e.printStackTrace(); + return null; + } catch (NullPointerException e) { + e.printStackTrace(); + return null; + } + return ps; + } + } + + /** + * Generate the text file to store imported data + */ + private static File generateFileMountedOnSDcard(Context context, int filePathResId, int fileNameFormatResId) { + StringBuilder sb = new StringBuilder(); + sb.append(Environment.getExternalStorageDirectory()); //外部(SD卡)的存储路径 + sb.append(context.getString(filePathResId)); //文件的存储路径 + File filedir = new File(sb.toString()); //filedir应该就是用来存储路径信息 + sb.append(context.getString( + fileNameFormatResId, + DateFormat.format(context.getString(R.string.format_date_ymd), + System.currentTimeMillis()))); + File file = new File(sb.toString()); + + try { //如果这些文件不存在,则新建 + if (!filedir.exists()) { + filedir.mkdir(); + } + if (!file.exists()) { + file.createNewFile(); + } + return file; + } catch (SecurityException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } +// try catch 异常处理 + return null; + } +} + +2、DataUtils.java、 +package net.micode.notes.tool; + +public class DataUtils { + public static final String TAG = "DataUtils"; + public static boolean batchDeleteNotes(ContentResolver resolver, HashSet ids) { //直接删除多个笔记 + if (ids == null) { + Log.d(TAG, "the ids is null"); + return true; + } + if (ids.size() == 0) { + Log.d(TAG, "no id is in the hashset"); + return true; + } + + ArrayList operationList = new ArrayList(); //提供一个任务列表 + for (long id : ids) { + if(id == Notes.ID_ROOT_FOLDER) { + Log.e(TAG, "Don't delete system folder root"); + continue; + } //如果发现是根文件夹,则不删除 + ContentProviderOperation.Builder builder = ContentProviderOperation + .newDelete(ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI, id)); //用newDelete实现删除功能 + operationList.add(builder.build()); // + } + try { + ContentProviderResult[] results = resolver.applyBatch(Notes.AUTHORITY, operationList);//主机名(或叫Authority)用于唯一标识这个ContentProvider,外部调用者可以根据这个标识来找到它。 + //数据库事务,数据库事务是由一组数据库操作序列组成,事务作为一个整体被执行 + if (results == null || results.length == 0 || results[0] == null) { + Log.d(TAG, "delete notes failed, ids:" + ids.toString()); + return false; + } + return true; + } catch (RemoteException e) { + Log.e(TAG, String.format("%s: %s", e.toString(), e.getMessage())); + } catch (OperationApplicationException e) { + Log.e(TAG, String.format("%s: %s", e.toString(), e.getMessage())); + } + return false; + } + + public static void moveNoteToFoler(ContentResolver resolver, long id, long srcFolderId, long desFolderId) { + ContentValues values = new ContentValues(); + values.put(NoteColumns.PARENT_ID, desFolderId); + values.put(NoteColumns.ORIGIN_PARENT_ID, srcFolderId); + values.put(NoteColumns.LOCAL_MODIFIED, 1); + resolver.update(ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI, id), values, null, null); //对需要移动的便签进行数据更新,然后用update实现 + } + + public static boolean batchMoveToFolder(ContentResolver resolver, HashSet ids, + long folderId) { + if (ids == null) { + Log.d(TAG, "the ids is null"); + return true; + } + + ArrayList operationList = new ArrayList(); + for (long id : ids) { + ContentProviderOperation.Builder builder = ContentProviderOperation + .newUpdate(ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI, id)); //通过withAppendedId方法,为该Uri加上ID + builder.withValue(NoteColumns.PARENT_ID, folderId); + builder.withValue(NoteColumns.LOCAL_MODIFIED, 1); + operationList.add(builder.build()); + }//将ids里包含的每一列的数据逐次加入到operationList中,等待最后的批量处理 + + try { + ContentProviderResult[] results = resolver.applyBatch(Notes.AUTHORITY, operationList); //applyBatch一次性处理一个操作列表 + if (results == null || results.length == 0 || results[0] == null) { + Log.d(TAG, "delete notes failed, ids:" + ids.toString()); + return false; + } + return true; + } catch (RemoteException e) { + Log.e(TAG, String.format("%s: %s", e.toString(), e.getMessage())); + } catch (OperationApplicationException e) { + Log.e(TAG, String.format("%s: %s", e.toString(), e.getMessage())); + } + return false; + } + + /** + * Get the all folder count except system folders {@link Notes#TYPE_SYSTEM}} + */ + public static int getUserFolderCount(ContentResolver resolver) { + Cursor cursor =resolver.query(Notes.CONTENT_NOTE_URI, + new String[] { "COUNT(*)" }, + NoteColumns.TYPE + "=? AND " + NoteColumns.PARENT_ID + "<>?", + new String[] { String.valueOf(Notes.TYPE_FOLDER), String.valueOf(Notes.ID_TRASH_FOLER)}, + null); //筛选条件:源文件不为trash folder + + int count = 0; + if(cursor != null) { + if(cursor.moveToFirst()) { + try { + count = cursor.getInt(0); + } catch (IndexOutOfBoundsException e) { + Log.e(TAG, "get folder count failed:" + e.toString()); + } finally { + cursor.close(); + } + } + } + return count; + } + + public static boolean visibleInNoteDatabase(ContentResolver resolver, long noteId, int type) { + Cursor cursor = resolver.query(ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI, noteId), //通过withAppendedId方法,为该Uri加上ID + null, + NoteColumns.TYPE + "=? AND " + NoteColumns.PARENT_ID + "<>" + Notes.ID_TRASH_FOLER, + new String [] {String.valueOf(type)}, + null); //查询条件:type符合,且不属于垃圾文件夹 + + boolean exist = false; + if (cursor != null) { + if (cursor.getCount() > 0) {//用getcount函数判断cursor是否为空 + exist = true; + } + cursor.close(); + } + return exist; + } + + public static boolean existInNoteDatabase(ContentResolver resolver, long noteId) { + Cursor cursor = resolver.query(ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI, noteId), + null, null, null, null); + + boolean exist = false; + if (cursor != null) { + if (cursor.getCount() > 0) { + exist = true; + } + cursor.close(); + } + return exist; + } + + public static boolean existInDataDatabase(ContentResolver resolver, long dataId) { + Cursor cursor = resolver.query(ContentUris.withAppendedId(Notes.CONTENT_DATA_URI, dataId), + null, null, null, null); + + boolean exist = false; + if (cursor != null) { + if (cursor.getCount() > 0) { + exist = true; + } + cursor.close(); + } + return exist; + } + + public static boolean checkVisibleFolderName(ContentResolver resolver, String name) { + Cursor cursor = resolver.query(Notes.CONTENT_NOTE_URI, null, + NoteColumns.TYPE + "=" + Notes.TYPE_FOLDER + + " AND " + NoteColumns.PARENT_ID + "<>" + Notes.ID_TRASH_FOLER + + " AND " + NoteColumns.SNIPPET + "=?", + new String[] { name }, null); + //通过名字查询文件是否存在 + boolean exist = false; + if(cursor != null) { + if(cursor.getCount() > 0) { + exist = true; + } + cursor.close(); + } + return exist; + } + + public static HashSet getFolderNoteWidget(ContentResolver resolver, long folderId) { + Cursor c = resolver.query(Notes.CONTENT_NOTE_URI, + new String[] { NoteColumns.WIDGET_ID, NoteColumns.WIDGET_TYPE }, + NoteColumns.PARENT_ID + "=?", + new String[] { String.valueOf(folderId) }, + null); //查询条件:父ID是传入的folderId; + + HashSet set = null; + if (c != null) { + if (c.moveToFirst()) { + set = new HashSet(); + do { + try { + AppWidgetAttribute widget = new AppWidgetAttribute(); + widget.widgetId = c.getInt(0); //0对应的NoteColumns.WIDGET_ID + widget.widgetType = c.getInt(1); //1对应的NoteColumns.WIDGET_TYPE + set.add(widget); + } catch (IndexOutOfBoundsException e) { + Log.e(TAG, e.toString()); + } + } while (c.moveToNext()); //查询下一条 + } + c.close(); + } + return set; + } + + public static String getCallNumberByNoteId(ContentResolver resolver, long noteId) { + Cursor cursor = resolver.query(Notes.CONTENT_DATA_URI, + new String [] { CallNote.PHONE_NUMBER }, + CallNote.NOTE_ID + "=? AND " + CallNote.MIME_TYPE + "=?", + new String [] { String.valueOf(noteId), CallNote.CONTENT_ITEM_TYPE }, + null); + + if (cursor != null && cursor.moveToFirst()) { + try { + return cursor.getString(0); + } catch (IndexOutOfBoundsException e) { + Log.e(TAG, "Get call number fails " + e.toString()); + } finally { + cursor.close(); + } + } + return ""; + } + + public static long getNoteIdByPhoneNumberAndCallDate(ContentResolver resolver, String phoneNumber, long callDate) { + Cursor cursor = resolver.query(Notes.CONTENT_DATA_URI, + new String [] { CallNote.NOTE_ID }, + CallNote.CALL_DATE + "=? AND " + CallNote.MIME_TYPE + "=? AND PHONE_NUMBERS_EQUAL(" + + CallNote.PHONE_NUMBER + ",?)", + new String [] { String.valueOf(callDate), CallNote.CONTENT_ITEM_TYPE, phoneNumber }, + null); + //通过数据库操作,查询条件是(callDate和phoneNumber匹配传入参数的值) + + if (cursor != null) { + if (cursor.moveToFirst()) { + try { + return cursor.getLong(0); //0对应的CallNote.NOTE_ID + } catch (IndexOutOfBoundsException e) { + Log.e(TAG, "Get call note id fails " + e.toString()); + } + } + cursor.close(); + } + return 0; + } + + public static String getSnippetById(ContentResolver resolver, long noteId) { + Cursor cursor = resolver.query(Notes.CONTENT_NOTE_URI, + new String [] { NoteColumns.SNIPPET }, + NoteColumns.ID + "=?", + new String [] { String.valueOf(noteId)}, + null);//查询条件:noteId + + if (cursor != null) { + String snippet = ""; + if (cursor.moveToFirst()) { + snippet = cursor.getString(0); + } + cursor.close(); + return snippet; + } + throw new IllegalArgumentException("Note is not found with id: " + noteId); + } + public static String getFormattedSnippet(String snippet) { //对字符串进行格式处理,将字符串两头的空格去掉,同时将换行符去掉 + if (snippet != null) { + snippet = snippet.trim(); + int index = snippet.indexOf('\n'); + if (index != -1) { + snippet = snippet.substring(0, index); + } + } + return snippet; + } + +}