【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注入攻击等安全问题。
相关文章:
【sqlite3】联系人管理系统
SQLite3实现简单的联系人管理系统 有关sqlite3的基础知识请点击:SQLite3的使用 效果展示: 创建一个名为contacts.db的数据库 首先,我们需要创建一个名为contacts.db的数据库,并建立一个名为"contact"的表࿰…...
秋招Java后端开发冲刺——并发篇2(JMM与锁机制)
本文对Java的内存管理模型、volatile关键字和锁机制进行详细阐述,包括synchronized关键字、Lock接口及其实现类ReentrantLock、AQS等的实现原理和常见方法。 一、JMM(Java内存模型) 1. 介绍 JMM定义了共享内存中多线程程序读写操作的行为规…...
记录一次Chrome浏览器自动排序ajax请求的JSON数据问题
文章目录 1.前言2. 为什么会这样?3.如何解决? 1.前言 作者作为新人入职的第一天,mentor给了一个维护公司运营平台的小需求,具体需求是根据运营平台的某个管理模块所展示记录的某些字段对展示记录做排序。 第一步: myb…...
【嵌入式——FreeRTOS】任务
【嵌入式——FreeRTOS】任务 任务创建和删除动态方式创建任务静态方式创建任务 删除任务任务切换调度器任务切换流程 任务挂起任务恢复相关API函数 任务创建和删除 动态方式创建任务 任务的任务控制块以及任务的栈空间所需的内存,均由freeRTOS从freeRTOS管理的堆中…...
网关,路由器,交换机
一、网关 (Gateway) 是一种设备,用于连接不同网络,能够转发数据包并翻译协议,允许不同类型的网络通信。网关通常工作在OSI模型的应用层或传输层,提供连接和路由服务。 应用场景例子: 在企业网络中,网关可…...
sublime 3 背景和字体颜色修改
sublime 4 突然抽风,每次打开都显示 “plugin_host-3.3 has exited unexpectedly, some plugin functionality won’t be available until Sublime Text has been restarted” 一直没调好,所以我退回到sublime 3了。下载好了软件没问题,但是一…...
leetcode 403周赛 包含所有1的最小矩形面积||「暴力」
3197. 包含所有 1 的最小矩形面积 II 题目描述: 给你一个二维 二进制 数组 grid。你需要找到 3 个 不重叠、面积 非零 、边在水平方向和竖直方向上的矩形,并且满足 grid 中所有的 1 都在这些矩形的内部。 返回这些矩形面积之和的 最小 可能值。 注意…...
Stable Diffusion web UI 插件
2024.7.3更新,持续更新中 如果需要在linux上自己安装sd,参考:stable diffusion linux安装 插件复制到 /stable-diffusion-webui/extensions 目录下,然后重新启动sd即可 一、插件安装方法 每种插件的安装方法可能略有不同…...
深度学习中的反向传播算法的原理
深度学习中的反向传播算法的原理,以及如何计算梯度 反向传播算法(Backpropagation)是深度学习中最核心的优化技术之一,用于训练神经网络。它基于链式法则,通过从输出层逆向计算误差并逐层传递到输入层来更新模型参数&…...
身处奇瑞看三星:既“开卷“又“起火“,却更难受了
三星"起火" 这几天奇瑞的事情,让大家破防了,纷纷表示国内的就业市场环境普遍恶劣。 那我们转个眼,看看海外企业的情况。 最近一周,三星频频登上新闻,颇有"起火"之势。 在刚步入下半年的 7 月 1 日…...
系统架构设计师教程(清华第2版)<第1章 绪论>解读
系统架构设计师教程 第一章 绪论 1.1 系统架构概述1.1.1 系统架构的定义及发展历程1.1.2 软件架构的常用分类及建模方法1.1.3 软件架构的应用场景1.1.4 软件架构的发展未来1.2 系统架构设计师概述1.2.1 架构设计师的定义、职责和任务1.2.2 架构设计师应具备的专业素质1.3 如何成…...
Vue + Element UI + JSEncrypt实现简单登录页面
安装依赖 npm install jsencrypt --save局部引入 import JSEncrypt from jsencrypt/bin/jsencrypt;登录页面index.vue <template><div class"loginbody"><div class"logindata"><div class"logintext"><h2>Wel…...
从“关注流”到“时间线”,搜狐给内容加信任价值
文 | 螳螂观察 作者 | 易不二 在近日第十六季搜狐新闻马拉松活动中,搜狐新闻APP的“时间线”功能备受瞩目。不仅开幕式现场竖了一块“左手时间线,右手关注流”的路牌,张朝阳也着重强调了“时间线”产品的互动方式:“关注是基础&…...
vscode的一些使用问题
vscode使用技巧 1、快捷键(1)打开命令面板(2)注释(3)删除行(4)上下移动光标(5)光标回退(6)复制行(7)插入空白行…...
爬虫-网页基础
HTML 基本语法 HTML:Hyper Text Markup Language, 超文本标记语言,是计算机语言的一种,由元素构成。 p元素 <p>Web 真好玩!</p> 由三大部分组成 开始标签:一对尖括号中间包裹这元素名称元素内容&#x…...
保存huggingface缓存中AI模型(从本地加载AI模型数据)
在github下拉项目后,首次运行时会下拉一堆模型数据,默认是保存在缓存的,如果你的系统盘空间快满的时候就会被系统清理掉,每次运行又重新下拉一次,特别麻烦。 默认下载的缓存路径如下:C:\Users\用户名\.cache\huggingf…...
wps的xlsm和xltm和xlam格式的文件各有什么区别
文章目录 一、前言二、WPS表格文件格式介绍1. .xlsm 文件格式2. .xltm 文件格式3. .xlam 文件格式 三、总结 一、前言 本文将详细介绍WPS表格中三种常见的文件格式:.xlsm、.xltm、和.xlam,并提供通俗易懂的解释和示例,帮助用户理解它们的区别…...
软件性能测试有哪几种测试方法?专业性能测试报告出具
软件性能测试是指对软件系统在特定负载条件下的性能进行评估和验证的过程,目的是确保软件在正常使用的情况下能够满足用户的要求,并在稳定的性能水平下运行,在软件开发过程中起到了至关重要的作用,可以确保软件产品的质量和可靠性…...
JavaScript语言简介与实战应用:从零开始的编程之旅
JavaScript,一种轻量级的、解释型的、面向对象的脚本语言,自1995年由Netscape公司的Brendan Eich设计以来,迅速成为了Web开发中不可或缺的一部分。它不仅能够为静态网页添加动态效果,还能实现客户端与服务器的交互,如今…...
如何理解synchronized锁升级
在Java中,synchronized 关键字是实现线程同步的一种方式,它涉及到锁的升级和释放的过程。理解synchronized 锁的升级可以分为三个阶段:无锁状态、偏向锁状态和轻量级锁状态。 无锁状态: 当对象被创建时,默认处于无锁状…...
从零开始:roLabelImg安装与OBB旋转框标注实战指南
1. 为什么需要roLabelImg和旋转框标注 在计算机视觉项目中,我们经常需要标注图像中的目标物体。对于常规的矩形框标注,LabelImg这类工具已经足够好用。但遇到倾斜物体时,比如遥感图像中的飞机、自然场景中的交通标志、医学图像中的器官&#…...
Python自动化脚本:从零构建《三国杀》钓鱼辅助
1. 环境准备:搭建自动化钓鱼的基石 想要实现《三国杀》钓鱼自动化,首先需要搭建一个稳定的开发环境。我推荐使用雷电模拟器9作为游戏运行平台,它不仅对Android游戏兼容性好,而且提供了丰富的调试功能。记得在安装时选择非vivo手机…...
trae中安装mcp报Cannot find package/ERR_MODULE_NOT_FOUND问题
简介 我在trae中安装高德地图的mcp和其他的mcp报出了以下错误,以此记录并分享给大家。 新的改变 node:internal/modules/esm/resolve:204 const resolvedOption FSLegacyMainResolve(pkgPath, packageConfig.main, baseStringified); ^ Error: Cannot find pack…...
避开深沟槽工艺的“坑”:从DLTS数据到TCAD仿真的硅光电二极管陷阱态优化实战
硅光电二极管陷阱态优化的工程实践:从DLTS表征到TCAD仿真 在半导体制造领域,深沟槽隔离(DTI)工艺虽然能有效解决器件间的串扰问题,但其引入的界面陷阱态却成为光电二极管性能提升的"隐形杀手"。工艺工程师们…...
AI辅助开发:让快马AI智能生成自适应Win10镜像下载管理工具
AI辅助开发:让快马AI智能生成自适应Win10镜像下载管理工具 最近在折腾一个Windows系统镜像下载管理工具,发现传统下载方式存在不少痛点:下载源选择困难、网络波动导致中断、版本特性不透明。正好接触到InsCode(快马)平台的AI辅助开发功能&am…...
深入浅出Livepatch:从kprobe到ftrace的Linux热补丁实现原理
深入浅出Livepatch:从kprobe到ftrace的Linux热补丁实现原理 当你的生产环境服务器正在处理每秒数万次请求时,突然发现一个关键内核漏洞需要立即修复,传统方式要求重启系统——这无异于在高速公路上急刹车。Livepatch技术应运而生,…...
Graphormer开源模型部署教程:3.7GB小模型+RTX4090一键启动分子建模服务
Graphormer开源模型部署教程:3.7GB小模型RTX4090一键启动分子建模服务 1. 项目介绍 Graphormer是一种基于纯Transformer架构的图神经网络模型,专门为分子图(原子-键结构)的全局结构建模与属性预测而设计。这个3.7GB的小模型在OG…...
【卷积神经网络作业实现人脸的关键点定位功能】
下面是完成这道题目的代码:import os import cv2 import numpy as np import pandas as pd import torch import torch.nn as nn from torch.utils.data import Dataset,DataLoader from torchvision import transforms import matplotlib.pyplot as plt1. 数据集定…...
新手最值得入的一款ai音乐工具
2026年,ai音乐爆发的一年。国内国外各种AI音乐工具层出不穷。想要尝试AI音乐的新手宝宝该怎么去选择呢?市面上大大小小的ai音乐创作软件我基本都尝试过。我觉得只有一款工具是最值得推荐的,也是我使用的最多的。那就是蘑兔AI,你们…...
告别重复登录:D2RML如何革新暗黑2重制版多开体验
告别重复登录:D2RML如何革新暗黑2重制版多开体验 【免费下载链接】D2RML Diablo 2 Resurrected Multilauncher 项目地址: https://gitcode.com/gh_mirrors/d2/D2RML 作为暗黑破坏神2重制版的忠实玩家,你是否经历过这些令人沮丧的时刻?…...
