【sqlite3】联系人管理系统

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

有关sqlite3的基础知识请点击:SQLite3的使用
效果展示:

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

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

以下是创建数据表的SQL语句:

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

代码:

c 复制代码
#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;
}

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

c 复制代码
#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;
}

完整代码

联系人管理系统完整代码

c 复制代码
#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注入攻击等安全问题。

相关推荐
数据智能老司机1 小时前
CockroachDB权威指南——CockroachDB SQL
数据库·分布式·架构
数据智能老司机2 小时前
CockroachDB权威指南——开始使用
数据库·分布式·架构
松果猿2 小时前
空间数据库学习(二)—— PostgreSQL数据库的备份转储和导入恢复
数据库
无名之逆2 小时前
Rust 开发提效神器:lombok-macros 宏库
服务器·开发语言·前端·数据库·后端·python·rust
s9123601012 小时前
rust 同时处理多个异步任务
java·数据库·rust
cg50172 小时前
Spring Boot 的配置文件
java·linux·spring boot
似水এ᭄往昔2 小时前
【C语言】文件操作
c语言·开发语言
数据智能老司机2 小时前
CockroachDB权威指南——CockroachDB 架构
数据库·分布式·架构
暮云星影3 小时前
三、FFmpeg学习笔记
linux·ffmpeg
hzulwy3 小时前
Redis常用的数据结构及其使用场景
数据库·redis