【sqlite3】联系人管理系统

news2024/12/28 18:29:40

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 50

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 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 50

static 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.coloradmin.cn/o/1889746.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

20.《C语言》——【移位操作符】

&#x1f339;开场语 亲爱的读者&#xff0c;大家好&#xff01;我是一名正在学习编程的高校生。在这个博客里&#xff0c;我将和大家一起探讨编程技巧、分享实用工具&#xff0c;并交流学习心得。希望通过我的博客&#xff0c;你能学到有用的知识&#xff0c;提高自己的技能&a…

八大催化剂,花旗为何高调看涨港股?

港股三大指数今日迎来快速拉升行情&#xff0c;恒生科技指数午间一度大幅上涨2.51%&#xff0c;恒指、国指分别上涨1.18%及1.22%&#xff0c;恒指一度收复万八关口。截止收盘&#xff0c;恒生仍然保持1.18%左右的涨幅。 7月2日&#xff0c;据恒生指数公司消息&#xff0c;恒生…

Docker加速器配置指南:提升镜像下载速度的秘诀 加速安装Mysql Redis ES

在安装 Docker 镜像时&#xff0c;由于官方镜像下载速度较慢&#xff0c;我们可以使用阿里云的镜像加速器来提升下载速度。 使用阿里云镜像加速器 首先&#xff0c;找到并配置阿里云的镜像加速器。安装教程如下&#xff1a; 登录阿里云&#xff0c;进入容器镜像服务。直达链…

VSCode里python代码不扩展/级联了的解决办法

如图 解决办法&#xff1a;重新下载新的扩展工具 步骤如下 1、在左边工具栏打开Extensions 2、搜索框输入python&#xff0c;选择别的扩展工具&#xff0c;点击Install - 3在扩展工具所在的目录下&#xff0c;新建一个文件&#xff0c;就可以用了

地理信息科学:生态保护的智慧经纬

在地球这颗蓝色星球上&#xff0c;每一片森林的呼吸、每一条河流的流淌&#xff0c;都是生命交响曲中不可或缺的音符。而地理信息科学&#xff08;GIS&#xff09;&#xff0c;正是我们手中解读自然密码、护航生态平衡的精密仪器。今天&#xff0c;让我们深入探讨GIS如何在生物…

蒙阴蜜桃节:北纬 35 度的甜蜜盛宴

蒙阴&#xff0c;这座位于北纬 35 度黄金水果带的魅力之城&#xff0c;凭借着沙壤土、长日照、大温差、好生态的天然禀赋&#xff0c;孕育出了令人陶醉的“蒙阴蜜桃——北纬 35 度的甜”。 7月2日—3日&#xff0c;主题为“蒙阴好丰景 桃香产业兴”的国家鲁中山区桃产业集群项目…

Atom CMS v2.0 SQL 注入漏洞(CVE-2022-25488)

前言 CVE-2022-25488 是一个发现于 Telesquare SDT-CW3B1 设备中的命令注入漏洞。这一漏洞可以被未经认证的远程攻击者利用&#xff0c;通过特殊构造的 HTTP 请求在设备上执行任意命令。以下是关于该漏洞的详细信息&#xff1a; 漏洞详细信息 漏洞编号: CVE-2022-25488影响范…

V-bind指令配合图片轮播案例

我们先写个图片&#xff0c;这个图片是静态的&#xff0c;不会轮播改变。但有时图片是动态的&#xff0c;要通过一些程序对它进行动态改变&#xff0c;这时就需要V-bind来进行绑定&#xff0c;先放个图片进去&#xff0c;代码如下&#xff1a; <template><view>&l…

智驾追平、销量复活,蔚来又有未来了?

文&#xff5c;刘俊宏 编&#xff5c;王一粟 六月&#xff0c;是智能汽车集体“狂欢”的月份。 根据最新的汽车销量显示&#xff0c;多家智能汽车厂商“开起了香槟”。理想汽车和鸿蒙智行分列“榜一榜二”&#xff0c;两者分别以47774辆和46141辆的成绩&#xff0c;“咬的难…

