在 ArkTS 中使用 SQLite 数据库来实现简单关系数据功能的具体代码示例,模拟了一个 “学生 - 课程” 的多对多关系场景,即一个学生可以选修多门课程,一门课程也可以被多个学生选修。
- 导入必要的模块
import { SQLiteDatabase } from '@arkts/sqlite';
- 初始化数据库
let db: SQLiteDatabase;
function initDatabase() {
// 打开或创建数据库文件,这里假设数据库文件名为'relation_data.db'
db = SQLiteDatabase.open('relation_data.db');
createTables();
}
initDatabase();
- 创建表结构
function createTables() {
// 创建学生表(students),包含学生ID(自增主键)和学生姓名
db.executeSQL('CREATE TABLE IF NOT EXISTS students (student_id INTEGER PRIMARY KEY AUTOINCREMENT, student_name TEXT)');
// 创建课程表(courses),包含课程ID(自增主键)和课程名称
db.executeSQL('CREATE TABLE IF NOT EXISTS courses (course_id INTEGER PRIMARY KEY AUTOINCREMENT, course_name TEXT)');
// 创建中间关联表(student_course_relation),用于建立学生和课程的多对多关系
// 通过外键分别关联到students表的student_id和courses表的course_id
db.executeSQL('CREATE TABLE IF NOT EXISTS student_course_relation (student_id INTEGER, course_id INTEGER, PRIMARY KEY (student_id, course_id), FOREIGN KEY (student_id) REFERENCES students(student_id), FOREIGN KEY (course_id) REFERENCES courses(course_id))');
}
- 插入数据操作
插入学生数据
function insertStudent(studentName: string) {
db.executeSQL('INSERT INTO students (student_name) VALUES (?)', [studentName]);
}
// 示例插入几个学生
insertStudent('张三');
insertStudent('李四');
insertStudent('王五');
插入课程数据
function insertCourse(courseName: string) {
db.executeSQL('INSERT INTO courses (course_name) VALUES (?)', [courseName]);
}
// 示例插入几门课程
insertCourse('数学');
insertCourse('英语');
insertCourse('物理');
建立学生和课程的关联关系(选修关系)
function enrollStudentToCourse(studentId: number, courseId: number) {
db.executeSQL('INSERT INTO student_course_relation (student_id, course_id) VALUES (?,?)', [studentId, courseId]);
}
// 假设张三选修了数学和英语课程,李四选修了物理课程(这里需先获取对应的ID,为简化示例,假设ID依次递增分配)
enrollStudentToCourse(1, 1);
enrollStudentToCourse(1, 2);
enrollStudentToCourse(2, 3);
- 查询数据操作
查询某个学生选修的课程
function getCoursesByStudent(studentId: number) {
let result = db.executeSQL('SELECT courses.course_name FROM courses JOIN student_course_relation ON courses.course_id = student_course_relation.course_id WHERE student_course_relation.student_id =?', [studentId]);
let courses: string[] = [];
for (let row of result.rows) {
courses.push(row.course_name);
}
return courses;
}
// 查询张三选修的课程
let zhangsanCourses = getCoursesByStudent(1);
console.log('张三选修的课程:', zhangsanCourses);
查询某门课程被哪些学生选修
function getStudentsByCourse(courseId: number) {
let result = db.executeSQL('SELECT students.student_name FROM students JOIN student_course_relation ON students.student_id = student_course_relation.student_id WHERE student_course_relation.course_id =?', [courseId]);
let students: string[] = [];
for (let row of result.rows) {
students.push(row.student_name);
}
return students;
}
// 查询选修数学课程的学生
let mathStudents = getStudentsByCourse(1);
console.log('选修数学课程的学生:', mathStudents);
- 更新数据操作(例如修改学生姓名)
function updateStudentName(studentId: number, newName: string) {
db.executeSQL('UPDATE students SET student_name =? WHERE student_id =?', [newName, studentId]);
}
// 将张三的姓名修改为张小三
updateStudentName(1, '张小三');
- 删除数据操作
删除某个学生及其选修的所有课程关联关系(先删除关联,再删除学生记录)
function deleteStudent(studentId: number) {
// 先删除关联表中的相关记录
db.executeSQL('DELETE FROM student_course_relation WHERE student_id =?', [studentId]);
// 再删除学生表中的该学生记录
db.executeSQL('DELETE FROM students WHERE student_id =?', [studentId]);
}
// 删除李四这个学生及其相关课程关联
deleteStudent(2);
删除某门课程及其被学生选修的所有关联关系(先删除关联,再删除课程记录)
function deleteCourse(courseId: number) {
// 先删除关联表中的相关记录
db.executeSQL('DELETE FROM student_course_relation WHERE course_id =?', [courseId]);
// 再删除课程表中的该课程记录
db.executeSQL('DELETE FROM courses WHERE course_id =?', [courseId]);
}
// 删除英语这门课程及其相关学生选修关联
deleteCourse(2);
在 ArkTS 中如何利用 SQLite 数据库来处理具有关联关系的数据,涵盖了创建表结构、插入、查询、更新以及删除等常见的数据操作,以体现关系数据功能的实现方式。你可以根据实际需求进一步扩展和完善代码逻辑。