潘紅玉,劉博夫
(1.湖南師范大學(xué)教育科學(xué)學(xué)院,湖南長(zhǎng)沙410081;2.湖南師范大學(xué)信息科學(xué)與工程學(xué)院,湖南長(zhǎng)沙410081)
在互聯(lián)網(wǎng)高度發(fā)達(dá)的當(dāng)今社會(huì),人們的學(xué)習(xí)已離不開(kāi)網(wǎng)絡(luò)。除了通過(guò)網(wǎng)絡(luò)查詢(xún)相關(guān)知識(shí),還可通過(guò)內(nèi)容豐富而系統(tǒng)的網(wǎng)絡(luò)課程進(jìn)行有計(jì)劃的自主學(xué)習(xí)。傳統(tǒng)課堂學(xué)習(xí)中,學(xué)習(xí)的內(nèi)容與進(jìn)度都由教師掌控,學(xué)生只能被動(dòng)地跟隨,無(wú)法按自己的需求個(gè)性化地進(jìn)行學(xué)習(xí)。網(wǎng)絡(luò)課程的出現(xiàn)提供了新的解決方案,學(xué)生可以在線學(xué)習(xí)課堂上沒(méi)學(xué)好的內(nèi)容及其他自己感興趣的內(nèi)容,可以檢測(cè)自己的學(xué)習(xí)成果,體現(xiàn)了以學(xué)習(xí)者為中心的教育理念,帶來(lái)了教育資源共享、學(xué)習(xí)效果提升等好處。
網(wǎng)絡(luò)課程以網(wǎng)頁(yè)的形式呈現(xiàn)給學(xué)習(xí)者,網(wǎng)站后端有數(shù)據(jù)庫(kù)系統(tǒng)、Web服務(wù)系統(tǒng)等提供支撐。但當(dāng)前多數(shù)網(wǎng)絡(luò)課程設(shè)計(jì)上還存在不足。學(xué)習(xí)效果評(píng)價(jià)與進(jìn)度管理是網(wǎng)絡(luò)課程學(xué)習(xí)中的重要環(huán)節(jié),大多數(shù)網(wǎng)絡(luò)課程提供的評(píng)價(jià)與管理功能不夠完善,達(dá)不到全面評(píng)估、個(gè)性化和有針對(duì)性指導(dǎo)的目的。因面向的學(xué)生群體龐大,也沒(méi)有足夠的教師參與線上管理。這就需要學(xué)習(xí)者本人對(duì)學(xué)習(xí)過(guò)程與學(xué)習(xí)結(jié)果進(jìn)行更多的自我管理與評(píng)估,或者由家長(zhǎng)基于相關(guān)數(shù)據(jù)的查詢(xún)與分析參與學(xué)生的學(xué)習(xí)管理。
現(xiàn)有網(wǎng)絡(luò)課程都是將學(xué)習(xí)記錄等數(shù)據(jù)存儲(chǔ)在網(wǎng)站服務(wù)器上,一方面眾多學(xué)習(xí)者的學(xué)習(xí)記錄數(shù)據(jù)繁雜、數(shù)據(jù)量大,容易造成服務(wù)器負(fù)擔(dān)過(guò)重,因此很多網(wǎng)絡(luò)課程都沒(méi)有保存詳細(xì)的用戶(hù)學(xué)習(xí)記錄,即使保存了也不會(huì)全部向用戶(hù)開(kāi)放。不同的網(wǎng)絡(luò)課程網(wǎng)址不同,數(shù)據(jù)所存的服務(wù)器可能不同,因此不同網(wǎng)絡(luò)課程的后端數(shù)據(jù)很難整合,學(xué)習(xí)者不能輕松獲取歷史學(xué)習(xí)記錄與統(tǒng)計(jì)數(shù)據(jù),不方便進(jìn)行統(tǒng)一的學(xué)習(xí)進(jìn)度管理與相應(yīng)的時(shí)間規(guī)劃管理。
若在瀏覽器端將學(xué)習(xí)記錄保存到本地SQLite數(shù)據(jù)庫(kù),可有效地改善這種狀況。學(xué)生的學(xué)習(xí)記錄與測(cè)評(píng)數(shù)據(jù)可存儲(chǔ)在本地SQLite庫(kù)文件中,學(xué)生可方便查看,家長(zhǎng)也可調(diào)用查看,而不需要登錄不同的網(wǎng)址從分散的信息源進(jìn)行查詢(xún)統(tǒng)計(jì)。
SQLite 不同于傳統(tǒng)數(shù)據(jù)庫(kù)系統(tǒng),它最大的優(yōu)點(diǎn)是小巧,最小情況下只需占用幾十K字節(jié)的存儲(chǔ)空間,數(shù)據(jù)庫(kù)以文件的形式保存,不需要安裝復(fù)雜的管理系統(tǒng)就能使用[1]。它被眾多編程語(yǔ)言支持,尤其是得到JavaScript 腳本語(yǔ)言的支持。在PC機(jī)瀏覽器以及手機(jī)瀏覽器中通過(guò)JavaScript可實(shí)現(xiàn)讀寫(xiě)SQLite,手機(jī)中的App、PC機(jī)中的應(yīng)用程序也可以訪問(wèn)。SQLite得到各種嵌入式設(shè)備支持,成為優(yōu)秀的嵌入式數(shù)據(jù)庫(kù)[2]。
SQLite 是實(shí)現(xiàn)了零配置、無(wú)服務(wù)端和事務(wù)處理的輕量型SQL數(shù)據(jù)庫(kù)。SQLite單線程讀寫(xiě)性能與MySQL相比并不遜色。SQLite 多個(gè)連接可以并發(fā)操作,允許從多個(gè)進(jìn)程或線程訪問(wèn),但是同一時(shí)間只允許一個(gè)寫(xiě)操作[3]。
SQLite 支持事務(wù)處理。事務(wù)(Transaction)是對(duì)數(shù)據(jù)庫(kù)執(zhí)行的一系列操作,是按邏輯順序完成的一組操作語(yǔ)句。如:在數(shù)據(jù)庫(kù)不同表中分別添加記錄、更新某些字段數(shù)據(jù)、刪除另一表中的記錄等,它們即可構(gòu)成一個(gè)事務(wù)。這些操作通常具有邏輯相關(guān)性,如記錄某一學(xué)習(xí)內(nèi)容的成績(jī),同時(shí)應(yīng)將待學(xué)習(xí)內(nèi)容數(shù)減一。事務(wù)機(jī)制可確保事務(wù)中的新建、修改、刪除等操作都成功完成或都被取消,以保證數(shù)據(jù)的完整性和一致性[4]。
SQLite 支持SQL92 標(biāo)準(zhǔn)的大多數(shù)命令,如最常用的select查詢(xún)、insert 插入、update 更新、delete 刪除四大操作。與其他數(shù)據(jù)庫(kù)如SQL Server 相比,SQLite 的操作是與程序共用同一進(jìn)程進(jìn)行的,SQL Server 則需要單獨(dú)的數(shù)據(jù)庫(kù)服務(wù)進(jìn)程提供相應(yīng)服務(wù)[5]。SQLite以文件形式提供服務(wù),節(jié)省了網(wǎng)絡(luò)開(kāi)銷(xiāo),降低了數(shù)據(jù)傳輸時(shí)延。
HTML5 中引入了Web SQL DBTABASE,其為SQLite 數(shù)據(jù)庫(kù)的訪問(wèn)提供了三個(gè)核心API函數(shù),可在網(wǎng)頁(yè)腳本語(yǔ)言中使用這些函數(shù)。
一是opendatabase 打開(kāi)數(shù)據(jù)庫(kù)函數(shù),可使用現(xiàn)有數(shù)據(jù)庫(kù)或創(chuàng)建新的數(shù)據(jù)庫(kù)。其四個(gè)參數(shù)分別是數(shù)據(jù)庫(kù)名、版本、數(shù)據(jù)庫(kù)描述、數(shù)據(jù)庫(kù)尺寸。
二是transaction 事務(wù)函數(shù),用于組織事務(wù)中的SQL 功能語(yǔ)句并控制事務(wù)提交或回滾。
三是executeSql 執(zhí)行SQL 語(yǔ)句函數(shù)。executeSql 有四個(gè)參數(shù),第一是操作數(shù)據(jù)庫(kù)的SQL 語(yǔ)句,第二是SQL 語(yǔ)句中使用的參數(shù)的數(shù)組,第三是語(yǔ)句操作成功調(diào)用的函數(shù),第四是語(yǔ)句操作失敗調(diào)用的函數(shù)。
在新建的網(wǎng)絡(luò)課程中增加對(duì)本地SQLite 數(shù)據(jù)庫(kù)的支持。對(duì)原有網(wǎng)絡(luò)課程按照相對(duì)一致的規(guī)范進(jìn)行改造,增加對(duì)SQLite數(shù)據(jù)庫(kù)的支持。這可通過(guò)為頁(yè)面添加JS腳本代碼實(shí)現(xiàn),也可設(shè)計(jì)通用的瀏覽器擴(kuò)展插件實(shí)現(xiàn)。
在網(wǎng)絡(luò)課程中,將有利于學(xué)習(xí)者自我評(píng)價(jià)和學(xué)習(xí)進(jìn)度管理的信息保存到本地SQLite數(shù)據(jù)庫(kù)中。如學(xué)習(xí)進(jìn)度信息、測(cè)評(píng)結(jié)果信息等。
設(shè)計(jì)適合PC 或手機(jī)終端使用的應(yīng)用程序,采用主流的開(kāi)發(fā)工具,如C#、Python、Android等,對(duì)各網(wǎng)絡(luò)課程產(chǎn)生的學(xué)習(xí)記錄與測(cè)評(píng)數(shù)據(jù)進(jìn)行查看、采集與統(tǒng)計(jì),為學(xué)習(xí)者開(kāi)展自我學(xué)習(xí)評(píng)價(jià)與學(xué)習(xí)管理提供便利,為家長(zhǎng)了解學(xué)生學(xué)習(xí)情況提供便利。
目前市場(chǎng)占有率最高的瀏覽器Google Chrome 對(duì)SQLite 數(shù)據(jù)庫(kù)提供了很好的支持。Microsoft Edge 瀏覽器采用Chrome內(nèi)核后,也能很好地支持SQLite數(shù)據(jù)庫(kù)。
使用Google Chrome瀏覽器時(shí),網(wǎng)頁(yè)中創(chuàng)建的SQLite數(shù)據(jù)庫(kù)缺省路徑為:C:UsersAdministratorAppDataLocalGoogleChromeUser DataDefaultdatabases。
使用Microsoft edge瀏覽器時(shí),網(wǎng)頁(yè)中創(chuàng)建的SQLite數(shù)據(jù)庫(kù)缺省路徑為:C:UsersAdministratorAppDataLocalMicrosoftEdgeUser DataDefaultdatabases。
上述目錄中databases.db是匯總數(shù)據(jù)庫(kù)文件,其中的表da‐tabases記錄了各個(gè)網(wǎng)站產(chǎn)生的數(shù)據(jù)庫(kù)文件情況,每條記錄對(duì)應(yīng)一個(gè)數(shù)據(jù)庫(kù)文件,id 字段保存唯一的記錄號(hào),記錄號(hào)就是對(duì)應(yīng)的數(shù)據(jù)庫(kù)文件名稱(chēng)(數(shù)據(jù)庫(kù)文件名采用無(wú)擴(kuò)展名的形式)。ori‐gin來(lái)源字段保存網(wǎng)站的網(wǎng)址與端口號(hào),如:http_localhost_8080代表的是http://localhost:8080這個(gè)地址。每個(gè)網(wǎng)站都有一個(gè)獨(dú)立的二級(jí)目錄保存其數(shù)據(jù)庫(kù)文件,origin 字段的值就是其目錄名。name 字段保存數(shù)據(jù)庫(kù)名稱(chēng),description 字段保存數(shù)據(jù)庫(kù)文件的說(shuō)明,estimated_size 字段保存表空間的估計(jì)大小。表結(jié)構(gòu)見(jiàn)圖1。
其中的file__0 子目錄是本地磁盤(pán)中網(wǎng)頁(yè)文件在雙擊運(yùn)行后產(chǎn)生的數(shù)據(jù)庫(kù)文件所保存的位置。
SQLite數(shù)據(jù)庫(kù)可以用SQLiteStudio、SQLiteSpy等軟件打開(kāi),并對(duì)其進(jìn)行管理,可查看修改數(shù)據(jù)表的結(jié)構(gòu)與記錄。SQLit‐eStudio是開(kāi)源且跨平臺(tái)的管理工具,沒(méi)有安裝過(guò)程解壓縮后即可使用。因SQLiteStudio中默認(rèn)數(shù)據(jù)庫(kù)擴(kuò)展名為.db或.db3等,而瀏覽器產(chǎn)生的數(shù)據(jù)庫(kù)文件沒(méi)有擴(kuò)展名,因此在add database選擇數(shù)據(jù)庫(kù)文件打開(kāi)時(shí),要選擇all files 這一類(lèi)型,才能找到對(duì)應(yīng)數(shù)據(jù)庫(kù)文件。
SQLiteStudio 軟件在表結(jié)構(gòu)操作界面中,雙擊已有字段可查看修改該字段屬性,在已有字段下的空白位置雙擊可添加新字段。當(dāng)瀏覽器等其他進(jìn)程正在獨(dú)占寫(xiě)數(shù)據(jù)庫(kù)時(shí),SQLiteStu‐dio 或其他應(yīng)用程序可能無(wú)法打開(kāi)該數(shù)據(jù)庫(kù),此時(shí)可復(fù)制生成數(shù)據(jù)庫(kù)的副本用于數(shù)據(jù)的查看與統(tǒng)計(jì)處理。
3.3.1 創(chuàng)建SQLite數(shù)據(jù)庫(kù)并插入學(xué)習(xí)記錄
不同學(xué)習(xí)網(wǎng)站同名的數(shù)據(jù)庫(kù)保存在不同的子目錄,同一網(wǎng)站不同名的數(shù)據(jù)庫(kù)保存為不同的文件。數(shù)據(jù)庫(kù)文件名都是通過(guò)匯總表中的唯一記錄號(hào)來(lái)標(biāo)識(shí)。
為網(wǎng)絡(luò)課程或?qū)W習(xí)網(wǎng)站創(chuàng)建名為L(zhǎng)earnDb 的SQLite 數(shù)據(jù)庫(kù)。調(diào)用openDatabase 方法,這個(gè)方法在數(shù)據(jù)庫(kù)已存在時(shí)為打開(kāi)數(shù)據(jù)庫(kù),在數(shù)據(jù)庫(kù)不存在時(shí)新建數(shù)據(jù)庫(kù)文件。JS代碼如下:
var db=openDatabase(′LearnDb′,′1.0′,′Course Db′,1024*1024);
if(!db){ console.log("數(shù)據(jù)庫(kù)操作失敗!");}
else { console.log("數(shù)據(jù)庫(kù)操作成功!");}
創(chuàng)建或打開(kāi)數(shù)據(jù)庫(kù)成功后,調(diào)用transaction函數(shù)執(zhí)行事務(wù),用于數(shù)據(jù)表的創(chuàng)建和數(shù)據(jù)的一系列插入操作。事務(wù)機(jī)制能控制事務(wù)中的插入、更新、刪除等操作都生效或都被取消。啟動(dòng)事務(wù)并獲取當(dāng)前日期時(shí)間的代碼如下:
db.transaction( function(tx){ now=new Date();
var strtime = now.toLocaleDateString() + " " + now.toLocale‐TimeString();
調(diào)用executeSql 執(zhí)行SQL 語(yǔ)句函數(shù)創(chuàng)建名為“l(fā)earnRecord”的數(shù)據(jù)表,包含id 記錄號(hào)、title 主題、content 內(nèi)容、score 分?jǐn)?shù)、time 時(shí)間字段,其中TEXT 文本類(lèi)型也可使用VARCHAR 可變長(zhǎng)度字符類(lèi)型。代碼如下:
tx.executeSql(′CREATE TABLE IF NOT EXISTS learnRe‐cord (id INTEGER PRIMARY KEY AUTOINCREMENT, title TEXT,content TEXT,score REAL,time TEXT)′,[],
function(tx,result){console.log(′表操作成功′);},
function(tx,error) { console.log (′表操作失敗:′ + error.mes‐sage);});
上面語(yǔ)句參數(shù)第二項(xiàng)為空數(shù)組,第三項(xiàng)為語(yǔ)句成功調(diào)用的回調(diào)函數(shù),第四項(xiàng)為語(yǔ)句失敗調(diào)用的回調(diào)函數(shù)。
創(chuàng)建表格成功后,再根據(jù)學(xué)習(xí)者的不同學(xué)習(xí)行為,調(diào)用ex‐ecuteSql 方法執(zhí)行插入語(yǔ)句操作,在數(shù)據(jù)庫(kù)表格中加入相應(yīng)學(xué)習(xí)記錄,相關(guān)代碼如下:
tx.executeSql(′INSERT INTO learnRecord (title,content,time)VALUES (?,?,?)′, ["結(jié)束單元測(cè)試","第四單元:數(shù)列的學(xué)習(xí)",strtime],
function(tx,result){console.log(′插入記錄成功′);},
function(tx,error){console.log(′插入記錄失敗′);});
tx.executeSql(′INSERT INTO learnRecord(title,content,score,time)VALUES(?,?,?,?)′,["單元測(cè)試成績(jī)","第四單元:數(shù)列的學(xué)習(xí)",87,strtime],
function(tx,result){console.log(′記錄分?jǐn)?shù)成功′);},
function(tx,error){console.log(′記錄分?jǐn)?shù)失敗′);});
上述代碼中的insert 語(yǔ)句替換成update、delete 等其他SQL語(yǔ)句,即可實(shí)現(xiàn)記錄的更新、刪除等操作,完成數(shù)據(jù)的各項(xiàng)管理維護(hù)任務(wù)。
3.3.2 讀取SQLite數(shù)據(jù)記錄
調(diào)用transaction 函數(shù),再調(diào)用executeSql 函數(shù)執(zhí)行查詢(xún)語(yǔ)句,可以從SQLite數(shù)據(jù)庫(kù)表中讀取數(shù)據(jù),代碼如下:
db.transaction(function(tx){
tx.executeSql(′SELECT*FROM learnRecord′,[],
function(tx,rs){
for(var i=0;i document.getElementById("div1").innerHTML+= rs.rows.item(i).title+""+rs.rows.item(i).time+" function(tx,err){ console.log ("執(zhí)行查詢(xún)出錯(cuò)"+err.mes‐sage);});}); 其中rs.rows代表查詢(xún)得到的結(jié)果集中的所有記錄行集合,item(i)代表第i 條記錄,title 與time 分別為主題與時(shí)間字段,同理可訪問(wèn)各記錄的其他字段,修改select 語(yǔ)句可實(shí)現(xiàn)數(shù)據(jù)的查詢(xún)與統(tǒng)計(jì)功能。 嵌入式數(shù)據(jù)庫(kù)的引入與應(yīng)用,是對(duì)網(wǎng)絡(luò)課程功能的拓展,在不增加網(wǎng)絡(luò)流量負(fù)擔(dān)和服務(wù)端存儲(chǔ)壓力的情況下,保留了更多個(gè)性化學(xué)習(xí)數(shù)據(jù)。這些數(shù)據(jù)能服務(wù)于學(xué)習(xí)者,幫助其發(fā)現(xiàn)問(wèn)題,快速獲得成長(zhǎng)。統(tǒng)計(jì)后的數(shù)據(jù)也可再收集到服務(wù)端,為網(wǎng)絡(luò)課程的升級(jí)提供依據(jù)。該技術(shù)具有良好的應(yīng)用前景。
";}},4 結(jié)束語(yǔ)