当前位置: 首页 > news >正文

【sqlite3】联系人管理系统

SQLite3实现简单的联系人管理系统

有关sqlite3的基础知识请点击:SQLite3的使用
效果展示:
在这里插入图片描述

创建一个名为contacts.db的数据库

首先,我们需要创建一个名为contacts.db的数据库,并建立一个名为"contact"的表,用于存储联系人信息。该表包含四个列:id、name、phone和email。
以下是创建数据表的SQL语句:

CREATE TABLE IF NOT EXISTS contact (id INTEGER PRIMARY KEY AUTOINCREMENT,name TEXT NOT NULL,phone TEXT,email TEXT
);

代码:

#include <sqlite3.h>
#include <stdio.h>#define DATABASE_NAME "contacts.db"int main(int argc, char* argv[]) {sqlite3 *db;char *zErrMsg = 0;int rc;/*打开数据库*/rc = sqlite3_open(DATABASE_NAME, &db);if (rc) {fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));sqlite3_close(db);return 1;} else {fprintf(stdout, "Opened database successfully\n");}/*创建表的SQL语句*/char *sql = "CREATE TABLE IF NOT EXISTS contact (""id INTEGER PRIMARY KEY AUTOINCREMENT,""name TEXT NOT NULL,""phone TEXT,""email TEXT"");";/*执行SQL语句*/rc = sqlite3_exec(db, sql, 0, 0, &zErrMsg);if (rc != SQLITE_OK) {fprintf(stderr, "SQL error: %s\n", zErrMsg);sqlite3_free(zErrMsg);} else {printf("Table created successfully\n");}/*关闭数据库文件*/sqlite3_close(db);return 0;
}

实现“添加联系人”功能的代码:

#include <sqlite3.h>
#include <stdio.h>#define DATABASE_NAME "contacts.db"
#define STRLEN 50int main(int argc, char* argv[]) {sqlite3 *db;char *zErrMsg = 0;int rc;/*打开数据库*/rc = sqlite3_open(DATABASE_NAME, &db);if (rc) {fprintf(stderr, "无法打开数据库: %s\n", sqlite3_errmsg(db));sqlite3_close(db);return 1;}char *sql_query, name[STRLEN], phone[STRLEN], email[STRLEN];int opt;/*创建表的SQL语句*/char *sql = "CREATE TABLE IF NOT EXISTS contact (""id INTEGER PRIMARY KEY AUTOINCREMENT,""name TEXT NOT NULL,""phone TEXT,""email TEXT"");";/*执行SQL语句*/rc = sqlite3_exec(db, sql, 0, 0, &zErrMsg);if (rc != SQLITE_OK) {fprintf(stderr, "SQL error: %s\n", zErrMsg);sqlite3_free(zErrMsg);} else {printf("Table created successfully\n");}while(1) {printf("请输入要执行的操作:\n");printf("1. 添加联系人\n");printf("2. 查找联系人\n");printf("3. 更新联系人\n");printf("4. 删除联系人\n");printf("5. 退出程序\n");/*获取用户命令*/while( !scanf("%d", &opt) ) getchar();switch(opt) {case 1:// 添加联系人printf("请输入姓名:\n");scanf("%s", name);getchar();printf("请输入电话号码:\n");scanf("%s", phone);getchar();printf("请输入电子邮件地址:\n");scanf("%s", email);getchar();printf("您输入的姓名是: %s\t电话号码是: %s\n电子邮件是: %s\n", name, phone, email);printf("请输入[y]确认 \n");if('y' != getchar()) {while(getchar() != '\n');printf("添加联系人失败 [已取消]\n");continue;}sql_query = sqlite3_mprintf("INSERT INTO contact ""(name, phone, email) VALUES('%s', '%s', '%s')", name, phone, email);rc = sqlite3_exec(db, sql_query, NULL, NULL, &zErrMsg);if(rc != SQLITE_OK) {printf("添加联系人失败 [%s]\n", zErrMsg);sqlite3_free(zErrMsg);} else {printf("添加联系人成功!\n");}sqlite3_free(sql_query);break;	case 2://查找联系人break;case 3://更新联系人break;case 4://删除联系人break;case 5:sqlite3_close(db);return 1;break;default:printf("无效的选项,请重新输入!\n");break;}}/*关闭数据库文件*/sqlite3_close(db);return 0;
}