探索Linux:开源世界的无限可能

Linux是一款开源操作系统&#xff0c;它的起源可以追溯到上世纪90年代初。这个故事始于一个名叫Linus Torvalds的芬兰大学生&#xff0c;他在1983年开始编写一个用于个人电脑的操作系统内核。在他的努力下&#xff0c;Linux逐渐发展成为一个稳定而强大的操作系统。 然而&#…

预测未来 | Matlab实现HMM隐马尔科夫时间序列预测未来

预测未来 | Matlab实现HMM隐马尔科夫时间序列预测未来 目录 预测未来 | Matlab实现HMM隐马尔科夫时间序列预测未来效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.预测未来 | Matlab实现HMM隐马尔科夫时间序列预测未来 2.运行环境为Matlab2023b及以上&#xff1b; 3…

安卓手机软件自动运行插件的开发流程及代码科普!

随着智能手机的普及和移动互联网的快速发展&#xff0c;安卓手机软件的需求日益旺盛&#xff0c;为了提高软件的功能性和扩展性&#xff0c;许多开发者选择通过插件的方式为软件添加新功能。 一、安卓手机软件自动运行插件的开发流程 1、明确需求与目标 在开发安卓手机自动运…

炎黄数智人:万科集团——智能催收专员‘崔筱盼’,引领财务管理数字化转型

在数字化时代的浪潮中&#xff0c;人工智能&#xff08;AI&#xff09;技术的飞速发展正深刻改变着商业世界的面貌。万科集团&#xff0c;作为中国房地产行业的翘楚&#xff0c;一直致力于探索和实践最前沿的科技创新。此次&#xff0c;万科集团推出的数字员工“崔筱盼”&#…

pytorch、pytorch_lightning、torchmetrics版本对应

目录 1.pytorch_lightning对应版本安装 2.PyTorch Lightning介绍 PyTorch Lightning 的作用&#xff1a; PyTorch Lightning 的基本用法&#xff1a; 报错&#xff1a;ModuleNotFoundError: No module named pytorch_lightning 这种报错一看就是缺了pytorch_lightning包&am…

idea使用maven打包报错GBK不可映射字符,错误: 编码GBK的不可映射字符

方法一&#xff1a;设置环境变量 打开“控制面板” > “系统和安全” > “系统”。点击“高级系统设置”。在“系统属性”窗口中&#xff0c;点击“环境变量”。在“系统变量”部分&#xff0c;点击“新建”&#xff0c;创建一个新的变量&#xff1a; 变量名&#xff1a;…

网工内推 | 高级信息安全工程师,上市公司,CISP认证优先

01 奔图电子 &#x1f537;招聘岗位&#xff1a;高级信息安全工程师 &#x1f537;岗位职责&#xff1a; 1、建立和完善研发信息安全管理体系、流程&#xff0c;监督和客观评价研发信息安全管理与风险内部控制情况 2、负责研发信息安全项目的实施和监督&#xff0c;包括安全检…

游戏工作室如何巧妙应对IP封禁风险?

游戏工作室在使用IP时&#xff0c;面临着封号的风险&#xff0c;因此需要采取一些防封技巧来保护自己的运营。以下是一些游戏工作室常用的防封技巧。 1. 多IP轮换 游戏工作室可以使用多个代理IP&#xff0c;并定期轮换它们。这样做可以减少单个IP被频繁访问同一游戏服务器而被…

2024.7.3作业

1. 梳理笔记(原创) 明天继续提问 2.程序运行后的输出结果为&#xff08;1&#xff09; #include <stdio.h> #define SQR(X) X*X void main() { int a10,k2,m1; a / SQR(km)/SQR(km); printf("%d\n",a); } 结果为1

有哪些不同的视频格式及其用途?

数字格式的视频文件由两部分组成&#xff0c;即“编解码器”和“容器”。“编解码器”用于压缩和解压缩视频文件&#xff0c;因为有时视频文件太大&#xff0c;在尝试下载或播放文件时可能会造成困难。“编解码器”的一些示例有FFMpeg、DivX、XviD和x264。“容器”是存储有关数…