2011年8月17日 星期三

2011-08-17 UCampus 總整理

非常感謝陳老師讓我進來執行行動服務的專案,原本自己的打算是在三個月內可以看到整個系統執行的雛形,年底可以上線做完整的測試,不過似乎學校方面的變動速度大過於預期,經過許多考量,我還是決定離開這個位置,讓現任組長找尋更適合人選以支援原本的校務系統,所以本篇應該是我在此留下的最後一篇文章,內容主要是說明現在整個系統的概貌,以及當初的設計概念,以方便未來如果有人需要這部分的程式時,可以較為清楚的方式去尋找,甚至同意我的理念的話還可以繼續下去。

目前在我的電腦裡面存在著最主要的三個專案,以及其他零碎測試用的小專案,主要的三個專案分別是 UCampus, UCampusMap, mediaFlickr。
  • UCampus : 為最主要的專案,也就是整個校園應用的主體,原本規畫是包含著各個功能的連結,並提供建構需求的工具,目前包含著四個 Package 分別為 UCampus, UCampusFun, UCampusMap, UCampusNews。
    • UCampus :程式主要的進入點及各部分功能的連結。
    • UCampusFun : 目前僅包含提供連結至 AP Server 及要求資料的功能類別。
    • UCampusMap : 這個 Package目前和 UCampusMap 專案架構基本上一樣,不過已經把連結資料庫及 AP Server 的部分,改寫到 UCampusFun 這個 Package。
    • UCampusNews : 包含新聞發佈的相關類別。 

  • UCampusMap : 地圖開發都是放在此處,可參考2011-07-27 UCampusMap 功能畫面
  • mediaFlickr : 對於社交活動中的 Flickr 放置在這個部分,基礎的開發方式可以參考搜尋Flickr上相關照片
這些源碼都已經同步至本機上的 SVN Server。
而程式中所使用的圖片,都存放在本機上我的圖片裡面,並依照功能分類,地圖上有用 GIMP 做設計的圖片及素材都放在 我的圖片 > map 。

Server 端是利用 php 作開發,主要的是 dbSetup.inc 及 dbFun.php 這兩隻檔案,檔案位於 inc 資料夾中,dbSetup.inc 主要存放所有資料庫的初始設定,而 dbFun.php 則是規畫提供所有可能的需求資訊,不過這部分的功能目前未開發完,現階段只有提供一些基礎的建物資料等等。

這個 dbFun 計畫上將會轉換成 Web API 的方式呈現,並提供足夠的校園資訊,如此一來可以方便提供給各單位處所自行研發所需要的程式,不過這個部份就得交給未來有興趣的人繼續執行了。

其餘的檔案功能可以參考Android 利用 PHP 連結 MySQL 即可知道每個檔案負責的位置為何。

2011年8月16日 星期二

Mobile Service 資料分類及資料庫存放位置

Mobile Service 是利用 Drupal 所開發出來的平台,Mobile Service 提供後台讓各單位人員可以註冊以及登入至系統發佈新聞等訊息,並且將這些訊息在前台顯示出來,除此之外也提供了校園單位簡介地理位置等資訊。

既然平台是利用 Drupal 所開發,所以要拉取資料庫的資料前,必須先來看一下各個資料存放於哪些資料表中。基本上與之前介紹的位置相似,可參關於Drupal新增content時的資料表變動Map 功能用到的 Drupal 資料 此兩篇介紹。


首先來看一下我對於 Mobile Service 所作的資料分類,目前的資料分類是依照新聞發佈、行事曆 以及部分地圖功能所做規劃。( 這裡為什麼說是部分的地圖功能,原因在於這部分只是存放發佈訊息及活動的位置,完整的地圖功能將包含了各類型單位、公車資訊等 )。




Type
Field
功能說明
building
(
建築物)


name
建物名稱
Floor
建物樓層
introduction
建物簡介
latitude
緯度
longitude
精度
units
(
單位或院所)


atBuilding
所在建物
name
單位名稱
atFloor
所在樓層
introduction
單位簡介
number
單位室碼
phone
單位電話
fax
單位傳真
web
單位網址
type
單位類型(學術、行政)
hasGroup
是否有組別
group
(
組別或系所)
atBuilding
所在建物
name
組別名稱
atFloor
所在樓層
atUnits
所在組別
introduction
組別簡介
number
組別室碼
phone
組別電話
fax
組別傳真
web
組別網址
member
(
成員)


