上一篇 | 下一篇

在Director中使用数据库(二)

发布: 2007-1-25 14:57 | 作者: Gary Rosenzweig | 来源: 译自director-online.com | 查看: 291次

  原著:Gary Rosenzweig奥古多媒体*d RC,w$xCq&B'K
  翻译:lovem奥古多媒体1F)@w-y)B$@ ?E+x4}
奥古多媒体Q|3nQ3z{q)UyJ7z
  上个星期,告诉你了如何创建一个简单的数据库。这个星期,我们将扩展这个程序,使其包括保存和导入数据功能,这样你就不需要每次都从输入一通数据而开始这个程序。我也将告诉你,如何将数据库里的信息导出成一个格式,以使别的程序也能读取,就像微软的Excel。当程序运行时,数据都存储在全局变量gDatabase里,这是一个表,事实上是一个大表中的一个分表,这个大表中每一个分表都单独存储在数据库里。下面就是从“Message窗口”中看到的这个大表:
6Q)Wo}}S#Y2y#[-{6g 奥古多媒体!eS ^&_a$X
put gDatabase奥古多媒体"?[{)EFiW
-- [["Name": "Gary", "Street": "123 Clever Rd", "City": "Denver", "State": "CO", "Zip": "80210", "Phone": "720-555-1212", "Birthday": "2/29/69"], ["Name": "Natasha", "Street": "123 Clever Rd", "City": "Denver", "State": "CO", "Zip": "80210", "Phone": "303-555-5555", "Birthday": "5/1/99"]] 奥古多媒体T o#H-s$v1|*U"]

^ k4?"]u}8g0kj   Director不能直接将这个表存到文件里,但是它可以将这个表转换为字符串再保存。转换为字符串只需简单的应用string函数。下面就是:奥古多媒体9[ @3RUl%]&S2]

CR:U\)g on saveData 奥古多媒体9@7n1GR`p#BbR
  -- convert list to a string奥古多媒体fU m.A"N{%Y;g6P
  text = string(gDatabase) 奥古多媒体Rf&c'r$i-sv$@
  -- send string to text file奥古多媒体1R+L(Dub-k)K Ve+D g
  saveText(text) 奥古多媒体4j [rO GM)j"n.C
end奥古多媒体%e*D.Dxxt2b)p!vW:I
奥古多媒体u!|{-eg"r
  这个saveText函数是我用FileIO插件制作的一个标准函数,它能保存文本文件,这是从我的《使用Director 8》一书中第369页引用的,我也在以前的文章中介绍过。我不再将这些代码加到这里来,但你可以从那两个地方找到这些代码,也可以从这篇文章的源文件中找到。
pj%oy6f7tt9En 奥古多媒体0q&uKI*u.G
  一旦你保存了数据,你就可以从Mac中的SimpleText和Windows的记事本或写字板中打开,你可以看到表以字符串形式整齐地排列在里面。
N-gu#J)u:`)\ x]6Z
A^7LD&hu+a{o   将数据读回到程序里有点复杂。首先,你得考虑是否用户被问及文件名时会按“Cancel”按钮。同样,如果他们选择的文件有问题,你得告诉他们。
;e D1m| bs&_Q 奥古多媒体V?4dU,j&f
  以下是loadData函数的语句。使用了value函数以试着将字符串转换成表。也使用了listP函数以检测表是否转换成功。奥古多媒体rL2s `T

!uMMb{M*ny on loadData 奥古多媒体L)b#}i [
  -- get contents of text file
[3oM8N5N H   text = openAndReadText () 奥古多媒体ny"`1Q A8_mC.B2e
  -- if text file is empty, could mean the dialog was cancelled
0}VB pc   if text = "" then exit
aM JTH`9u   -- convert string to list奥古多媒体nK;yIJ9_|J
  list = value (text) 奥古多媒体(Q:]4\[Hz+U
  -- did the conversion work?奥古多媒体(M dC)x7p.].Ae#|$h
  if listP (list) then奥古多媒体MMVo3O2z
    -- yes, so set the database to this list奥古多媒体st m'D*J4B?(^
    gDatabase = list奥古多媒体!ne Y1w&b8U/] O
  else奥古多媒体:k JG |d"[
    -- no, must be a bas file奥古多媒体 Z A#cpX9e
    alert "Error reading database."
RfE,MPSk J(O*J7r   end if 奥古多媒体 _4l/zqY~'XB2g
end
4d&U}:y0T"}
_ BP+`P1z|;v   即使用户选择了正确的文件,value函数仍有可能出错。这就是Director的字符串可以包含quote(双引号)特性的缘故。所以,如果用户键入了他们的名字,如“John "JS" Smith”,接着程序将其保存但却没有包括全部双引号:其实,这个名字的前后双引号的中间部分都是名字的一部分。然而,当value函数试着解释这个名字时,它将会将所有的双引号一个个解释并转换为表。这就会产生错误,value函数停止运行而给表返回VOID值。
)u'pz7v#cuB'O
9I/qKNWoTx N   有一些办法可以避免这个错误。我最喜欢的一个方法是确保输入框不接受双引号,或者,可以接受双引号,但得转换成安全的单引号。另一种选择就是当第一次存储时,将记录的每一个项目的双引号转换为单引号。奥古多媒体 Wv(X7W R
奥古多媒体j9mn5ZW
  saveDate和loadData函数提供了保存和导入数据库的功能。你甚至可以保存任何单独的不同的数据库。然而这些文件都不能被其他程序所读取。让我们创建一个可以将数据以Tab分隔符形式保存的输出功能,这样就可以让诸如微软的Excel等别的程序读取了。
z8W(fp)Y0eR 奥古多媒体&NnF_]KaI5y:\
  这有一个窍门可以用TAB保存每一个项目。你也可以在每个记录之间加个RETURN。这个输出功能甚至会用表的属性来创建一行标题。所有这些都将变成文本串,当这个文本串完成后,它将被与saveText相同的函数保存。奥古多媒体 zm#q^2^| }