完整代码

联系人管理系统完整代码

#include <sqlite3.h>
#include <stdio.h>#define DATABASE_NAME "contacts.db"
#define STRLEN 50static int callback(void *NotUsed, int argc, char **argv, char **azColName) {int i;printf("查询结果:\n");for(i = 0; i < argc; i++) {printf("%s: %s\n", azColName[i], argv[i] ? argv[i] : "NULL");}printf("\n");return 0;
}int main(int argc, char* argv[]) {sqlite3 *db;char *zErrMsg = 0;int rc;/*打开数据库*/rc = sqlite3_open(DATABASE_NAME, &db);if (rc) {fprintf(stderr, "无法打开数据库: %s\n", sqlite3_errmsg(db));sqlite3_close(db);return 1;}char *sql_query, name[STRLEN], phone[STRLEN], email[STRLEN];int id, opt;/*创建表的SQL语句*/char *sql = "CREATE TABLE IF NOT EXISTS contact (""id INTEGER PRIMARY KEY AUTOINCREMENT,""name TEXT NOT NULL,""phone TEXT,""email TEXT"");";/*执行SQL语句*/rc = sqlite3_exec(db, sql, 0, 0, &zErrMsg); // 创建表if (rc != SQLITE_OK) {fprintf(stderr, "SQL error: %s\n", zErrMsg);sqlite3_free(zErrMsg);} else {printf("Table created successfully\n");}while(1) {printf("请输入要执行的操作:\n");printf("1. 添加联系人\n");printf("2. 查找联系人\n");printf("3. 更新联系人\n");printf("4. 删除联系人\n");printf("5. 退出程序\n");/*获取用户命令*/while( !scanf("%d", &opt) ) getchar();switch(opt) {case 1:// 添加联系人printf("请输入姓名:\n");scanf("%s", name); getchar();printf("请输入电话号码:\n");scanf("%s", phone);getchar();printf("请输入电子邮件地址:\n");scanf("%s", email);getchar();printf("您输入的姓名是: %s\t电话号码是: %s\n电子邮件是: %s\n", name, phone, email);printf("请输入[y]确认 \n");if('y' != getchar()) {while(getchar() != '\n');printf("添加联系人失败 [已取消]\n");continue;}sql_query = sqlite3_mprintf("INSERT INTO contact ""(name, phone, email) VALUES('%s', '%s', '%s')", name, phone, email);rc = sqlite3_exec(db, sql_query, NULL, NULL, &zErrMsg);if(rc != SQLITE_OK) {printf("添加联系人失败 [%s]\n", zErrMsg);sqlite3_free(zErrMsg);} else {printf("添加联系人成功!\n");}sqlite3_free(sql_query);break;	case 2://查找联系人printf("请输入要查找的姓名或部分姓名:\n");scanf("%s", name);getchar();sql_query = sqlite3_mprintf("SELECT * FROM contact WHERE name LIKE '%s'", name);rc = sqlite3_exec(db, sql_query, callback, NULL, &zErrMsg);if(rc != SQLITE_OK) {printf("查询联系人失败: %s\n", zErrMsg);sqlite3_free(zErrMsg);}break;case 3:// 更新联系人printf("请输入要更新的联系人ID:\n");while( !scanf("%d", &id) ) getchar();printf("请输入新的姓名:\n");scanf("%s", name);getchar();printf("请输入新的电话号码:\n");scanf("%s", phone);getchar();printf("请输入新的电子邮件地址:\n");scanf("%s", email);getchar();sql_query = sqlite3_mprintf("UPDATE contact SET name='%s', phone='%s', email='%s' WHERE id=%d", name, phone, email, id);rc = sqlite3_exec(db, sql_query, NULL, NULL, &zErrMsg);if(rc != SQLITE_OK) {printf("更新联系人失败: %s\n", zErrMsg);sqlite3_free(zErrMsg);} else {printf("更新联系人成功!\n");}break;case 4:// 删除联系人printf("请输入要删除的联系人ID:\n");while( !scanf("%d", &opt) ) getchar();sql_query = sqlite3_mprintf("DELETE FROM contact WHERE id=%d", id); // sqlite3_mprintf函数会自动申请内存空间,rc = sqlite3_exec(db, sql_query, NULL, NULL, &zErrMsg);if(rc != SQLITE_OK) {printf("删除联系人失败: %s\n", zErrMsg);sqlite3_free(zErrMsg); // 释放内存空间} else {printf("删除成功!\n");}break;case 5:sqlite3_close(db);return 1;break;default:printf("无效的选项,请重新输入!\n");break;}}/*关闭数据库文件*/sqlite3_close(db);return 0;
}

