之前的连续五篇大致介绍了各种SQLite的原生函数原型,参数以及用途等,并对各个封装的类做了详细的介绍,最后一篇将展示一下怎么使用封装,使用封装的时候需要注意的问题等。
假设已经存在一个数据库名为FirSQLite.db;下面使用各种类来对其做各种常规访问与操作。
最开始要定义一个CppSQLite3DB类对象 db;然后调用函数Open(const char *)打开一个已经存在的数据库,如果不存在就创建一个新的数据库。
非查询类的sql语句调用举例
1:根据一条sql语句创建一个表。db.ExecDML("create table teacher (t_id int, t_age int, t_sex char);");
2:插入一条记录。db.ExecDML("insert into teacher values(124, 30, 'M');");
3:更新一条记录。db.ExecDML("update teacher set t_age = 11 where t_id = '123';");
4:删除表,用的是drop,删除整个物理存储表。db.ExecDML("drop table teacher;");
以上操作是针对非查询类的语句,虽然会返回受影响的行数,但一般没用到。
获取一整个表的内容,并具有针对性的获取数据。
CppSQLite3Table ct = db.GetTable("select * from teacher order by 1");
int id, age;
char *sex, *name;
for (int row = 0; row < ct.NumOfRows(); row++)
{
ct.SetRow(row); //每次获取数据前要显式的指定行值
ct.GetIntField(0, id);
ct.GetIntField(1, age); //然后根据列索引(从0开始)以及数据类型获取
ct.GetStringField(2, sex); //这里使用的是向函数中传递一个引用
ct.GetStringField(3, name);
cout<<id<<" "<<age<<" "<<sex<<" "<<name<<endl;
}
根据查询语句获取一个满足条件的结果并管理。
CppSQLite3Query cq = db.ExecQuery("select * from teacher where t_sex = 'M';");
int id, age;
char *sex, *name;
while (!cq.Eof())
{
cq.GetIntValue(0,id);
cq.GetIntValue(1, age);
cq.GetStringValue(2, sex);
cq.GetStringValue(3, name);
cout<<id<<" "<<age<<" "<<sex<<" "<<name<<endl;
cq.NextRow(); //每一次要调用一次函数,将转到下一条查询记录开始出
}
cq.Finalize(); //查询语句结束后,要显式的调用这个函数,终结这个特定的sqlite3_stmt*对象。
最后总结一下使用原生函数执行的流程所使用的函数都被封装在了哪里。
sqlite3_open(const char *)在CppSQlite3DB::Open(const char *)函数中。
如果要执行CppSQLite3DB::ExecDML(const char *)函数,则内部会直接调用一个sqlite3_exec()函数直接作用在数据库对象上,并返回受影响的行数。
如果要执行的CppSQLite3DB::ExecQuery(const char *)函数,内部先对一个const char *的sql语句通过CppSQLite3DB::Compile(const char *)生成一个sqlite3_stmt*对象,然后再执行查询。