atUnits
所屬單位或組別
name
成員姓名
title
職稱
phone
成員電話(分機)
news
(
新聞)


pUnits
發佈單位或組別
pMember
發佈成員
title
新聞標題
content
新聞內容
date
發佈日期
time
發佈時間
mediaUrl
多媒體檔連結位置
mSource
多媒體檔來源
mediaType
多媒體檔類型
events
(
事件 行事曆用)


pMember
發佈人員
pUnits
發佈單位或組別
title
事件標題
content
事件內容
pDate
發佈日期
pTime
發佈時間
aDate
活動日期
aTime
活動時間
aPlace
活動地點
alatitude
活動地點座標緯度
alongitude
活動地點座標精度
mediaUrl
多媒體檔連結位置
mSource
多媒體檔來源
mediaType
多媒體檔類型


此表為目前規畫在 Drupal 上的資料分類 (請注意這並非資料庫中實際的資料表或欄位 ),目的是為了新聞發佈及行事曆兩項功能,基本的功能都已經在表上有描述,此處將不再敘述,接下來將記錄實際在 Drupal 上的資料庫位置。

目前 Mobile Service 上共有 130 個資料表,同樣的這些資料表大多數是 Drupal 所必須使用;而此處因為有特別為了可以直接拉取資料庫而做分類與設計,所以在位置上較不會分散在各處。

常用到的資料表有 node, node_revisions, node_type, users, users_roles, role, permission, content_type_* 。

users, users_roles, role, permission 這四個資料表可以讓我們取得註冊者與系統權限及 uid 等關聯,並且在資料分類中設計了 member 的類型後,更可以利用 content_type_member.nid 來將各單位的人員與系統帳號做綁定的動作,如此一來,雖然發佈新聞或是其他訊息時系統看的是 uid 以及 系統權限 rid ,但是在前台或是其他自行由資料庫抓取資料的平台時,可以清楚顯示發佈者是哪個單位的成員,並且利用綁定的動作來做行動裝置上的權限控管,方便未來行動裝置上發佈功能的開發。

至於上面表中的各個 type 對應到資料庫中的資料表分別為 content_type_building, content_type_units, content_type_group, content_type_member, content_type_news, content_type_events。而這邊的設計概念十分簡單,由大至小,大的包含數個小的。
建築物 > 單位院所 > 組別系所 > 成員 > 新聞、行事曆
我們不管取得哪個部份的資訊,都可以經由 at* 或是 pMember 這兩個 field 取得更上面層級的資料,經由此步驟就可以一路的追尋回去,取得所在位置、樓層或是相關簡介等,如此也可以在地圖上標示此訊息的發佈位置;當活動資訊內無活動地點的經緯度時,也可以利用活動地點 aPlace 這個 field 來向上追朔取得地標。


和之前所使用的生活資訊平台相比較,經由這樣簡單的設計可以減少建構資料時必須輸入大量重複的資料,也讓使用者也就是訊息發佈者可以減少輸入的資料量,同時也兼顧了部分的關聯問題,以減少需要特定資料時多餘的運算步驟。


至於要如何利用 Drupal 所建立的資料庫,要求特定的資料這邊就不再贅述了,可以參考關於Drupal新增content時的資料表變動Map 功能用到的 Drupal 資料以及配合此表的介紹就可以編寫出需要的 SQL 指令。

Map 功能用到的 Drupal 資料

Map 功能是最先開發的部分,所以資料庫的部分是沿用一開始明宗與漢卿他們所建立的生活資訊平台,目前此平台的資料表共有121個,但實際上在拉需求的資料時,會使用到的資料表並不多,而且位置有固定的模式,這個部分請參考 關於Drupal新增content時的資料表變動

node_revisions :
  • nid : 應該是 node id ,值通常與 vid 相同,經過一段時間觀察,大部分所需擷取的資料都可以使用 nid 當成唯一鍵。(此部分為觀察結果後的判斷,並沒有細看 drupal 的原碼)
  • uid :此部分為 Drupal 的使用者 id ,如果需要使用者資料與 uid 的關聯,可以參考 users 資料表,至於身份的部分可以參考 users_roles 以及 role 此兩個資料表;users_roles 負責 uid 與 rid 的對應,role 資料表可查詢到 rid 所對應到的使用者權限身份;而實際上每個使用者權限身份可以執行的動作則位於 permission 資料表。
  • title : 每個 PO 文的標題。因為整個系統的開發過程與一般先規畫資料庫再寫 AP 這樣的過程稍微不同。雖然在規畫時同樣需要定義出需求哪些資料,但是這邊所規畫出來的資料,未來會放在資料庫的哪個位置或是如何命名則是由 drupal 所決定;這裡所規畫出來的資料就是直接呈現於畫面上的資料。或許這樣解釋不是很清楚,這邊舉個例子,假設在平台上顯示了【系所 : 資訊工程學系】,那這個資訊工程學系的字串資料就是存在於 title 這個欄位,而資訊工程學系的詳細介紹就會存放在 body 欄位。
