因为学了一点sqlite3数据库和gtk方面的东西,我又想到了做一个数据库简单操作的图形化显示,就是用gtk做一个页面,在页面上能够对指定数据库指定的表进行 增删查改操作。
我用的也就是滚动窗口+分栏列表和一些简单的按钮,行编辑操作。通过设计,我的想法是把查到的数据显示在分栏列表中,然后通过查看分栏列表中的数据,进行数据库操作。
这是实现后的界面,没有任何的修饰,主要是还没学到颜色等操作,有点小尴尬。
通过添加按钮可以向数据库的表中插入数据让然后在当前分栏列表中增加一行添加的数据
删除按钮不能通过点击分栏列表中的数据进行删除,本来是想实现这个功能的,当时总是有点问题,所以只能通过进行行编辑手动删除。
查找,修改也是这样的,不过修改的匹配条件只有账号,即id,修改后的id还是这个id,所以修改无法修改id的内容。
读取所有信息,就是遍历数据库该表中的所有数据。
虽然只是一个小小的项目,但还是花了一天的时间,老是遇到 段错误(核心已转储)问题,花费了不少时间,这个项目的主要问题还是如何把数据库中的数据显示到分栏列表中,简单的说就是我字符串赋值问题有点不会,最后还是查了怎么给字符数组分配内存才解决这个问题的。
不多数配上代码
#include <gtk/gtk.h>
#include "sqlite3.h"
#include <stdio.h>
GtkWidget *label;
GtkWidget *label1;
GtkWidget *label2;
GtkWidget *label3;
GtkWidget *label6;
GtkWidget *label4;
GtkWidget *fixed;
GtkWidget *clist;
const gchar *id;
const gchar *name;
const gchar *addr;
const gchar *sex;
gchar *text;
gint y;
gint x;
char *text1[]={
"id","name","addr","sex"};
/*------------------------分栏列表点击事件---------------------------*/
void deal8(GtkWidget *clist,gint row,gint column,GdkEventButton
*event,gpointer user_data)
{
gtk_widget_queue_draw(clist);
gtk_clist_get_text(GTK_CLIST(clist),row,column,&text);
y=column;
x=row;
g_print("%s\n",text);
g_print("%d\n",x);
}
/*--------------------------得到行编辑的内容---------------------*/
void deal1(GtkButton *button,gpointer user_data)
{
id=gtk_entry_get_text((GtkEntry *)user_data);
}
void deal2(GtkButton *button,gpointer user_data)
{
name=gtk_entry_get_text((GtkEntry *)user_data);
}
void deal3(GtkButton *button,gpointer user_data)
{
addr=gtk_entry_get_text((GtkEntry *)user_data);
}
void deal4(GtkButton *button,gpointer user_data)
{
sex=gtk_entry_get_text((GtkEntry *)user_data);
}
/*-----------------------------------------数据库删除操作--------------------------------*/
void deal10(GtkButton *button,gpointer user_data)
{
sqlite3 *db;
int ret=sqlite3_open("wxb1.db",&db);
const gchar *text=gtk_button_get_label(GTK_BUTTON(button));
char cmd[100]="";
char *errmsg=NULL;
sprintf(cmd,"delete from person where id=\'%s\' or name=\'%s\' or addr=\'%s\' or sex=\'%s\';",id,name,addr,sex);
ret =sqlite3_exec(db,cmd,NULL,NULL,&errmsg);
if (ret != SQLITE_OK)
{
gtk_label_set_text(GTK_LABEL(label4),"删除失败");
}
else
gtk_label_set_text(GTK_LABEL(label4),"删除成功");
gtk_clist_remove(GTK_CLIST(clist),x);
ret=sqlite3_close(db);
}
/*-----------------------------------------数据库修改-----------------------------------*/
void deal9(GtkButton *button,gpointer user_data)
{
sqlite3 *db;
int ret=sqlite3_open("wxb1.db",&db);
const gchar *text=gtk_button_get_label(GTK_BUTTON(button));
char cmd[100]="";
char *errmsg=NULL;
//if(strcmp(id,")
sprintf(cmd,"update person set id=\'%s\',name=\'%s\',addr=\'%s\',sex=\'%s\' where id=\'%s\';",id,name,addr,sex,id);
ret =sqlite3_exec(db,cmd,NULL,NULL,&errmsg);
if (ret != SQLITE_OK)
{
gtk_label_set_text(GTK_LABEL(label4),"修改失败");
}
else
gtk_label_set_text(GTK_LABEL(label4),"修改成功");
ret=sqlite3_close(db);
int i;
int m=4;
char **p = (char *)malloc(m*sizeof(char *));
for(i=0;i<m;i++)
{
p[i]=(char *)malloc(sizeof