上述代码实现了一个简单的联系人管理系统,可以通过命令行进行添加、查找、更新和删除操作。其中,使用sqlite3_mprintf()函数来创建SQL查询语句。
在程序开始时,会提示用户输入要执行的操作,并根据用户输入的选项来执行相应的操作。每个操作都有相应的提示信息和输入要求,例如添加联系人需要输入姓名、电话号码和电子邮件地址等信息。
在查询联系人时,我们使用回调函数callback()来处理查询结果并将输出内容改为中文。对于其他操作,我们只需检查SQL查询是否成功并处理相应的错误消息即可。
需要注意的是,在实际开发中,还需要对输入进行合法性验证以及防止SQL注入攻击等安全问题。

http://www.lryc.cn/news/391145.html

相关文章:

  • 秋招Java后端开发冲刺——并发篇2(JMM与锁机制)
  • 记录一次Chrome浏览器自动排序ajax请求的JSON数据问题
  • 【嵌入式——FreeRTOS】任务
  • 网关,路由器,交换机
  • sublime 3 背景和字体颜色修改
  • leetcode 403周赛 包含所有1的最小矩形面积||「暴力」
  • Stable Diffusion web UI 插件
  • 深度学习中的反向传播算法的原理
  • 身处奇瑞看三星:既“开卷“又“起火“,却更难受了
  • 系统架构设计师教程(清华第2版)<第1章 绪论>解读
  • Vue + Element UI + JSEncrypt实现简单登录页面
  • 从“关注流”到“时间线”,搜狐给内容加信任价值
  • vscode的一些使用问题
  • 爬虫-网页基础
  • 保存huggingface缓存中AI模型(从本地加载AI模型数据)
  • wps的xlsm和xltm和xlam格式的文件各有什么区别
  • 软件性能测试有哪几种测试方法?专业性能测试报告出具
  • JavaScript语言简介与实战应用:从零开始的编程之旅
  • 如何理解synchronized锁升级
  • js【最佳实践】遍历数组的八种方法(含数组遍历 API 的对比)for,forEach,for of,map,filter,reduce,every,some
  • Node.js开发实战 视频教程 下载
  • VS2022(Visual Studio 2022)最新安装教程
  • 从华为和特斯拉之争,看智能驾驶的未来
  • 20240705 每日AI必读资讯
  • C++ 设计模式之访问者模式
  • linux——IPC 进程间通信
  • JAVA数字化产科管理平台源码:涵盖了孕妇从建档、产检、保健、随访、分娩到产后42天全流程的信息化管理
  • http数据传输确保完整性和保密性整流程方案(含源码)
  • UE插件与云渲染:10个提升效率的选择
  • [Shell编程学习路线]——shell脚本中case语句多分支选择详解