node :
  • type : 此處標示著每個發佈的文章是屬於哪種類型,類型可以是建築物、單位、餐廳等,而這些類型必須在規劃資料時盡量的分類清楚,因為 drupal 上的這些類型並無法向規劃資料庫一樣直接給它們關聯,所以一不小心可能會照成大量的資料重覆存在於資料庫中,或是需要利用非常大量的 sql 語法才能取出資料;雖然 drupal 利用了 nid 將每個資料給予唯一的值,但是重覆的資料過多會導致開發者從不個地方取得資料,也會產生難以維護的問題。至於每個類型內包含著哪些資料則是存放在另外的資料表中。
content_* : 以 content 開頭的資料表則是存放著不同類型資料的內容。
  • content_type_unitsmap : 在這邊包含了學校內所有單位等相關資料。此處並不包含單位名稱,單位名稱須利用這裡的 nid 與 node.nid 做比對之後,再取 node.title 才是單位名稱。
    • field_um_seat_value : 單位位於哪棟大樓
    • field_um_phone_value : 電話
    • field_um_fax_value : 傳真
    • field_um_mail_value : e-mail
    • field_um_member_value : 包含成員及部分單位簡介也顯示於此
    • field_um_floor_value : 位於幾樓
    • field_um_room_value :單位房間號碼
    • field_um_link_url : 網頁網址
  • content_type_sightseeing : 包含景點簡介等資訊,基本上與 content_type_unitsmap 類似。
  • content_type_foodnews : 包含餐廳的資訊,基本上與 content_type_unitsmap 類似。
location : 地圖所需要的經緯度存放於此資料表中,所以當利用 content_type_unitsmap 取得單位資料時,也必須利用 nid 與此資料表的 nid 做比對,取出單位的經緯度。

Map 功能所用到的資料,大致上存放在上面介紹的資料表中,當然這個平台還提供了許多其他的資訊可以取用,不過目前只使用了這些資料。除此之外,這個平台當初規劃並非為了 UCampus做準備,所以有許多的分類顯得雜亂,如需要取得特定資訊必須額外再做判斷,這將使得運算資源白白浪費。所以之後規畫了另一個平台 Mobile Service,平台內資訊分類較為詳盡,除此之外也可以提供後台讓未來的各單位發佈新聞活動等訊息 (此部分由 漢卿 所建構,著實感謝);而對於 Mobile Service 的資料分類將於另外一篇做記錄,以避免資訊混雜。

2011年8月9日 星期二

debug - 自訂 ArrayAdapter 的 View

今天在編寫 news 部分的功能,因為需要在標題列後方加入一些圖片用來顯示是否有多媒體檔,這部分打算使用自己設計的 view,而負責存取資料的部分則是繼承原本的 ArrayAdapter ,製作一個新的 newsAdapter 類別,並且覆寫 getview() 這個方法。

在創建 inflater 物件後的初始一直有問題。getLayoutInflater()這個方法一直是未定義的,找到的解決方法為 : ((Activity)mContext).getLayoutInflater();


2011年8月2日 星期二

不同 Package 間的 activity 切換

今天將 Map 功能移入 UCampus 主程式時一直無法正常執行,UCampus 是應用的入口和 Map 為不同的 Package,功能是當我進入應用時,UCampus 會顯示一些按鈕,接著按下 Map 功能的按鈕後將會起始 Map 功能。

不同 Package 間 activity 切換,與相同 Package 中的做法是大同小異的,但是要注意的是 ,在 AndroidManifest 裡 android name 必須填寫完整 package 名稱,同樣的 intent.setClass 也必須將呼叫的 class 完整名稱寫出。

UCampus.java
intent.setClass(UCampus.this,nchu.UCampusMap.UCampusMap.class);
AndroidManifest.xml
<activity android:name="nchu.UCampusMap.UCampusMap"></activity>

Twitter Delicious Facebook Digg Stumbleupon Favorites More

 
Powered by Blogger