加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

SQLite3的各个函数(全)

发布时间:2020-12-12 20:11:28 所属栏目:百科 来源:网络整理
导读:首先,添加framework:libsqlite3.0.dylib 需要在对应文件的头文件中加入: #import "/usr/include/sqlite3.h" 并在Frameworks中加入所需的库,否则会报错: Undefined symbols: "_sqlite3_open",referenced from: 加入库的方法是: 选择sqlite库: 选择完的
#import "/usr/include/sqlite3.h"

并在Frameworks中加入所需的库,否则会报错:

Undefined symbols:
"_sqlite3_open",referenced from:

加入库的方法是:

选择sqlite库:

选择完的效果:

下面是代码:

//sqlite 常用语句

  1. [selfopenDataBase];
  2. [selfcreateTable];
  3. [selfinsertTable];
  4. [selfqueryTable];
  5. [selfdeleteTable];
  6. [selfqueryTable];

实现:

//opendatabase

  1. -(void)openDataBase
  2. {
  3. NSArray*documentsPaths=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES);
  4. NSString*databaseFilePath=[[documentsPathsobjectAtIndex:0]stringByAppendingPathComponent:@"db.sql"];
  5. if(sqlite3_open([databaseFilePathUTF8String],&database)==SQLITE_OK)
  6. {
  7. NSLog(@"opensqlitedbok.");
  8. }
  9. else
  10. {
  11. NSLog(@"cannotopensqlitedb");
  12. //closedatabase
  13. sqlite3_close(database);
  14. }
  15. }

//createtable

  1. -(void)createTable
  2. {
  3. char*errorMsg;
  4. constchar*createSql="createtableifnotexistspersons(idintegerprimarykeyautoincrement,nametext)";
  5. if(sqlite3_exec(database,createSql,NULL,&errorMsg)==SQLITE_OK)
  6. {
  7. NSLog(@"createok.");
  8. }
  9. else
  10. {
  11. NSLog(@"cannotcreatetable");
  12. [selfErrorReport:(NSString*)createSql];
  13. }
  14. }

//inserttable

  1. -(void)insertTable
  2. {
  3. char*errorMsg;
  4. constchar*insertSql="insertintopersons(name)values('田周辉')";
  5. if(sqlite3_exec(database,insertSql,&errorMsg)==SQLITE_OK)
  6. {
  7. NSLog(@"insertok.");
  8. }
  9. else
  10. {
  11. NSLog(@"cannotinsertittotable");
  12. [selfErrorReport:(NSString*)insertSql];
  13. }
  14. }

//error

  1. -(void)ErrorReport:(NSString*)item
  2. {
  3. char*errorMsg;
  4. if(sqlite3_exec(database,(constchar*)item,&errorMsg)==SQLITE_OK)
  5. {
  6. NSLog(@"%@ok.",item);
  7. }
  8. else
  9. {
  10. NSLog(@"error:%s",errorMsg);
  11. sqlite3_free(errorMsg);
  12. }
  13. }