5q9q;V4t"x on export 奥古多媒体xW|#c Zz B8`
  if gDatabase.count < 1 then奥古多媒体IU)O |v6A9}7`5t#cCv1p
    -- if no data yet, then show message instead奥古多媒体V;^7`J*i6F4yVSk;G!C
    alert "No data."
sC7x5x5A6oKH   else奥古多媒体1|`-dUu(X
    -- create blank string奥古多媒体 o#}].[@z
    text = ""
$lL%n6i$Q Z1nq     -- add each of the column headings
)N1P%U I(K6[     repeat with i = 1 to gDatabase[1].count奥古多媒体T%Wt1PUl
      put getPropAt (gDatabase[1],i) & TAB after text奥古多媒体,`w!oot8Ob
    end repeat奥古多媒体T Z fi&iO v[
    -- add each record奥古多媒体K&}d!pF"sc-Fcd
    repeat with m = 1 to gDatabase.count奥古多媒体!NN @(K:b(S)F#`"[
      -- new line
2q p8x4p(G,POj       put RETURN after text奥古多媒体%A@'S P-s_qN
      -- add each field of each record
`$\/ZfX'k%[       repeat with j = 1 to gDatabase[m].count
"vGD+MLS2x         put gDatabase[m][j]&TAB after text奥古多媒体"Q3}(GTqh2wo%t
      end repeat
4w;G8J"A-Z+R"[']%{B     end repeat
7w1\o1s.{z Lr#l.aV     -- send string to text file奥古多媒体_G!\,tk
    saveText (text)
$VL V~(jL5] j   end if奥古多媒体6]8p&i*uw:D
end
,O R0y;`)v#T |$r
7P VjX |Cm U   这时的文本文件可以用SimpleText和记事本等打开。呵呵,现在它比表形式的文本好读多了。

字号: | 推荐给好友

 

评分:0

我来说两句

seccode


音乐
落叶 画心 放生 天亮了 牡丹江 那滋味 擦肩而过 怀念过去 北京欢迎你 突然好想你 吻的太逼真 说好的幸福呢 坐上火车去拉萨 如果爱能早些说出来
愚爱 心碎 稻香 带我走 醉赤壁 魔杰座 我还想她 为你而活 一定要爱你 等爱的玫瑰 原谅我一次 越单纯越幸福 最后一次的温柔 给我一首歌的时间
白狐 光荣 火花 下雨天 小酒窝 樱花草 为你写诗 无可取代 无情的温柔 寂寞才说爱 忘不掉的伤 爱上你是个错 陪你一起看草原 地球人都知道我爱你
城府 假如 花海 兰亭序 爱太痛 舍不得 你若成风 女人如烟 外滩十八号 我们的纪念 摇滚怎么了 和寂寞说分手 爱上你是我的错 爱情里没有谁对谁错