网络课程中嵌入式数据库技术的应用与编程实现
作者: 潘红玉 刘博夫
摘要:嵌入式数据库SQLite具有使用简单、无须配置、自身小巧等优势,应用日益广泛。当前最受欢迎的Chrome内核浏览器对该数据库提供了很好的支持。在网络课程设计中引入嵌入式数据库技术,对学习者登录与退出平台、网课学习时长、测试结果等信息进行本地存储,并提供检索和统计功能,能够为学习者及家长提供方便的信息服务,有助于提升学习效果。文章提供了网络课程中操作SQLite数据库的主要技术方法。
关键词:嵌入式数据库;网络课程;事务处理
中图分类号:TP311 文献标识码:A
文章编号:1009-3044(2022)20-0020-02
1 网络课程学习中存在的问题
在互联网高度发达的当今社会,人们的学习已离不开网络。除了通过网络查询相关知识,还可通过内容丰富而系统的网络课程进行有计划的自主学习。传统课堂学习中,学习的内容与进度都由教师掌控,学生只能被动地跟随,无法按自己的需求个性化地进行学习。网络课程的出现提供了新的解决方案,学生可以在线学习课堂上没学好的内容及其他自己感兴趣的内容,可以检测自己的学习成果,体现了以学习者为中心的教育理念,带来了教育资源共享、学习效果提升等好处。
网络课程以网页的形式呈现给学习者,网站后端有数据库系统、Web服务系统等提供支撑。但当前多数网络课程设计上还存在不足。学习效果评价与进度管理是网络课程学习中的重要环节,大多数网络课程提供的评价与管理功能不够完善,达不到全面评估、个性化和有针对性指导的目的。因面向的学生群体庞大,也没有足够的教师参与线上管理。这就需要学习者本人对学习过程与学习结果进行更多的自我管理与评估,或者由家长基于相关数据的查询与分析参与学生的学习管理。
现有网络课程都是将学习记录等数据存储在网站服务器上,一方面众多学习者的学习记录数据繁杂、数据量大,容易造成服务器负担过重,因此很多网络课程都没有保存详细的用户学习记录,即使保存了也不会全部向用户开放。不同的网络课程网址不同,数据所存的服务器可能不同,因此不同网络课程的后端数据很难整合,学习者不能轻松获取历史学习记录与统计数据,不方便进行统一的学习进度管理与相应的时间规划管理。
若在浏览器端将学习记录保存到本地SQLite数据库,可有效地改善这种状况。学生的学习记录与测评数据可存储在本地SQLite库文件中,学生可方便查看,家长也可调用查看,而不需要登录不同的网址从分散的信息源进行查询统计。
2 SQLite嵌入式数据库技术
SQLite不同于传统数据库系统,它最大的优点是小巧,最小情况下只需占用几十K字节的存储空间,数据库以文件的形式保存,不需要安装复杂的管理系统就能使用[1]。它被众多编程语言支持,尤其是得到JavaScript脚本语言的支持。在PC机浏览器以及手机浏览器中通过JavaScript可实现读写SQLite,手机中的App、PC机中的应用程序也可以访问。SQLite得到各种嵌入式设备支持,成为优秀的嵌入式数据库[2]。
SQLite是实现了零配置、无服务端和事务处理的轻量型SQL数据库。SQLite单线程读写性能与MySQL相比并不逊色。SQLite多个连接可以并发操作,允许从多个进程或线程访问,但是同一时间只允许一个写操作[3]。
SQLite支持事务处理。事务(Transaction) 是对数据库执行的一系列操作,是按逻辑顺序完成的一组操作语句。如:在数据库不同表中分别添加记录、更新某些字段数据、删除另一表中的记录等,它们即可构成一个事务。这些操作通常具有逻辑相关性,如记录某一学习内容的成绩,同时应将待学习内容数减一。事务机制可确保事务中的新建、修改、删除等操作都成功完成或都被取消,以保证数据的完整性和一致性[4]。
SQLite支持SQL92标准的大多数命令,如最常用的select查询、insert插入、update更新、delete删除四大操作。与其他数据库如SQL Server相比,SQLite的操作是与程序共用同一进程进行的,SQL Server则需要单独的数据库服务进程提供相应服务[5]。SQLite以文件形式提供服务,节省了网络开销,降低了数据传输时延。
HTML5中引入了Web SQL DBTABASE,其为 SQLite数据库的访问提供了三个核心API函数,可在网页脚本语言中使用这些函数。
一是opendatabase打开数据库函数,可使用现有数据库或创建新的数据库。其四个参数分别是数据库名、版本、数据库描述、数据库尺寸。
二是transaction事务函数,用于组织事务中的SQL功能语句并控制事务提交或回滚。
三是executeSql执行SQL语句函数。executeSql有四个参数,第一是操作数据库的SQL语句,第二是SQL语句中使用的参数的数组,第三是语句操作成功调用的函数,第四是语句操作失败调用的函数。
3 网络课程中应用SQLite数据库技术的编程实现
3.1 工作原理
在新建的网络课程中增加对本地SQLite数据库的支持。对原有网络课程按照相对一致的规范进行改造,增加对SQLite数据库的支持。这可通过为页面添加JS脚本代码实现,也可设计通用的浏览器扩展插件实现。
在网络课程中,将有利于学习者自我评价和学习进度管理的信息保存到本地SQLite数据库中。如学习进度信息、测评结果信息等。
设计适合PC或手机终端使用的应用程序,采用主流的开发工具,如C#、Python、Android等,对各网络课程产生的学习记录与测评数据进行查看、采集与统计,为学习者开展自我学习评价与学习管理提供便利,为家长了解学生学习情况提供便利。
3.2 浏览器中数据库文件位置及管理
目前市场占有率最高的浏览器Google Chrome对SQLite数据库提供了很好的支持。Microsoft Edge浏览器采用Chrome内核后,也能很好地支持SQLite数据库。
使用Google Chrome浏览器时,网页中创建的SQLite数据库缺省路径为:C:\Users\Administrator\AppData\Local\Google\Chrome\ User Data\Default\databases。
使用Microsoft edge浏览器时,网页中创建的SQLite数据库缺省路径为:C:\Users\Administrator\AppData\Local\Microsoft\Edge\ User Data\Default\databases。
上述目录中databases.db是汇总数据库文件,其中的表databases记录了各个网站产生的数据库文件情况,每条记录对应一个数据库文件,id字段保存唯一的记录号,记录号就是对应的数据库文件名称(数据库文件名采用无扩展名的形式) 。origin来源字段保存网站的网址与端口号,如:http_localhost_8080代表的是http://localhost:8080这个地址。每个网站都有一个独立的二级目录保存其数据库文件,origin字段的值就是其目录名。name字段保存数据库名称,description字段保存数据库文件的说明,estimated_size字段保存表空间的估计大小。表结构见图1。
其中的file__0子目录是本地磁盘中网页文件在双击运行后产生的数据库文件所保存的位置。
SQLite数据库可以用SQLiteStudio、SQLiteSpy等软件打开,并对其进行管理,可查看修改数据表的结构与记录。SQLiteStudio是开源且跨平台的管理工具,没有安装过程解压缩后即可使用。因SQLiteStudio中默认数据库扩展名为.db或.db3等,而浏览器产生的数据库文件没有扩展名,因此在add database选择数据库文件打开时,要选择all files这一类型,才能找到对应数据库文件。
SQLiteStudio软件在表结构操作界面中,双击已有字段可查看修改该字段属性,在已有字段下的空白位置双击可添加新字段。当浏览器等其他进程正在独占写数据库时,SQLiteStudio或其他应用程序可能无法打开该数据库,此时可复制生成数据库的副本用于数据的查看与统计处理。
3.3 网络课程中脚本语言访问SQLite数据库的编程实现
3.3.1 创建SQLite数据库并插入学习记录
不同学习网站同名的数据库保存在不同的子目录,同一网站不同名的数据库保存为不同的文件。数据库文件名都是通过汇总表中的唯一记录号来标识。
为网络课程或学习网站创建名为LearnDb的SQLite数据库。调用openDatabase方法,这个方法在数据库已存在时为打开数据库,在数据库不存在时新建数据库文件。JS代码如下:
var db = openDatabase('LearnDb', '1.0', 'Course Db', 1024 * 1024);
if (!db) { console.log ("数据库操作失败!"); }
else { console.log ("数据库操作成功!"); }
创建或打开数据库成功后,调用transaction函数执行事务,用于数据表的创建和数据的一系列插入操作。事务机制能控制事务中的插入、更新、删除等操作都生效或都被取消。启动事务并获取当前日期时间的代码如下:
db.transaction( function (tx) { now=new Date();
var strtime = now.toLocaleDateString() + " " + now.toLocaleTimeString();
调用executeSql执行SQL语句函数创建名为“learnRecord”的数据表,包含id记录号、title主题、content内容、score分数、time时间字段,其中TEXT文本类型也可使用VARCHAR可变长度字符类型。代码如下:
tx.executeSql('CREATE TABLE IF NOT EXISTS learnRecord (id INTEGER PRIMARY KEY AUTOINCREMENT,title TEXT,content TEXT,score REAL,time TEXT)',[ ],
function(tx,result){ console.log ('表操作成功'); },
function(tx,error) { console.log ('表操作失败:' + error.message); });
上面语句参数第二项为空数组,第三项为语句成功调用的回调函数,第四项为语句失败调用的回调函数。
创建表格成功后,再根据学习者的不同学习行为,调用executeSql方法执行插入语句操作,在数据库表格中加入相应学习记录,相关代码如下:
tx.executeSql('INSERT INTO learnRecord (title,content,time) VALUES (?,?,?)', ["结束单元测试","第四单元:数列的学习",strtime],
function(tx,result){ console.log('插入记录成功'); },