//query

  • -(void)queryTable
  • {
  • constchar*selectSql="selectid,namefrompersons";
  • sqlite3_stmt*statement;
  • if(sqlite3_prepare_v2(database,selectSql,-1,&statement,nil)==SQLITE_OK)
  • {
  • NSLog(@"selectok.");
  • while(sqlite3_step(statement)==SQLITE_ROW)//SQLITE_OKSQLITE_ROW
  • {
  • int_id=sqlite3_column_int(statement,0);
  • NSString*name=[[NSStringalloc]initWithCString:(char*)sqlite3_column_text(statement,1)encoding:NSUTF8StringEncoding];
  • NSLog(@"row>>id%i,name>>%@",_id,name);
  • }
  • }
  • else
  • {
  • //error
  • [selfErrorReport:(NSString*)selectSql];
  • }
  • sqlite3_finalize(statement);
  • }
  • //delete

  • -(void)deleteTable
  • {
  • char*errorMsg;
  • [selfopenDataBase];
  • constchar*sql="DELETEFROMpersonswhereid=24";
  • if(sqlite3_exec(database,sql,&errorMsg)==SQLITE_OK)
  • {
  • NSLog(@"deleteok.");
  • }
  • else
  • {
  • NSLog(@"cannotdeleteit");
  • [selfErrorReport:(NSString*)sql];
  • }
  • }
  • 命令行:

    sqlite3database//创建数据库
    1. cratetabletableFile(idsmallint,file_namevarchar(256),up_statesmallint,file_sizesmallint);//创建一个表格
    2. insertintotableFilevalues(1,"200110101.rcu",100,4500);//插入数据
    3. 如何访问SQLite3数据库 ?
    4. sqlite3_open//打开数据库
    5. sqlite3_prepare//将UTF-8格式的SQL语句转换为指向已备语句的指针
    6. sqlite3_column_string//返回某一行的字符串
    7. sqlite3_finalize//删除一条已备语句
    8. sqlite3_close//关闭数据库
    sourcecode
    1. -(id)lookupSingularSQL:(NSString*)sqlforType:(NSString*)rettype{
    2. sqlite3_stmt*statement;
    3. idresult;
    4. if(statement=[selfprepare:sql]){
    5. if(sqlite3_step(statement)==SQLITE_ROW){
    6. if([rettypecompare:@"text"]==NSOrderedSame){
    7. chartemp_buf[256];
    8. memset(temp_buf,256);
    9. sprintf(temp_buf,"%s%s%s%s",(char*)sqlite3_column_text(statement,0),(char*)sqlite3_column_text(statement,1),
    10. (char*)sqlite3_column_text(statement,2),3));
    11. result=[NSStringstringWithUTF8String:temp_buf];
    12. //result=[NSStringstringWithUTF8String:(char*)sqlite3_column_text(statement,0)];
    13. }elseif([rettypecompare:@"integer"]==NSOrderedSame){
    14. result=(id)sqlite3_column_int(statement,0);
    15. }
    16. }
    17. }
    18. sqlite3_finalize(statement);
    19. returnresult;
    20. }

    应该有个成员变量,比如我的代码:

    1. @interfaceDetailViewController:UIViewController{
    2. UIPopoverController*popoverController;
    3. UIToolbar*toolbar;
    4. iddetailItem;
    5. UILabel*detailDescriptionLabel;
    6. sqlite3*database;

    打开数据库

    SQLite数据库是文件数据库,是保存在文件系统中的。因此需要知道文件保存到哪里,可参见iOS中对文件的操作。比如本文保存到Documents目录下。代码:

    1. NSArray*documentsPaths=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,YES);
    2. NSString*databaseFilePath=[[documentsPathsobjectAtIndex:0]stringByAppendingPathComponent:@"mydb"];
    3. if(sqlite3_open([databaseFilePathUTF8String],&database)==SQLITE_OK)
    4. {
    5. NSLog(@"opensqlitedbok.");
    6. }

    通过ssh查看Documents目录,发现mydb文件已经创建。sqlite的策略是如果有该文件就打开,如果没有就创建文件,也就是创建数据库。

    这里要注意,使用的是C语法,sqlite3_open传入的是database的地址。

    关闭数据库

    数据库使用完毕后,要关闭,比如退出应用的时候:

    1. -(void)viewDidUnload{
    2. //Releaseanyretainedsubviewsofthemainview.
    3. //e.g.self.myOutlet=nil;
    4. sqlite3_close(database);
    5. self.popoverController=nil;
    6. }

    建表语句

    数据库打开以后,如果没有表,建表:

    1. char*errorMsg;
    2. constchar*createSql="createtableifnotexistspersons(idintegerprimarykeyautoincrement,nametext)";
    3. if(sqlite3_exec(database,&errorMsg)==SQLITE_OK){
    4. NSLog(@"createok.");
    5. }

    这里要特别注意errorMsg传的是地址,因为该函数要通过地址引用来写报错字符信息。

    向表中插入记录

    和建表语句类似:

    1. constchar*insertSql="insertintopersons(name)values(‘张三’)";
    2. if(sqlite3_exec(database,&errorMsg)==SQLITE_OK){
    3. NSLog(@"insertok.");
    4. }

    错误信息的处理

    如果在多个地方使用errorMsg,那么每次使用完毕要清空一下字串,比如这样:

    1. if(sqlite3_exec(database,&errorMsg)==SQLITE_OK){
    2. NSLog(@"createok.");
    3. }else{
    4. NSLog(@"error:%s",errorMsg);
    5. sqlite3_free(errorMsg);
    6. }

    查询结果集

    结果集的查询,需要用到statement:

    1. constchar*selectSql="selectid,namefrompersons";
    2. sqlite3_stmt*statement;
    3. if(sqlite3_prepare_v2(database,nil)==SQLITE_OK){
    4. NSLog(@"selectok.");
    5. }
    6. while(sqlite3_step(statement)==SQLITE_ROW){
    7. int_id=sqlite3_column_int(statement,0);
    8. char*name=(char*)sqlite3_column_text(statement,1);
    9. NSLog(@"row>>id%i,name%s",name);
    10. }
    11. sqlite3_finalize(statement);

    不过这里有个问题,看看打印的日志:

    乱码。因为直接用的char类型来做的。

    解决办法是,用nsstring替代char:

    1. while(sqlite3_step(statement)==SQLITE_ROW){
    2. int_id=sqlite3_column_int(statement,0);
    3. NSString*name=[[NSStringalloc]initWithCString:(char*)sqlite3_column_text(statement,1)encoding:NSUTF8StringEncoding];
    4. NSLog(@"row>>id%i,name%@",name);
    5. }

    char生成nsstring的时候做一次显式的编码。问题解决:

    这说明:

    写入数据库,用char的方式没有问题,写入数据库的编码是对的;

    从库中取出,可能默认使用ascii解码,造成显示乱码。

    使用sqlite c api,要经常参考官方函数文档:http://www.sqlite.org/c3ref/funclist.html

    (编辑:李大同)

    【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    首先,添加framework:libsqlite3.0.dylib

    需要在对应文件的头文件中加入:

      推荐文章
        热点阅读