From 076bc71ceb5cbd5b6ee872684d5a490ad94019eb Mon Sep 17 00:00:00 2001 From: mangtsang Date: Mon, 20 Dec 2021 11:00:19 +0800 Subject: [PATCH 1/2] add data docs Signed-off-by: mangtsang --- .idea/.gitignore | 8 ++ .idea/docs.iml | 8 ++ .idea/modules.xml | 8 ++ .idea/vcs.xml | 6 + zh-cn/application-dev/data/Readme-CN.md | 13 ++ .../figures/zh-cn_image_storage_overview.png | Bin 0 -> 21111 bytes .../public_sys-resources/icon-caution.gif | Bin 0 -> 580 bytes .../data/public_sys-resources/icon-danger.gif | Bin 0 -> 580 bytes .../data/public_sys-resources/icon-note.gif | Bin 0 -> 394 bytes .../data/public_sys-resources/icon-notice.gif | Bin 0 -> 406 bytes .../data/public_sys-resources/icon-tip.gif | Bin 0 -> 253 bytes .../public_sys-resources/icon-warning.gif | Bin 0 -> 580 bytes .../data/relational-database-overview.md | 6 + .../data/relational-database.md | 6 + .../application-dev/data/storage-overview.md | 22 ++++ zh-cn/application-dev/data/storage.md | 120 ++++++++++++++++++ 16 files changed, 197 insertions(+) create mode 100644 .idea/.gitignore create mode 100644 .idea/docs.iml create mode 100644 .idea/modules.xml create mode 100644 .idea/vcs.xml create mode 100644 zh-cn/application-dev/data/Readme-CN.md create mode 100644 zh-cn/application-dev/data/figures/zh-cn_image_storage_overview.png create mode 100755 zh-cn/application-dev/data/public_sys-resources/icon-caution.gif create mode 100755 zh-cn/application-dev/data/public_sys-resources/icon-danger.gif create mode 100755 zh-cn/application-dev/data/public_sys-resources/icon-note.gif create mode 100755 zh-cn/application-dev/data/public_sys-resources/icon-notice.gif create mode 100755 zh-cn/application-dev/data/public_sys-resources/icon-tip.gif create mode 100755 zh-cn/application-dev/data/public_sys-resources/icon-warning.gif create mode 100644 zh-cn/application-dev/data/relational-database-overview.md create mode 100644 zh-cn/application-dev/data/relational-database.md create mode 100644 zh-cn/application-dev/data/storage-overview.md create mode 100644 zh-cn/application-dev/data/storage.md diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 00000000000..73f69e09586 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,8 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Datasource local storage ignored files +/dataSources/ +/dataSources.local.xml +# Editor-based HTTP Client requests +/httpRequests/ diff --git a/.idea/docs.iml b/.idea/docs.iml new file mode 100644 index 00000000000..bc2cd874090 --- /dev/null +++ b/.idea/docs.iml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 00000000000..6049cfe013e --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 00000000000..94a25f7f4cb --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/zh-cn/application-dev/data/Readme-CN.md b/zh-cn/application-dev/data/Readme-CN.md new file mode 100644 index 00000000000..972d234d9d6 --- /dev/null +++ b/zh-cn/application-dev/data/Readme-CN.md @@ -0,0 +1,13 @@ +# 数据管理 + +OpenHarmony数据管理支持单设备的各种结构化数据的持久化,以及跨设备之间数据的同步、共享功能。开发者通过应用数据管理,能够方便地完成应用程序数据在不同终端设备间的无缝衔接,满足用户跨设备使用数据的一致性体验。 + +## 本地应用数据管理 +提供单设备上结构化数据的存储和访问能力。使用SQLite作为持久化存储引擎,提供了关系型数据存储(Relational Database)和轻量级数据存储(Storage),用以满足开发人员使用不同数据模型对应用数据进行持久化和访问的需求。 + +有关于本地应用数据管理的详细信息,请参阅[关系型数据存储](relational-database-overview.md)和[轻量级数据存储](storage-overview.md)。 + +## 分布式数据服务 +分布式数据库支持用户数据跨设备相互同步,为用户提供在多种终端设备上一致的数据访问体验。通过调用分布式数据接口,应用可以将数据保存到分布式数据库中。通过结合帐号、应用唯一标识和数据库三元组,分布式数据库对属于不同应用的数据进行隔离。 + +有关于分布式数据库的详细信息,请参阅[分布式数据服务](ui-js-animate-attribute-style.md)。 \ No newline at end of file diff --git a/zh-cn/application-dev/data/figures/zh-cn_image_storage_overview.png b/zh-cn/application-dev/data/figures/zh-cn_image_storage_overview.png new file mode 100644 index 0000000000000000000000000000000000000000..af94bae6f120f4ee8def8d9b2d255f34c7a36c7d GIT binary patch literal 21111 zcmeFZXH=74*Ebj-QluM|Dj*_)(nGJIC@7&QR*T0Xgo@G4?fk0?)YpC6W zK*(Sa2#GT#Irz_G@n?w;2p8nGn(}>jlGWtae8DD{@jU_7Gbu7;^zzf3Tn%ON%I8k0 zf=saFFEUdLH({pnQG;mRyZF9gl#~ig#Y6WVh#`;D$Nj*MWh)F|YZHCx`V)RqH7} zyH8HA5IQW0G=u^VVfQDqhtS<`CfOvbd}Z|Ua`@pQMWm9*-~ayCk{t&G??n+9GdIoU ze;)YvSJH`O@l+a4l2&EQx)X*Jge1k+#Qpw$t-_8)n(&Ii{{8nq#7r0|L|_aSj1DU8 zF+QW;|AP?1@PGdRATa<)B%TES4~hS+WdGk66q<$ZD7Mnad)~D&x$zj8B2w3VHAXp4vUVF@yFmlHr}Kq>WxS%x-v^HaATi(t&2wc1@CS? zEz{9%m9b-~-C~VhnUA@o2#lZNOt03#?{h*}v>tdizFa!xEY~6f8_>-R`!p%KYi%Mc zqic(H;=E8en*2@|WYxdb9`8*@)W$+L9>(5-08+R}D~7CRD5!^^*VeG9p7bm(5EGgt zqcWz`1C>VWY5j*TqJznl;hV$n$K_!4Ugrsq-zQLw#f2@13v)Pqt z;!a(rGGkIc@^^&Q1gP%(HO>Ra|2Ug{o)iti>l_;I_wJUEFWR}vKO(d9Jm9X+9s(yB z%DF7(rm$7LtUO^@yFQEw>hWFl+_oN+4eY8-8|!xwgQwpL(y14la~yj`W}n6f#KYx$ zH;8wk%D0oMF~dw?{kHt#8X;|>Dnw!LimQ%ay@F?sPn6j+kriBn_1Kkrh8(`K`}eP> zS~86WlNAG!XbcwlZ`k<Cs*jsQWKSGf4rsgoC0;|AC@^2vEMHBTIy-my7UuUbYK3-Qhr5;-^riEnChEe{C`9^ zH5(~%`$qPz{z)jQTaJ<8@->;?ry%9Be*iscH9pDpT6y(aJI>(f@R#w?&AoQH^_O?W zp9diBLp$~Fm+{j;5fCUV6!<_AXkG}mN$J>c&G=~3SPG>Q_v6wbCyHBgDyH-dsih5d zFF%a9m>mv_hCuT|{m1!ZF`>DrYa+0L71J&4GbBZEcXV{=86fCk1{2iB5{|6uE`|cP zJAKHPqH<_VNdN5lB1W*$6+HjN|JW$l-!JPv?W>ij19~_k%;xtnDM?YunWY#iQZ5Lo zASn)sg))?plBUaLyx=wK&^F=C>#Tc*p&_*t#N?%MgEg_-{+KUC(^k7KjQh)bN)CQo zjfcmn%v62%_ zi>fZ1G(I%JE44&j)gN+=wfFpe8B)t!N77Djz}f<(3GYW$ZL|b8!e7rkzh_R60by;B zri}pyk+=d5Qod*9B@U&u|ER2`9DBvT|N1pZ8wCkNNF)TsEjx4m@fA|2w8XBg&G`Qi z{Qs~>4alWyk6LS2PL4WGt8NWiIlZDxD?Tfi%o_-yeE9|_nBG2r)kUBNFBYwa%O!x; zFLR_3^=Fs?i|p;6E^>o`FD22*DmT<1xeo>x#aW;T6Fum|#88V=pZ-gPMC-A1rzLDl)@n)2<6(@u}C5?aG5{OD)^8{uHEiA z81eNS+XWv9?Z$+~BO9e^+rvd?12T54d0~mM(Qcjm5vN6$+Ryb!q%iZF)Y|)_b8+B_ z6wUlY@Of_Dkre71g4!t%?$^Va>`^W~+J$61R0jD5-0J^@iej|V=_%I+6O|D(d8u*9Y z%DtX%k}yfVeq{*sC#8meVP9=DX7H;}3^nP%El92*o9PxXdkFd>2@Z;cphGAb@M_S+ zk6*!e55|tgIiLtGZh$i(CVJ<=S6F}$fe`($KzN2fz$g$F(D@_OfQoPjXx)7PVC3tX zFDpGM7Xu@@52XSRd2I296#bHs3)@n%{KXvwln*Bxz69XyS(v{k`j@bYHTe)X;+Ha@ z0hMN~%lz_{5n=tnO(}v1MIrv4Bsev-PX4b(fWp$Mmp%s*Nzp|nyE|kg3}2YQchx>R ztx^bohy__E|BpMsQ^byGe*%n3s`+C=Y3s5UJQ=vK*;)BkizR@x&1RM};FLgA?Sc6s zcQT@CLz203h^jrbD$WX2TNSt%wg8>39WH>II>tTSHsC-bQ#y+PH+L=r+|2K=+9U^( zcnOic`7jispYvnHN*thdFr|PbjIAH@QJG5)?E7O`?0OPE0RNuIPs8BZApri(L>Xv< zXJ>j1dL=Btaoela$G~wNRZMoWOdm<@+OE4wm9BLyg~y@n=XXI8P;O`xs9q{%TUz_) z`bP8EID5yQt)G0v2M3cvLF;>G=10FD)w|H2cW4({?9qMR-twul2rB)`RiNz-9dL6` zKj>Zt4685>jv|qPW0GYPtFE?$Qa9h`HIA{0M3dpggY^9ps?0u|27@abHHH*9$Ouh9YlFUb>rDD0B0sp?pWfjOar`BrK707nA zAnO?*RlzWbLy9ZEj97MJ8J z$xGiV<`}=H^`4beX7od@OaF5>TffoP)|c9CLAj~7`Eq=HuVJFHv#Ars^1rD_QQ4ne zeVh=>4g^~+l&%5<`--~&gR$I*!S|9k!MREs&3T(`NJp)(vUK>7=^B=3Z;66Szc)y? zc!O&&KIg3|8|j(pY#wojcd*bWTXn*mhcZ%sz0kLiDYVgpBpw@X4EhSg;c)3vmI^kn zDp8m(p+x9SPKp2XFbD}9un%d#tF*Mi6O)=o3NQV`#(0;TV zZPQ|lrT|i|%i%0|UAl@>)64YWv6AkOl{>rj`skL+Lcsd&sMW@})Xhg#2!o~0`T0w1 z+T{-QUgs(XggDDbj>lIO!i#)-PT<1kQ3dqzfn5%@kqI^Rm&Mt{hom4jYWc1>Cg(vM{ zuxH6(12Rdkv<@jD_}2d^ZMfAiGn-RdYI3xgM82zslh=Un?WIQF=XZLbTb;MEWkhb% z#ZJ_i_&&@0IrHnQ6I8kY0-fUW@1MdW`N3Ut6(nP%-K9pLUyL{x!v?jYtx*?w-LUkR zmIGYdtnaIt>)Vd5<}!`4{kgI@!gW|eHLQ+OX_vddYde2yu~N8u_$V@2ICI){`}Py- z^9{Yu`%j$GR<~;WZOSE3y|cGx;{w46=(oWmi^i3<3pDdv9fS4qQ4<1^N!S z^ZP-FBMcRpEnBCyBH_h7_Q$dQ4+BSpp77PS(5NZ(h|2%$^%nd}6+LTP>+|yV`ab>J z{V^j_SEZ0rUbRRU_=R^C(_F|DNe0eYxUKaU!B6K6<(wT&opBzs9@52dYE;R*n!uqL zl8~7)&-_;LeZ|8P8hhW>0pB*C<7MM~YI}VHK@j8(=VeU-d9YoMj>cG$;ma%k>|XLG z&*9~h3dSQ4axzj7SGYmCvK!OJ#P6u?#j%qvnH#vEnNPRyyRJvEJbH~u7|SJ@frq(% zdnpaJ6YXh(yUX8je17J1MQ1-vSLl5}Z+mKRQWrj_Yg#fK5yN_HwOkuZJswK!qgE8m zKTA^d@PS*;V_@%4hQV>9GkQ~czo?Eta|i7&c^;yJ;;mQ-PVx!uQuO0VrP*YUB4mglx?%%R07+L!h zFnh9gTHyEPO?GMmtD$6+&?R?VcI#)VW;@$q<4sBUS^Y+DtYVSzNavi(a`5Z#!9!6S zxHmP2m!sl~4{jR;1kPpeSjI)%Wwq~gelwfx!-(^`uUpOrm7d)d6x5^!sQS=PmkqGK z#rXIouMkPwcYm1$INf>q)Cu(a1VlOYNu?X@%7;(lCL9z$12LW03J>~p(KC)KAs9;( zZ4vHrd}*_+~6~E6Ol6n zj`~4y=jO#Ls@0W??bhQSB8`)2m`+HQjdf}ta(=tcccHA`A`4DslcF`2h&A48ZLu*t zW_i=d!=GaKyjS|wrVXv8UOrW1$vac0XL`M5+W$R?;4UEa6nucJnqa*{N%P{=EqHec z#hGhs$2`sb2qPLTws1|Xq6H7Dyl3F&IrC9U+I>}zqIpi~^|}5r3E|jM@|@%171M{R zTXYH8zNnAZdv)~oro4>`{kDwwAYD^V%BLKFVGm>rBavYhN*+^Ql?&#alrbR?67A6H zJBjyz+s+ug(MttIq^SY7eRcPRgAHM@daIAK((cU2)h3RL33q1c{S%#0iy8uKFOuDJ z-+XT{=d_cD(4UiV!Z~VJWzRQJ>yTe1oTX9mx-I{aroY&6k26}YfD^u|GVG{Iq8`NL6+Rxe(9ym z-!f=`E=Djsw&4{Ij9Ak7e&O;)yW2^l&zu~mmtaaNCVJZ`Qxzo^&{PXVAb48!$nWVK zF6cBJLO*2cBtkO1=h0ZmG<7+ksoKps0TT`U!Qoy&<3SPpDh^4rZ&w&sIo>S}3yhod za?ybG>SeKQOGa_2gBzLRPBSvu97qxmEbGfGdchby6omhD%M~>>Ip{3z_JngcN~UYs2txiHh5XXv2Ff?jtBei z8z0)rD4%^R{ftwauwKZ09dH3~XvUx`?2qBg)YP=rko(h#6NxveO@2UGyKchy`~_zy zfo<=%+l(l`D0?p2eO^wI_b%f8~e{(t6Cn{X)II|~uiy-bf(3Q6 zaDNyJg!T3;N`-HoHr8(n1SW(wYAnbx64uoGvUZx*4CwtvJ4`f&H?Q1R)!o6YAI&tI zYtxUJH!f`VQGerM!Z*_d*63dPl3$x6dXAtSRO3Ge)esB(?&jupcvASYM~9{~Sed4| zZFTi+Qntxl-eF{>)OexLJKBQl( z^op8rn>ZYj8q=%vT05cF59g5oW3hY_;mD zo7T$>YjwUynn*_BhxvBS&>Ry+%PI)pWmU-V27xdXWuQx!TVTM%;&3%`iI2$|HwJqCKjdciU*b9@W{!vte*K>`W2-KM{*X$$4ix+^W-(D5C z*&OYRnrd?!gBhmyc)UOoGK}Yreu>mVvLq;~F_zA<%)wbHZ=Zy$iGD%dQsE3;qG?*V zo7Il2a-A4k<}iPU<(F4Ao5+f9Dzt33li|IXR(e##E3a;6nXpMmH`79bYlvgA`K{QZ zCLw%R>K1-%&Mh-$A@=1 z4LDGw)xW01XB#-xu~i(nM}DjqfAp$eBzXE5&okn`*CMs4Bo%AZr+DfzP%*c+A~sU!<6nocb74&xYPY$x zeNDB~i$#Ps&O8N`_A+s>3nN*JrW?n>tP~f>5(g|61UeK|tvzm~5x(q1lqZu_ zs%_8enA&3@(e}nodL+kxDwaLGRNb>~&!tGwOT9roh|}FD(}U76;2St+$_jczW%P3j zC%WX0=_sZ^V}$Xtf6(A&X!7+rsI>j%2exq!g^Pmw?@WuYqI_mTzgz3ArK z+G6~BUsr0|i=Qq{qRg3J=q>%z0J0`xuS)wW35o}tik&l>xu|a894IMoES!_)rgw)@ zXitN><2^2_%Q{z{wMaAKvFLXP$@fM&S@ktTqk7LM#D`JR z8mE48BCylFtOv&^JXa;m_?8SRJwoIB)MTmtQf}YC`~tCuI|3RmjH1y&Gb7RRS4XMr z@rXO#0_8%Mw7Ic3yJ7NLJz^sTUI&UAKn(UI8jGa5j)s888<>eATHmaOzeN*`?7O{Z z-e&wJA!RSaT$j?!VbWK%&TvTB#V+2LA^KeE!35>6w4aSags*~auuU=hkN;1*fJ_k- zY@#YYt3j5|xgof*px+I@;4o` zeXn4%D^G=gUD=Xpzf$DNe#ISn3v{oazWLisijuuK1#)Myy$o{OEg9U^B3EY4eKJMj zf_G%`p&IC!t8x)lTkN1{vb7?$9cNsdUVKELN$#?+=Q5`ICI)i`@#UQ#|DFY?xui4k zYh8{sX+OUHkF2P=HOLPaswMQ()X5pPf=#MqPJTCGS{r#>^&KB*9qrv$)L2zn+%F6wBDjREkq40n#RNKG%6 zKcubhva{z>q9fJ~NRm^H=X)$R55pnX6z4Xov~gYf$;Xl7i*C{ksbouMF4p?zvUGZE z%F*Ng)XTg2JDs-r;cK?#YWt3kbNr5llaCg6*H6aRw?f$9?|(T$a%ZI!9ko7n;1Mb8 z#7K$j3!mf{4J-R$ZtT#itI+n|!Rdwvfqjgr6=X0Ly6?K(wG8nL?9vh7jsil>0z=PJ zpa)6XCr+kyMmtUmQ&ZzZb$pie){;*TBz>Yz!e$}*a)Oi^4oRQ2w=c0bNBv{`l$TPC zn}}QpxcXo55r~pKfWvTi8rHqGFETk1D|P#{dTX&`thDZPcu^Ni=lvMJZ4Y;Yj`~^zv}41-l$W@rW-lAF`@gz zC{xYGD{fJkqQLCA`AfCYpGyBUCcG==ofh(x%fqNnpY@d0(Yb28tl9OBh#c!k_H#5% z{j}0}si;&Mp(8Sqn}~gXqq&_Q7umKmk>>oAX{9dusyYiAjC?mW`}F?cfS1k}d1M8SXtmtDiBY zZeQrVaeWhak9_9-&YST&_uIB4(@R|jo^KZ=d1WL&c@x)5E#OOH0N2>z)~N2M^~|1X zGI=^2U6H4dLDRfobBSJBj*fJ}X3Qma`4M}{obDZd{d++5@D5quINZ!c+D+rbA2r=0 ze}+?&Z`bX1Bp$^~#!I?~TlY;IxaW{>$RKiqcq%#e??%7=q*S zt>LB@+ACgTuef;?IvvW{xmo_{%B?IfcZpJIBKTO$45Y$q?{)i!W8&B6JtLFS>9^zh zim9E9qTc9OS=}BGvJwVcyzTQBAeCR8NFG^twPo6u;}=o9-#k{+u{XDCzu?W6_%u?X zqS~QyEJCiomv`)>eQY(Wj9$9!jHc5e{ipljgryjS-D`{|p=)`mZ9S`6ZdMW9&rvN3 zPk(AsPKSP1#G^sf^P7pGp$?Ye*iGzyr$`sH^?f*f^4k_s^LHw|0!4QI$~gbJ2Wtsy zD(E}S;zfr%rf;^KFXcl?4toYw7?wT&}cosPZ^FN)K~AR-7yAi_-SP=yCao62axh1lYC5T_Y9N zD~q0Df$TXqxpm*geGU|X;gG!&@GeZKWczBs+Fi)lTHQ$6% zF57}5RtM@nti)!Y2v5L25l-pBR#GJ#rakUpqo}w7XQXMgAzXb9U9xTczN~-KkUR=Q zfJQC1jQ>bHwj@=SvE%Kwn}{8(te!%(>cY}n-(m`9F|xyB>iwE5(RzIxp3C7yjwAD* zW5OI?_g=U#0jfa_5usnqsX>JO2^U+4PQ@cf^AMnBe)5@V3)rdAsiM`r7iC zgW=b=(WWg=w=3^{^;^mGtJ3Hgkx9-iKux)WbFoXpv@o(g_=vo$e)S2zctRkZ)G3w( z?oj%nDRD;ri7UySy%SYE&K7Dodc4yBpPXj1;~M!kIz2N6qLF{?`-d#!+A4H%+tfd_ zacURpA~<1D>Yp(PKVIDdr)#Jw6F}yhIE-TXQ*QLN550U(0{br6t$m?8yqcSkeVL-N z9}_z6?5zB*=6(b)1SixKrEyncA0{uq(?E*M@o|TKyZe(nkn3BI8Ik6b% zz{Qmseix0XrFJK9J#OC=!d`(ph#$WbBX!}#1Z{4f-2Is8W8+b{!#UgI^L!C+r{R3C zNK+409h=02&aKUh6sBjZM8y?1sYugWwB^Q%ab=T=WEO1v1&~*g{Jt>wNWe9UoXP5 za-H_s4Zd%B@{@^q>Itj#BDM$6zRjPNQh@W@^gFF)1^o6;-F4{UBuhg1yzM>lriF5=DfUPt&t53#BCb* zFg7k=8|R;9@VEbg1kFkey3jkU(R#g{o_d+z&qIj@D&VQ2{s#D`cao+ccrZb!^tFk} z5m$-AhPv`A&VG`@skwZvy%(t2)xD%spXomNNqd>Rf_(!x{7!dM;0##!Y}W0C=5}zq04V@?(*rEQ5qhWV9B@-; z%wt75dlWY@bjU(+7b(Vvs)eLzNB}R(&3GMU9C5EG=&#g%a7J1p_{n~duV)L2!Ypyz z{^KIBIQnnG>S^Z%b3rVs{DMhosnE7S^HOb6U}Ej5(y7})b0Hp=^j)^N9Ju=IC80-j zzxoq4Bp!X!?n@{UeULY&o6jokNSFFT+u(Px=D+k?hB96@&RoREee%`ZM?n?b;(BT7 zp`qLQ-s#U4v4_=em4-z>%!*rt)%X2t^0U_2cS>IM2Ypyr^^_O5IW4o)!s#?rgIu{w z+z?FTH6>Fva@*sTPJf*`MpbWgwutq=x*L%A`1xHr^!@AXgDTeDuG_)n_qrfE{$byx zLEVG_(YS>CecKDaUm11UHFmV=XNLz{4Y4vN z>oH$3Arf-R_Vozko?pJ2xm4{7wAFo|rH0Q=#Dd`e2F1Ix;;o)H=O_3ds9rwIZ=()K z^z?AEvCW7-jnjw8cd~hE-eu~gGBP3#0pl9_$cC-oOV1vu5+{%v;*+_`Cb{4JP!xJn znp@0kqinaZ`YwrAct3`kSekjtdRu{U<{|t3iI?B{$->C`uAdptN(p-{YK+nreXW^#NB)H9S~3_uB0Wd z3?u_iknPjE7&P;pDZ~ooHJZq&JOGjN) zk0&?E!Dec7JRPfC-5;(k5!Y#Xu$w)V&ebuu)*_s#PVSeoXHLQ+Wd13AXxydaUua$4 zeNH^xT*YyyQTH#YlKvp-1wli_vFpb?f)q20yhM${A=Um7VQ^T( zaF|-&d{ch{p13a0Gkx6Njh0x82xyi_ZYZA(0ok3Zy&jz#Ge!Gy>!AMo6J@*k9mXVb zVQF1*u#T7~a65ASUDSwZJF|D>8=fnHYdG+M=GW2C#ngd0hz7*Du9(XS635JP*g7P( zT*ABUU=-ZOH{xwPf%jfI5t_wbhkq~9Z4WFc{%5nm{!V>)y0lXF#{<8uhiRMc%>bjr zP;ofDX$Cb8rhxOp(5wCYCH+uU9F!n*SF?!9h;s@H(2V1El6f>e9a846xG=jURo}?o z17b$$rLtwem{pYO(P&~4?DqNcIHD@yd&ng`!zi{=f9IlsbpYH`)vkCc!gZk4hgi>1 zPvUm^hqZNx@!>Cpl711GWv**m*NLnIuxNG-?jqS&s6&On5_gL8lgI^vGzkNO)MEXV zyJ09@FpRV$XE>`;hwl03`ebsA@pc~40IuvQt7Dt4G?Ej})3MKiX_I8{ZmSlhHb@#h z8LcAz6Z=2sQkXTe0aAx~|Fv}sVCy+dAi*z#t!w}L3eh$FVLmT&O?f-@bM-%sxj1pc z8TtLyEM2JEcKuc$6mXI~fzucIQ9!dV0?kekzhy94>4-?NHA9i=fnpC2T?3sxK$R7j zf_xhmAOvBe5EjFCe|k(3^@<@B&yZyQR}5t9FD`kRS!>zfvRlY~SlzW&QBHJgz~0`H zeJ5iNNUWgPPY~YtUL1@;SW7HNlnk`_{k{J0eS(sUr@(+vr0spOYd|gW;Xq2cp2YL| z#bW&BUEaSwQK~⪻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 literal 0 HcmV?d00001 diff --git a/zh-cn/application-dev/data/public_sys-resources/icon-caution.gif b/zh-cn/application-dev/data/public_sys-resources/icon-caution.gif new file mode 100755 index 0000000000000000000000000000000000000000..6e90d7cfc2193e39e10bb58c38d01a23f045d571 GIT binary patch literal 580 zcmV-K0=xZ3Nk%w1VIu$?0Hp~4{QBgqmQ+MG9K51r{QB&)np^||1PlfQ%(86!{`~yv zv{XhUWKt}AZaiE{EOcHp{O-j3`t;<+eEiycJT4p@77X;(jQsMfB$R?oG%6hQ z+MMLZbQBH@)Vg&1^3?qHb(5!%>3r0+`eq=&V&E}0Dypi0000000000 z00000A^8LW000R9EC2ui03!e$000L5z=Uu}ED8YtqjJd<+B}(9bIOb$3-31_h|V>=0A{ z1Hh0#H30>fNT})^fRU_83uewx9oRr{f{Sx1Ml`t)EQ zGkHZ67&~y{W5Jpq4H_WfuLxp*3<7O}GEl;1ESe36fLNs=B0&LQM1Buf(R)qg(BRd`t1OPjI1m_q4 literal 0 HcmV?d00001 diff --git a/zh-cn/application-dev/data/public_sys-resources/icon-danger.gif b/zh-cn/application-dev/data/public_sys-resources/icon-danger.gif new file mode 100755 index 0000000000000000000000000000000000000000..6e90d7cfc2193e39e10bb58c38d01a23f045d571 GIT binary patch literal 580 zcmV-K0=xZ3Nk%w1VIu$?0Hp~4{QBgqmQ+MG9K51r{QB&)np^||1PlfQ%(86!{`~yv zv{XhUWKt}AZaiE{EOcHp{O-j3`t;<+eEiycJT4p@77X;(jQsMfB$R?oG%6hQ z+MMLZbQBH@)Vg&1^3?qHb(5!%>3r0+`eq=&V&E}0Dypi0000000000 z00000A^8LW000R9EC2ui03!e$000L5z=Uu}ED8YtqjJd<+B}(9bIOb$3-31_h|V>=0A{ z1Hh0#H30>fNT})^fRU_83uewx9oRr{f{Sx1Ml`t)EQ zGkHZ67&~y{W5Jpq4H_WfuLxp*3<7O}GEl;1ESe36fLNs=B0&LQM1Buf(R)qg(BRd`t1OPjI1m_q4 literal 0 HcmV?d00001 diff --git a/zh-cn/application-dev/data/public_sys-resources/icon-note.gif b/zh-cn/application-dev/data/public_sys-resources/icon-note.gif new file mode 100755 index 0000000000000000000000000000000000000000..6314297e45c1de184204098efd4814d6dc8b1cda GIT binary patch literal 394 zcmZ?wbhEHblx7fPSjxcg=ii?@_wH=jwxy=7CMGH-B`L+l$wfv=#>UF#$gv|VY%C^b zCQFtrnKN(Bo_%|sJbO}7RAORe!otL&qo<>yq_Sq+8Xqqo5h0P3w3Lvb5E(g{p01vl zxR@)KuDH0l^z`+-dH3eaw=XqSH7aTIx{kzVBN;X&hha0dQSgWuiw0NWUvMRmkD|> literal 0 HcmV?d00001 diff --git a/zh-cn/application-dev/data/public_sys-resources/icon-notice.gif b/zh-cn/application-dev/data/public_sys-resources/icon-notice.gif new file mode 100755 index 0000000000000000000000000000000000000000..86024f61b691400bea99e5b1f506d9d9aef36e27 GIT binary patch literal 406 zcmV;H0crk6Nk%w1VIu$@0J8u9|NsB@_xJDb@8;&_*4Ea}&d#;9wWXz{jEszHYim+c zQaU<1At50E0000000000A^8Le000gEEC2ui03!e%000R7038S%NU)&51O^i-Tu6`s z0)`MFE@;3YqD6xSC^kTNu_J>91{PH8XfZ(p1pp2-SU@u3#{mEUC}_}tg3+I#{z}{Ok@D_ZUDg- zt0stin4;pC8M{WLSlRH*1pzqEw1}3oOskyNN?j;7HD{BBZ*OEcv4HK!6Bk6beR+04 z&8}k>SkTusVTDmkyOz#5fCA$JTPGJVQvr3uZ?QzzPQFvD0rGf_PdrcF`pMs}p^BcF zKtKTd`0wipR%nKN&Wj+V}pX;WC3SdJV!a_8Qi zE7z`U*|Y^H0^}fB$R?oG%6hQ z+MMLZbQBH@)Vg&1^3?qHb(5!%>3r0+`eq=&V&E}0Dypi0000000000 z00000A^8LW000R9EC2ui03!e$000L5z=Uu}ED8YtqjJd<+B}(9bIOb$3-31_h|V>=0A{ z1Hh0#H30>fNT})^fRU_83uewx9oRr{f{Sx1Ml`t)EQ zGkHZ67&~y{W5Jpq4H_WfuLxp*3<7O}GEl;1ESe36fLNs=B0&LQM1Buf(R)qg(BRd`t1OPjI1m_q4 literal 0 HcmV?d00001 diff --git a/zh-cn/application-dev/data/relational-database-overview.md b/zh-cn/application-dev/data/relational-database-overview.md new file mode 100644 index 00000000000..8d4db2cd7f3 --- /dev/null +++ b/zh-cn/application-dev/data/relational-database-overview.md @@ -0,0 +1,6 @@ +# CSS动画 + +- **[属性样式动画](ui-js-animate-attribute-style.md)** +- **[transform样式动画](ui-js-animate-transform.md)** +- **[background-position样式动画](ui-js-animate-background-position-style.md)** + diff --git a/zh-cn/application-dev/data/relational-database.md b/zh-cn/application-dev/data/relational-database.md new file mode 100644 index 00000000000..8d4db2cd7f3 --- /dev/null +++ b/zh-cn/application-dev/data/relational-database.md @@ -0,0 +1,6 @@ +# CSS动画 + +- **[属性样式动画](ui-js-animate-attribute-style.md)** +- **[transform样式动画](ui-js-animate-transform.md)** +- **[background-position样式动画](ui-js-animate-background-position-style.md)** + diff --git a/zh-cn/application-dev/data/storage-overview.md b/zh-cn/application-dev/data/storage-overview.md new file mode 100644 index 00000000000..1d9a09f8bc0 --- /dev/null +++ b/zh-cn/application-dev/data/storage-overview.md @@ -0,0 +1,22 @@ +# 概述 +轻量级数据存储适用于对Key-Value结构的数据进行存取和持久化操作。应用运行时全量数据将会被加载在内存中的,使得访问速度更快,存取效率更高。如果对数据持久化,数据最终会落盘到文本文件中,建议在开发过程中减少落盘频率,即减少对持久化文件的读写次数。 + +## 基本概念 +- Key-Value数据结构 + 一种键值结构数据类型。Key是不重复的关键字,Value是数据值。 +- 非关系型数据库 + 区别于关系数据库,不保证遵循ACID(Atomic、Consistency、Isolation及Durability)特性,不采用关系模型来组织数据,数据之间无关系,扩展性好。 + +## 运作机制 +1. 本模块提供轻量级数据存储的操作类,应用通过这些操作类完成数据库操作。 +2. 借助ohos.data.storage API,应用可以将指定文件的内容加载到Storage实例,每个文件最多有一个Storage实例,系统会通过静态容器将该实例存储在内存中,直到应用主动从内存中移除该实例或者删除该文件。 +3. 获取到文件对应的Storage实例后,应用可以借助Storage API,从Storage实例中读取数据或者将数据写入Storage实例,通过flush或者flushSync将Storage实例持久化。 + +**图1 轻量级数据存储运作机制** +![zh-cn_image_storage_overview](figures/zh-cn_image_storage_overview.png) + +## 约束与限制 +- key键为string类型,要求非空且长度不超过80个字符。 +- value值为string类型时,可以为空但是长度不超过8192个字符。 +- value值为字符串型Set集合类型时,要求集合元素非空且长度不超过8192个字符。 +- 存储的数据量应该是轻量级的,建议存储的数据不超过一万条,否则会在内存方面产生较大的开销。 \ No newline at end of file diff --git a/zh-cn/application-dev/data/storage.md b/zh-cn/application-dev/data/storage.md new file mode 100644 index 00000000000..e8c85974a7e --- /dev/null +++ b/zh-cn/application-dev/data/storage.md @@ -0,0 +1,120 @@ +# 场景介绍 +轻量级数据存储主要用于保存应用的一些常用配置,并不适合存储大量数据和频繁改变数据的场景。用户的数据保存在文件中,可以持久化的存储在设备上。需要注意的是用户访问的实例包含文件所有数据,并一直加载在设备的内存中,并通过轻量级数据存储的API完成数据操作。 + +## 接口说明 +轻量级存储为应用提供key-value键值型的文件数据处理能力,支持应用对数据进行轻量级存储及查询。数据存储形式为键值对,键的类型为字符串型,值的存储数据类型包括数字型、字符型、布尔型。 + +#### 创建存储实例 +读取指定文件,将数据加载到Storage实例,用于数据操作,使用callback形式返回结果。 + +表1 轻量级数据存储实例创建接口 +| 包名 | 方法名 | 描述 | +|-------------------|---------------|-------------------------------------------------------------------------------------------------------| +| ohos.data.storage | getStorage(path: string): Promise | path:string,必填,应用程序内部数据存储路径。
Promise:Promise实例,用于异步获取结果。| + +#### 查询数据 +通过调用get系列的方法,可以查询Storage不同类型的数据。 + +表2 轻量级数据查询接口 +| 类名 | 方法名 | 描述 | +|-------------------|---------------|-------------------------------------------------------------------------------------------------------| +| Storage | get(key: string, defValue: ValueType): Promise | key:string,必填,要获取的存储key名称,它不能为空。
defValue:ValueType,必填,默认返回值,支持number、string、boolean。
Promise:Promise实例,用于异步获取结果。| + +#### 插入数据 +通过put系列的方法,可以修改Storage实例中的数据,通过flush系列的方法可以将Storage实例持久化。 + +表3 轻量级数据插入接口 +| 类名 | 方法名 | 描述 | +|-------------------|---------------|-------------------------------------------------------------------------------------------------------| +| Storage | put(key: string, value: ValueType): Promise | key:string,必填,要修改的存储的key,它不能为空。
value:ValueType,必填,存储的新值。支持number、string、boolean。
Promise:Promise实例,用于异步处理。| + +#### 订阅数据变化 +订阅数据变更需要实现StorageObserver接口,订阅的key的值发生变更后,在执行flush系列的方法后,callback方法会被回调。 + +表4 轻量级数据变化订阅 +| 类名 | 方法名 | 描述 | +|-------------------|---------------|-------------------------------------------------------------------------------------------------------| +| Storage | on(type: 'change', callback: Callback): void | type:string,事件类型,固定值'change',表示数据变更。
callback:Callback,必填,需要订阅的回调对象实例。| +| Storage | off(type: 'change', callback: Callback): void | type:string,事件类型,固定值'change',表示数据变更。
callback:Callback,必填,需要取消的回调对象实例。| + +#### 删除数据实例 +从内存中移除指定文件对应的Storage单实例,并删除指定文件及其备份文件、损坏文件。删除指定文件时,应用不允许再使用该实例进行数据操作,否则会出现数据一致性问题,使用promise方式作为异步方法。 +表5 轻量级数据存储实例删除接口 +| 包名 | 方法名 | 描述 | +|-------------------|---------------|-------------------------------------------------------------------------------------------------------| +| ohos.data.storage | deleteStorage(path: string): Promise | path:string,必填,应用程序内部数据存储路径。
Promise:Promise实例,用于异步处理。| + +## 开发步骤 +1. 准备工作,导入@ohos.data.storage。 +```java script +import dataStorage from '@ohos.data.storage' +import featureAbility from '@ohos.ability.featureAbility' // 用于指定文件存储路径 +``` + +2. 获取Storage实例。 + 读取指定文件,将数据加载到Storage实例,用于数据操作。 +```java script +var context = featureAbility.getContext() +var path = await context.getFilesDir() +let promise = dataStorage.getStorage(path + '/mystore') +``` + +3. 从指定文件读取数据。 + 首先获取指定文件对应的Storage实例,然后借助Storage API读取数据。 +```java script +promise.then((storage) => { + let getPromise = storage.get('startup', 'default') + getPromise.then((value) => { + console.info("The value of startup is " + value) + }).catch((err) => { + console.info("Get the value of startup failed with err: " + err) + }) +}).catch((err) => { + console.info("Get the storage failed, path: " + path + '/mystore') +}) +``` + +4. 将数据写入指定文件。 + 首先获取指定文件对应的Storage实例,然后借助Storage API将数据写入Storage实例,通过flush或者flushSync将Storage实例持久化。 +```java script +promise.then((storage) => { + let getPromise = storage.put('startup', 'auto') + getPromise.then(() => { + console.info("Put the value of startup successfully.") + storage.flushSync(); + }).catch((err) => { + console.info("Put the value of startup failed with err: " + err) + }) +}).catch((err) => { + console.info("Get the storage failed, path: " + path + '/mystore') +}) +``` + +5. 注册观察者。 + 开发者可以向Storage实例注册观察者,观察者对象需实现StorageObserver接口。flushSync()或flush()执行后,该Storage实例注册的所有观察者的onChange()方法都会被回调。不再需要观察者时请注销。 +```java script +promise.then((storage) => { + var observer = function (key) { + console.info("The key of " + key + " changed.") + } + storage.on('change', observer) + + storage.putSync('startup', 'auto') // 修改storage存储数据 + storage.flushSync() // 触发订阅者回调方法 + + storage.off('change', observer) // 注销数据变化订阅 +}).catch((err) => { + console.info("Get the storage failed, path: " + path + '/mystore') +}) +``` + +5. 删除指定Storage文件。 + 从内存中移除指定文件对应的Storage单实例,并删除指定文件及其备份文件、损坏文件。删除指定文件时,应用不允许再使用该实例进行数据操作,否则会出现数据一致性问题。 +```java script +let promise = dataStorage.deleteStorage(path + '/mystore') +promise.then(() => { + console.info("Deleted successfully.") +}).catch((err) => { + console.info("Deleted failed with err: " + err) +}) +``` \ No newline at end of file -- Gitee From b59707646b21700e78b0e29bc5aa70b0d0207a84 Mon Sep 17 00:00:00 2001 From: mangtsang Date: Tue, 21 Dec 2021 20:25:05 +0800 Subject: [PATCH 2/2] add storage docs Signed-off-by: mangtsang --- .idea/.gitignore | 8 - .idea/docs.iml | 8 - .idea/modules.xml | 8 - .idea/vcs.xml | 6 - zh-cn/application-dev/data/Readme-CN.md | 13 -- .../public_sys-resources/icon-caution.gif | Bin 580 -> 0 bytes .../data/public_sys-resources/icon-danger.gif | Bin 580 -> 0 bytes .../data/public_sys-resources/icon-note.gif | Bin 394 -> 0 bytes .../data/public_sys-resources/icon-notice.gif | Bin 406 -> 0 bytes .../data/public_sys-resources/icon-tip.gif | Bin 253 -> 0 bytes .../public_sys-resources/icon-warning.gif | Bin 580 -> 0 bytes .../data/relational-database-overview.md | 6 - .../data/relational-database.md | 6 - .../application-dev/data/storage-overview.md | 22 -- zh-cn/application-dev/data/storage.md | 120 ----------- zh-cn/device-dev/subsystems/Readme-CN.md | 11 +- .../figure/zh-cn_image_0000001192123772.png} | Bin .../subsys-data-relational-database.md | 6 +- .../subsystems/subsys-data-storage-guide.md | 194 ++++++++++++++++++ .../subsys-data-storage-overview.md | 32 +++ .../subsystems/subsys-data-storage.md | 5 + zh-cn/device-dev/subsystems/subsys-data.md | 3 +- zh-cn/device-dev/subsystems/subsys.md | 1 + 23 files changed, 243 insertions(+), 206 deletions(-) delete mode 100644 .idea/.gitignore delete mode 100644 .idea/docs.iml delete mode 100644 .idea/modules.xml delete mode 100644 .idea/vcs.xml delete mode 100644 zh-cn/application-dev/data/Readme-CN.md delete mode 100755 zh-cn/application-dev/data/public_sys-resources/icon-caution.gif delete mode 100755 zh-cn/application-dev/data/public_sys-resources/icon-danger.gif delete mode 100755 zh-cn/application-dev/data/public_sys-resources/icon-note.gif delete mode 100755 zh-cn/application-dev/data/public_sys-resources/icon-notice.gif delete mode 100755 zh-cn/application-dev/data/public_sys-resources/icon-tip.gif delete mode 100755 zh-cn/application-dev/data/public_sys-resources/icon-warning.gif delete mode 100644 zh-cn/application-dev/data/relational-database-overview.md delete mode 100644 zh-cn/application-dev/data/relational-database.md delete mode 100644 zh-cn/application-dev/data/storage-overview.md delete mode 100644 zh-cn/application-dev/data/storage.md rename zh-cn/{application-dev/data/figures/zh-cn_image_storage_overview.png => device-dev/subsystems/figure/zh-cn_image_0000001192123772.png} (100%) create mode 100644 zh-cn/device-dev/subsystems/subsys-data-storage-guide.md create mode 100644 zh-cn/device-dev/subsystems/subsys-data-storage-overview.md create mode 100644 zh-cn/device-dev/subsystems/subsys-data-storage.md diff --git a/.idea/.gitignore b/.idea/.gitignore deleted file mode 100644 index 73f69e09586..00000000000 --- a/.idea/.gitignore +++ /dev/null @@ -1,8 +0,0 @@ -# Default ignored files -/shelf/ -/workspace.xml -# Datasource local storage ignored files -/dataSources/ -/dataSources.local.xml -# Editor-based HTTP Client requests -/httpRequests/ diff --git a/.idea/docs.iml b/.idea/docs.iml deleted file mode 100644 index bc2cd874090..00000000000 --- a/.idea/docs.iml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml deleted file mode 100644 index 6049cfe013e..00000000000 --- a/.idea/modules.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml deleted file mode 100644 index 94a25f7f4cb..00000000000 --- a/.idea/vcs.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/zh-cn/application-dev/data/Readme-CN.md b/zh-cn/application-dev/data/Readme-CN.md deleted file mode 100644 index 972d234d9d6..00000000000 --- a/zh-cn/application-dev/data/Readme-CN.md +++ /dev/null @@ -1,13 +0,0 @@ -# 数据管理 - -OpenHarmony数据管理支持单设备的各种结构化数据的持久化,以及跨设备之间数据的同步、共享功能。开发者通过应用数据管理,能够方便地完成应用程序数据在不同终端设备间的无缝衔接,满足用户跨设备使用数据的一致性体验。 - -## 本地应用数据管理 -提供单设备上结构化数据的存储和访问能力。使用SQLite作为持久化存储引擎,提供了关系型数据存储(Relational Database)和轻量级数据存储(Storage),用以满足开发人员使用不同数据模型对应用数据进行持久化和访问的需求。 - -有关于本地应用数据管理的详细信息,请参阅[关系型数据存储](relational-database-overview.md)和[轻量级数据存储](storage-overview.md)。 - -## 分布式数据服务 -分布式数据库支持用户数据跨设备相互同步,为用户提供在多种终端设备上一致的数据访问体验。通过调用分布式数据接口,应用可以将数据保存到分布式数据库中。通过结合帐号、应用唯一标识和数据库三元组,分布式数据库对属于不同应用的数据进行隔离。 - -有关于分布式数据库的详细信息,请参阅[分布式数据服务](ui-js-animate-attribute-style.md)。 \ No newline at end of file diff --git a/zh-cn/application-dev/data/public_sys-resources/icon-caution.gif b/zh-cn/application-dev/data/public_sys-resources/icon-caution.gif deleted file mode 100755 index 6e90d7cfc2193e39e10bb58c38d01a23f045d571..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 580 zcmV-K0=xZ3Nk%w1VIu$?0Hp~4{QBgqmQ+MG9K51r{QB&)np^||1PlfQ%(86!{`~yv zv{XhUWKt}AZaiE{EOcHp{O-j3`t;<+eEiycJT4p@77X;(jQsMfB$R?oG%6hQ z+MMLZbQBH@)Vg&1^3?qHb(5!%>3r0+`eq=&V&E}0Dypi0000000000 z00000A^8LW000R9EC2ui03!e$000L5z=Uu}ED8YtqjJd<+B}(9bIOb$3-31_h|V>=0A{ z1Hh0#H30>fNT})^fRU_83uewx9oRr{f{Sx1Ml`t)EQ zGkHZ67&~y{W5Jpq4H_WfuLxp*3<7O}GEl;1ESe36fLNs=B0&LQM1Buf(R)qg(BRd`t1OPjI1m_q4 diff --git a/zh-cn/application-dev/data/public_sys-resources/icon-danger.gif b/zh-cn/application-dev/data/public_sys-resources/icon-danger.gif deleted file mode 100755 index 6e90d7cfc2193e39e10bb58c38d01a23f045d571..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 580 zcmV-K0=xZ3Nk%w1VIu$?0Hp~4{QBgqmQ+MG9K51r{QB&)np^||1PlfQ%(86!{`~yv zv{XhUWKt}AZaiE{EOcHp{O-j3`t;<+eEiycJT4p@77X;(jQsMfB$R?oG%6hQ z+MMLZbQBH@)Vg&1^3?qHb(5!%>3r0+`eq=&V&E}0Dypi0000000000 z00000A^8LW000R9EC2ui03!e$000L5z=Uu}ED8YtqjJd<+B}(9bIOb$3-31_h|V>=0A{ z1Hh0#H30>fNT})^fRU_83uewx9oRr{f{Sx1Ml`t)EQ zGkHZ67&~y{W5Jpq4H_WfuLxp*3<7O}GEl;1ESe36fLNs=B0&LQM1Buf(R)qg(BRd`t1OPjI1m_q4 diff --git a/zh-cn/application-dev/data/public_sys-resources/icon-note.gif b/zh-cn/application-dev/data/public_sys-resources/icon-note.gif deleted file mode 100755 index 6314297e45c1de184204098efd4814d6dc8b1cda..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 394 zcmZ?wbhEHblx7fPSjxcg=ii?@_wH=jwxy=7CMGH-B`L+l$wfv=#>UF#$gv|VY%C^b zCQFtrnKN(Bo_%|sJbO}7RAORe!otL&qo<>yq_Sq+8Xqqo5h0P3w3Lvb5E(g{p01vl zxR@)KuDH0l^z`+-dH3eaw=XqSH7aTIx{kzVBN;X&hha0dQSgWuiw0NWUvMRmkD|> diff --git a/zh-cn/application-dev/data/public_sys-resources/icon-notice.gif b/zh-cn/application-dev/data/public_sys-resources/icon-notice.gif deleted file mode 100755 index 86024f61b691400bea99e5b1f506d9d9aef36e27..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 406 zcmV;H0crk6Nk%w1VIu$@0J8u9|NsB@_xJDb@8;&_*4Ea}&d#;9wWXz{jEszHYim+c zQaU<1At50E0000000000A^8Le000gEEC2ui03!e%000R7038S%NU)&51O^i-Tu6`s z0)`MFE@;3YqD6xSC^kTNu_J>91{PH8XfZ(p1pp2-SU@u3#{mEUC}_}tg3+I#{z}{Ok@D_ZUDg- zt0stin4;pC8M{WLSlRH*1pzqEw1}3oOskyNN?j;7HD{BBZ*OEcv4HK!6Bk6beR+04 z&8}k>SkTusVTDmkyOz#5fCA$JTPGJVQvr3uZ?QzzPQFvD0rGf_PdrcF`pMs}p^BcF zKtKTd`0wipR%nKN&Wj+V}pX;WC3SdJV!a_8Qi zE7z`U*|Y^H0^}fB$R?oG%6hQ z+MMLZbQBH@)Vg&1^3?qHb(5!%>3r0+`eq=&V&E}0Dypi0000000000 z00000A^8LW000R9EC2ui03!e$000L5z=Uu}ED8YtqjJd<+B}(9bIOb$3-31_h|V>=0A{ z1Hh0#H30>fNT})^fRU_83uewx9oRr{f{Sx1Ml`t)EQ zGkHZ67&~y{W5Jpq4H_WfuLxp*3<7O}GEl;1ESe36fLNs=B0&LQM1Buf(R)qg(BRd`t1OPjI1m_q4 diff --git a/zh-cn/application-dev/data/relational-database-overview.md b/zh-cn/application-dev/data/relational-database-overview.md deleted file mode 100644 index 8d4db2cd7f3..00000000000 --- a/zh-cn/application-dev/data/relational-database-overview.md +++ /dev/null @@ -1,6 +0,0 @@ -# CSS动画 - -- **[属性样式动画](ui-js-animate-attribute-style.md)** -- **[transform样式动画](ui-js-animate-transform.md)** -- **[background-position样式动画](ui-js-animate-background-position-style.md)** - diff --git a/zh-cn/application-dev/data/relational-database.md b/zh-cn/application-dev/data/relational-database.md deleted file mode 100644 index 8d4db2cd7f3..00000000000 --- a/zh-cn/application-dev/data/relational-database.md +++ /dev/null @@ -1,6 +0,0 @@ -# CSS动画 - -- **[属性样式动画](ui-js-animate-attribute-style.md)** -- **[transform样式动画](ui-js-animate-transform.md)** -- **[background-position样式动画](ui-js-animate-background-position-style.md)** - diff --git a/zh-cn/application-dev/data/storage-overview.md b/zh-cn/application-dev/data/storage-overview.md deleted file mode 100644 index 1d9a09f8bc0..00000000000 --- a/zh-cn/application-dev/data/storage-overview.md +++ /dev/null @@ -1,22 +0,0 @@ -# 概述 -轻量级数据存储适用于对Key-Value结构的数据进行存取和持久化操作。应用运行时全量数据将会被加载在内存中的,使得访问速度更快,存取效率更高。如果对数据持久化,数据最终会落盘到文本文件中,建议在开发过程中减少落盘频率,即减少对持久化文件的读写次数。 - -## 基本概念 -- Key-Value数据结构 - 一种键值结构数据类型。Key是不重复的关键字,Value是数据值。 -- 非关系型数据库 - 区别于关系数据库,不保证遵循ACID(Atomic、Consistency、Isolation及Durability)特性,不采用关系模型来组织数据,数据之间无关系,扩展性好。 - -## 运作机制 -1. 本模块提供轻量级数据存储的操作类,应用通过这些操作类完成数据库操作。 -2. 借助ohos.data.storage API,应用可以将指定文件的内容加载到Storage实例,每个文件最多有一个Storage实例,系统会通过静态容器将该实例存储在内存中,直到应用主动从内存中移除该实例或者删除该文件。 -3. 获取到文件对应的Storage实例后,应用可以借助Storage API,从Storage实例中读取数据或者将数据写入Storage实例,通过flush或者flushSync将Storage实例持久化。 - -**图1 轻量级数据存储运作机制** -![zh-cn_image_storage_overview](figures/zh-cn_image_storage_overview.png) - -## 约束与限制 -- key键为string类型,要求非空且长度不超过80个字符。 -- value值为string类型时,可以为空但是长度不超过8192个字符。 -- value值为字符串型Set集合类型时,要求集合元素非空且长度不超过8192个字符。 -- 存储的数据量应该是轻量级的,建议存储的数据不超过一万条,否则会在内存方面产生较大的开销。 \ No newline at end of file diff --git a/zh-cn/application-dev/data/storage.md b/zh-cn/application-dev/data/storage.md deleted file mode 100644 index e8c85974a7e..00000000000 --- a/zh-cn/application-dev/data/storage.md +++ /dev/null @@ -1,120 +0,0 @@ -# 场景介绍 -轻量级数据存储主要用于保存应用的一些常用配置,并不适合存储大量数据和频繁改变数据的场景。用户的数据保存在文件中,可以持久化的存储在设备上。需要注意的是用户访问的实例包含文件所有数据,并一直加载在设备的内存中,并通过轻量级数据存储的API完成数据操作。 - -## 接口说明 -轻量级存储为应用提供key-value键值型的文件数据处理能力,支持应用对数据进行轻量级存储及查询。数据存储形式为键值对,键的类型为字符串型,值的存储数据类型包括数字型、字符型、布尔型。 - -#### 创建存储实例 -读取指定文件,将数据加载到Storage实例,用于数据操作,使用callback形式返回结果。 - -表1 轻量级数据存储实例创建接口 -| 包名 | 方法名 | 描述 | -|-------------------|---------------|-------------------------------------------------------------------------------------------------------| -| ohos.data.storage | getStorage(path: string): Promise | path:string,必填,应用程序内部数据存储路径。
Promise:Promise实例,用于异步获取结果。| - -#### 查询数据 -通过调用get系列的方法,可以查询Storage不同类型的数据。 - -表2 轻量级数据查询接口 -| 类名 | 方法名 | 描述 | -|-------------------|---------------|-------------------------------------------------------------------------------------------------------| -| Storage | get(key: string, defValue: ValueType): Promise | key:string,必填,要获取的存储key名称,它不能为空。
defValue:ValueType,必填,默认返回值,支持number、string、boolean。
Promise:Promise实例,用于异步获取结果。| - -#### 插入数据 -通过put系列的方法,可以修改Storage实例中的数据,通过flush系列的方法可以将Storage实例持久化。 - -表3 轻量级数据插入接口 -| 类名 | 方法名 | 描述 | -|-------------------|---------------|-------------------------------------------------------------------------------------------------------| -| Storage | put(key: string, value: ValueType): Promise | key:string,必填,要修改的存储的key,它不能为空。
value:ValueType,必填,存储的新值。支持number、string、boolean。
Promise:Promise实例,用于异步处理。| - -#### 订阅数据变化 -订阅数据变更需要实现StorageObserver接口,订阅的key的值发生变更后,在执行flush系列的方法后,callback方法会被回调。 - -表4 轻量级数据变化订阅 -| 类名 | 方法名 | 描述 | -|-------------------|---------------|-------------------------------------------------------------------------------------------------------| -| Storage | on(type: 'change', callback: Callback): void | type:string,事件类型,固定值'change',表示数据变更。
callback:Callback,必填,需要订阅的回调对象实例。| -| Storage | off(type: 'change', callback: Callback): void | type:string,事件类型,固定值'change',表示数据变更。
callback:Callback,必填,需要取消的回调对象实例。| - -#### 删除数据实例 -从内存中移除指定文件对应的Storage单实例,并删除指定文件及其备份文件、损坏文件。删除指定文件时,应用不允许再使用该实例进行数据操作,否则会出现数据一致性问题,使用promise方式作为异步方法。 -表5 轻量级数据存储实例删除接口 -| 包名 | 方法名 | 描述 | -|-------------------|---------------|-------------------------------------------------------------------------------------------------------| -| ohos.data.storage | deleteStorage(path: string): Promise | path:string,必填,应用程序内部数据存储路径。
Promise:Promise实例,用于异步处理。| - -## 开发步骤 -1. 准备工作,导入@ohos.data.storage。 -```java script -import dataStorage from '@ohos.data.storage' -import featureAbility from '@ohos.ability.featureAbility' // 用于指定文件存储路径 -``` - -2. 获取Storage实例。 - 读取指定文件,将数据加载到Storage实例,用于数据操作。 -```java script -var context = featureAbility.getContext() -var path = await context.getFilesDir() -let promise = dataStorage.getStorage(path + '/mystore') -``` - -3. 从指定文件读取数据。 - 首先获取指定文件对应的Storage实例,然后借助Storage API读取数据。 -```java script -promise.then((storage) => { - let getPromise = storage.get('startup', 'default') - getPromise.then((value) => { - console.info("The value of startup is " + value) - }).catch((err) => { - console.info("Get the value of startup failed with err: " + err) - }) -}).catch((err) => { - console.info("Get the storage failed, path: " + path + '/mystore') -}) -``` - -4. 将数据写入指定文件。 - 首先获取指定文件对应的Storage实例,然后借助Storage API将数据写入Storage实例,通过flush或者flushSync将Storage实例持久化。 -```java script -promise.then((storage) => { - let getPromise = storage.put('startup', 'auto') - getPromise.then(() => { - console.info("Put the value of startup successfully.") - storage.flushSync(); - }).catch((err) => { - console.info("Put the value of startup failed with err: " + err) - }) -}).catch((err) => { - console.info("Get the storage failed, path: " + path + '/mystore') -}) -``` - -5. 注册观察者。 - 开发者可以向Storage实例注册观察者,观察者对象需实现StorageObserver接口。flushSync()或flush()执行后,该Storage实例注册的所有观察者的onChange()方法都会被回调。不再需要观察者时请注销。 -```java script -promise.then((storage) => { - var observer = function (key) { - console.info("The key of " + key + " changed.") - } - storage.on('change', observer) - - storage.putSync('startup', 'auto') // 修改storage存储数据 - storage.flushSync() // 触发订阅者回调方法 - - storage.off('change', observer) // 注销数据变化订阅 -}).catch((err) => { - console.info("Get the storage failed, path: " + path + '/mystore') -}) -``` - -5. 删除指定Storage文件。 - 从内存中移除指定文件对应的Storage单实例,并删除指定文件及其备份文件、损坏文件。删除指定文件时,应用不允许再使用该实例进行数据操作,否则会出现数据一致性问题。 -```java script -let promise = dataStorage.deleteStorage(path + '/mystore') -promise.then(() => { - console.info("Deleted successfully.") -}).catch((err) => { - console.info("Deleted failed with err: " + err) -}) -``` \ No newline at end of file diff --git a/zh-cn/device-dev/subsystems/Readme-CN.md b/zh-cn/device-dev/subsystems/Readme-CN.md index 865ade93f48..1978419bb79 100755 --- a/zh-cn/device-dev/subsystems/Readme-CN.md +++ b/zh-cn/device-dev/subsystems/Readme-CN.md @@ -40,10 +40,13 @@ - [唤醒词识别SDK的开发示例](subsys-aiframework-demo-sdk.md) - [唤醒词识别插件的开发示例](subsys-aiframework-demo-plugin.md) - [唤醒词识别配置文件的开发示例](subsys-aiframework-demo-conf.md) -- [数据管理](subsys-database.md) - - [关系型数据库](subsys-database-relational.md) - - [关系型数据库概述](subsys-database-relational-overview.md) - - [关系型数据库开发指导](subsys-database-relational-guide.md) +- [数据管理](subsys-data.md) + - [关系型数据库](subsys-data-relational-database.md) + - [关系型数据库概述](subsys-data-relational-database-overview.md) + - [关系型数据库开发指导](subsys-data-relational-database-guide.md) + - [轻量级数据存储](subsys-data-storage.md) + - [轻量级数据存储概述](subsys-data-storage-overview.md) + - [轻量级数据存储开发指导](subsys-data-storage-guide.md) - [Sensor服务](subsys-sensor.md) - [Sensor服务子系概述](subsys-sensor-overview.md) - [Sensor服务子系使用指导](subsys-sensor-guide.md) diff --git a/zh-cn/application-dev/data/figures/zh-cn_image_storage_overview.png b/zh-cn/device-dev/subsystems/figure/zh-cn_image_0000001192123772.png similarity index 100% rename from zh-cn/application-dev/data/figures/zh-cn_image_storage_overview.png rename to zh-cn/device-dev/subsystems/figure/zh-cn_image_0000001192123772.png diff --git a/zh-cn/device-dev/subsystems/subsys-data-relational-database.md b/zh-cn/device-dev/subsystems/subsys-data-relational-database.md index 85fe45cec40..cbe417ae578 100644 --- a/zh-cn/device-dev/subsystems/subsys-data-relational-database.md +++ b/zh-cn/device-dev/subsystems/subsys-data-relational-database.md @@ -1,7 +1,5 @@ # 关系型数据库 -- **[关系型数据库概述](subsys-database-relational-overview.md)** - -- **[关系型数据库开发指导](subsys-database-relational-guide.md)** - +- **[关系型数据库概述](subsys-data-relational-database-overview.md)** +- **[关系型数据库开发指导](subsys-data-relational-database-guide.md)** diff --git a/zh-cn/device-dev/subsystems/subsys-data-storage-guide.md b/zh-cn/device-dev/subsystems/subsys-data-storage-guide.md new file mode 100644 index 00000000000..bd4238fb1af --- /dev/null +++ b/zh-cn/device-dev/subsystems/subsys-data-storage-guide.md @@ -0,0 +1,194 @@ +# 轻量级数据存储开发指导 + +## 场景介绍 + +轻量级数据存储主要用于保存应用的一些常用配置信息,并不适合存储大量数据和频繁改变数据的场景。用户的数据保存在文件中,可以持久化的存储在设备上。需要注意的是用户访问的实例包含文件所有数据,并一直加载在设备的内存中,并通过Preferences的API进行数据操作。 + +## 接口说明 + +轻量级存储为应用提供key-value键值型的文件数据处理能力,支持应用对数据进行轻量级存储及查询。数据存储形式为键值对,键的类型为字符串型,值的存储数据类型包括数字型、字符型、布尔型、长整型、浮点型、双精度类型和字符数组。 + +**创建存储实例** + +读取指定文件,将数据加载到Preferences实例,用于数据操作。 + +**表 1** 轻量级数据存储实例创建接口 + +| 类名 | 方法名 | 描述 | +| --- | ----- | ----| +| PreferencesHelper | static std::shared_ptr GetPreferences(const std::string &path, int &errCode); | path:应用程序内部数据存储路径。
errCode:错误码。
返回值:轻量级存储实例。 | + +**查询数据** + +通过调用Get系列方法,可以查询Preferences中的数据。 + +**表 2** 轻量级数据查询接口 + +| 类名 | 方法名 | 描述 | +| --- | ----- | ----| +| Preferences | bool GetBool(const std::string &key, bool defValue); | key:要获取的存储key名称,它不能为空。
defValue:默认返回值。
返回值:value。 | +| Preferences | std::string GetString(const std::string &key, const std::string &defValue); | key:要获取的存储key名称,它不能为空。
defValue:默认返回值。
返回值:value。 | +| Preferences | bool GetBool(const std::string &key, bool defValue); | key:要获取的存储key名称,它不能为空。
defValue:默认返回值。
返回值:value。 | +| Preferences | float GetFloat(const std::string &key, float defValue); | key:要获取的存储key名称,它不能为空。
defValue:默认返回值。
返回值:value。 | +| Preferences | double GetDouble(const std::string &key, double defValue); | key:要获取的存储key名称,它不能为空。
defValue:默认返回值。
返回值:value。 | +| Preferences | int64_t GetLong(const std::string &key, int64_t defValue); | key:要获取的存储key名称,它不能为空。
defValue:默认返回值。
返回值:value。 | +| Preferences | std::set\ GetStringSet(const std::string &key, std::set\ &defValue); | key:要获取的存储key名称,它不能为空。
defValue:默认返回值。
返回值:value。 | + +**插入数据** + +通过Put系列方法,可以增加或修改Preferences实例中的数据,执行flush或者flushSync方法可以将Preferences实例持久化。 + +**表 3** 轻量级偏好数据库插入接口 + +| 类名 | 方法名 | 描述 | +| --- | ----- | ----| +| Preferences | int PutInt(const std::string &key, int value); | key:要存储的key名称,它不能为空。
value:要存储的value。
返回值:错误码。 | +| Preferences | int PutString(const std::string &key, const std::string &value); | key:要存储的key名称,它不能为空。
value:要存储的value。
返回值:错误码。 | +| Preferences | int PutBool(const std::string &key, bool value); | key:要存储的key名称,它不能为空。
value:要存储的value。
返回值:错误码。 | +| Preferences | int PutLong(const std::string &key, int64_t value); | key:要存储的key名称,它不能为空。
value:要存储的value。
返回值:错误码。 | +| Preferences | int PutFloat(const std::string &key, float value); | key:要存储的key名称,它不能为空。
value:要存储的value。
返回值:错误码。 | +| Preferences | int PutDouble(const std::string &key, double value); | key:要存储的key名称,它不能为空。
value:要存储的value。
返回值:错误码。 | +| Preferences | int PutStringSet(const std::string &key, const std::set\ &value); | key:要存储的key名称,它不能为空。
value:要存储的。
返回值:错误码。 | + +**订阅数据变化** + +订阅数据变化需要指定PreferencesObserver作为回调方法。订阅的key的值发生变更后,当执行flush方法时,PreferencesObserver被回调。 + +**表 4** 轻量级数据变化订阅接口 + +| 类名 | 方法名 | 描述 | +| --- | ----- | ----| +| Preferences | void RegisterObserver(std::shared_ptr preferencesObserver); | preferencesObserver:需要订阅的回调对象实例。 | +| Preferences | void UnRegisterObserver(std::shared_ptr preferencesObserver); | preferencesObserver:需要注销订阅的回调对象实例。 | + +**删除数据文件** + +通过调用以下两种接口,可以删除数据实例或对应的文件。 + +**表 5** 轻量级数据存储删除接口 + +| 类名 | 方法名 | 描述 | +| --- | ----- | ----| +| PreferencesHelper | int DeletePreferences(const std::string &path); | path:应用程序内部数据存储路径。
返回值:错误码。 | +| PreferencesHelper | int RemovePreferencesFromCache(const std::string &path); | path:应用程序内部数据存储路径。
返回值:错误码。 | + +## 开发步骤 + +1. 准备工作,引入preferences以及相关的头文件到开发环境。 + +2. 获取Preferences实例。 + + 读取指定文件,将数据加载到Preferences实例,用于数据操作。 + + ``` C++ + int errCode = E_OK; + Preferences pref = PreferencesHelper::GetPreferences(PREF_TEST_PATH + "test.xml", errCode); // PREF_TEST_PATH须为应用沙箱路径。 + EXPECT_EQ(errCode, E_OK); + ``` + +3. 读取数据。 + + 首先获取指定文件对应的Preferences实例,使用Preferences get方法读取数据。 + + ``` C++ + pref->PutString(PreferencesTest::LONG_KEY + 'x', "test"); + pref->PutString("", "test"); + pref->Flush(); + + std::string ret = pref->GetString(PreferencesTest::LONG_KEY + 'x', "defaultValue"); + EXPECT_EQ(ret, "defaultValue"); + ret = pref->GetString("", "defaultValue"); + EXPECT_EQ(ret, "defaultValue"); + + pref->PutString(PreferencesTest::LONG_KEY, "test"); + pref->PutString(PreferencesTest::KEY_TEST_STRING_ELEMENT, "test"); + pref->Flush(); + + ret = pref->GetString(PreferencesTest::LONG_KEY, "defaultValue"); + EXPECT_EQ(ret, "test"); + ret = pref->GetString(PreferencesTest::KEY_TEST_STRING_ELEMENT, "defaultValue"); + EXPECT_EQ(ret, "test"); + ``` + + +4. 保存数据,并写入文件。 + + 首先获取指定文件对应的Preferences实例,使用Preferences put方法保存数据到缓存的实例中,通过flush或者flushSync方法将Preferences实例写入文件。 + + ```C++ + pref->PutString("test", "remove"); + pref->Flush(); + + std::string ret = pref->GetString("test", "defaultValue"); + EXPECT_EQ(ret, "remove"); + + pref->Delete("test"); + pref->Flush(); + ret = pref->GetString("test", "defaultValue"); + EXPECT_EQ(ret, "defaultValue"); + ``` + + +5. 订阅数据变化。 + + 应用订阅数据变化需要指定PreferencesObserver作为回调方法。订阅的key的值发生变更后,当执行flush或者flushSync方法时,PreferencesObserver被回调。不再需要观察者时请注销。 + + 定义: + ``` C++ + class PreferencesObserverCounter : public PreferencesObserver { + public: + virtual ~PreferencesObserverCounter(); + void OnChange(Preferences &preferences, const std::string &key) override; + + std::atomic_int notifyTimes; + static const std::vector NOTIFY_KEYS_VECTOR; + }; + + PreferencesObserverCounter::~PreferencesObserverCounter() {} + + void PreferencesObserverCounter::OnChange(Preferences &preferences, const std::string &key) + { + for (auto it = NOTIFY_KEYS_VECTOR.cbegin(); it != NOTIFY_KEYS_VECTOR.cend(); it++) { + if (key.compare(*it)) { + notifyTimes++; + break; + } + } + } + + const std::vector PreferencesObserverCounter::NOTIFY_KEYS_VECTOR = { PreferencesTest::KEY_TEST_INT_ELEMENT, + PreferencesTest::KEY_TEST_LONG_ELEMENT, PreferencesTest::KEY_TEST_FLOAT_ELEMENT, + PreferencesTest::KEY_TEST_BOOL_ELEMENT, PreferencesTest::KEY_TEST_STRING_ELEMENT }; + ``` + + 使用: + ``` C++ + std::shared_ptr counter = + std::shared_ptr(new PreferencesObserverCounter()); + pref->RegisterObserver(counter); + + pref->PutString(PreferencesTest::KEY_TEST_STRING_ELEMENT, "test"); + pref->Flush(); + EXPECT_EQ(static_cast(counter.get())->notifyTimes, 1); + + /* same value */ + pref->PutInt(PreferencesTest::KEY_TEST_INT_ELEMENT, 2); + pref->PutString(PreferencesTest::KEY_TEST_STRING_ELEMENT, "test"); + pref->Flush(); + EXPECT_EQ(static_cast(counter.get())->notifyTimes, 2); + + pref->UnRegisterObserver(counter); + ``` + + +6. 删除指定文件。 + + 从内存中移除指定文件对应的Preferences单实例,并删除指定文件及其备份文件、损坏文件。删除指定文件时,应用不允许再使用该实例进行数据操作,否则会出现数据一致性问题。 + + ``` C++ + pref = nullptr; + int ret = PreferencesHelper::DeletePreferences("/data/test/test"); + EXPECT_EQ(ret, E_OK); + ``` + + diff --git a/zh-cn/device-dev/subsystems/subsys-data-storage-overview.md b/zh-cn/device-dev/subsystems/subsys-data-storage-overview.md new file mode 100644 index 00000000000..35acda7b8a1 --- /dev/null +++ b/zh-cn/device-dev/subsystems/subsys-data-storage-overview.md @@ -0,0 +1,32 @@ +# 轻量级数据存储概述 + +轻量级数据存储适用于对Key-Value结构的数据进行存取和持久化操作。应用运行时全量数据将会被加载在内存中的,使得访问速度更快,存取效率更高。如果对数据持久化,数据最终会落盘到文本文件中,建议在开发过程中减少落盘频率,即减少对持久化文件的读写次数。 + +## 基本概念 + +- **Key-Value数据结构** + + 一种键值结构数据类型。Key是不重复的关键字,Value是数据值。 + +- **非关系型数据库** + + 区别于关系数据库,不保证遵循ACID(Atomic、Consistency、Isolation及Durability)特性,不采用关系模型来组织数据,数据之间无关系,扩展性好。 + + +## 运作机制 + +1. 本模块提供轻量级数据存储的操作类,应用通过这些操作类操作数据。 +2. 应用可以将指定Preferences文件的内容加载到Preferences实例,同一进程中每个文件仅有一个Preferences实例,系统会通过静态容器将该实例存储在内存中,直到应用主动从内存中移除该实例或者删除该Preferences文件。 +3. 获取到Preferences文件对应的实例后,应用可以从Preferences实例中读取数据,或者将数据写入Preferences实例中。通过调用flush或者flushSync方法可以将Preferences实例中的数据回写到文件里。 + +**图 1** 轻量级数据存储运作机制 + + +![](figure/zh-cn_image_0000001192123772.png) + +## 约束与限制 + +- key键为string类型,要求非空且长度不超过80个字符。 +- value值为string类型时,可以为空但是长度不超过8192个字符。 +- 存储的数据量应该是轻量级的,建议存储的数据不超过一万条,否则会在内存方面产生较大的开销。 + diff --git a/zh-cn/device-dev/subsystems/subsys-data-storage.md b/zh-cn/device-dev/subsystems/subsys-data-storage.md new file mode 100644 index 00000000000..62031452c5b --- /dev/null +++ b/zh-cn/device-dev/subsystems/subsys-data-storage.md @@ -0,0 +1,5 @@ +# 轻量级数据存储 + +- **[轻量级数据存储概述](subsys-data-storage-overview.md)** + +- **[轻量级数据存储开发指导](subsys-data-storage-guide.md)** diff --git a/zh-cn/device-dev/subsystems/subsys-data.md b/zh-cn/device-dev/subsystems/subsys-data.md index 14969109954..5e1f5fb2764 100644 --- a/zh-cn/device-dev/subsystems/subsys-data.md +++ b/zh-cn/device-dev/subsystems/subsys-data.md @@ -1,5 +1,6 @@ # 数据管理 -- **[关系型数据库](subsys-database-relational.md)** +- **[关系型数据库](subsys-data-relational-database.md)** +- **[轻量级数据存储](subsys-data-storage.md)** diff --git a/zh-cn/device-dev/subsystems/subsys.md b/zh-cn/device-dev/subsystems/subsys.md index aa174c84577..5c874980f02 100644 --- a/zh-cn/device-dev/subsystems/subsys.md +++ b/zh-cn/device-dev/subsystems/subsys.md @@ -4,6 +4,7 @@ - **[分布式远程启动](subsys-remote-start.md)** - **[图形图像](subsys-graphics.md)** - **[媒体](subsys-multimedia.md)** +- **[数据管理](subsys-data.md)** - **[公共基础](subsys-utils.md)** - **[AI框架](subsys-aiframework.md)** - **[Sensor服务](subsys-sensor.md)** -- Gitee