问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

delphi7 怎么调用sqlite3.dll中的函数

发布网友 发布时间:2022-04-07 23:22

我来回答

2个回答

懂视网 时间:2022-04-08 03:44

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

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

 #import "/usr/include/sqlite3.h"
并在Frameworks中加入所需的库,否则会报错:

 Undefined symbols: 
 "_sqlite3_open", referenced from:
加入库的方法是:

image
选择sqlite库:

image
选择完的效果:

image
下面是代码:

//sqlite 
 [self openDataBase]; 
 //[self createTable]; 
 //[self insertTable]; 
 [self queryTable]; 
 
 
 [self deleteTable]; 
 [self queryTable]; 
实现:

//open database 
- (void)openDataBase 
{ 
 NSArray *documentsPaths=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory 
        , NSUserDomainMask 
        , YES); 
 NSString *databaseFilePath=[[documentsPaths objectAtIndex:0] stringByAppendingPathComponent:@"db.sql"]; 
 
 if (sqlite3_open([databaseFilePath UTF8String], &database)==SQLITE_OK) 
 { 
 NSLog(@"open sqlite db ok."); 
 } 
 else 
 { 
 NSLog( @"can not open sqlite db " ); 
 
 //close database 
 sqlite3_close(database); 
 } 
} 
 
//create table 
- (void)createTable 
{ 
 char *errorMsg; 
 const char *createSql="create table if not exists persons (id integer primary key autoincrement,name text)"; 
 
 if (sqlite3_exec(database, createSql, NULL, NULL, &errorMsg)==SQLITE_OK) 
 { 
 NSLog(@"create ok."); 
 } 
 else 
 { 
 NSLog( @"can not create table" ); 
 [self ErrorReport:(NSString *)createSql]; 
 } 
} 
 
 
//insert table 
- (void)insertTable 
{ 
 char *errorMsg; 
 
 const char *insertSql="insert into persons (name) values (‘田周辉‘)"; 
 if (sqlite3_exec(database, insertSql, NULL, NULL, &errorMsg)==SQLITE_OK) 
 { 
 NSLog(@"insert ok."); 
 } 
 else 
 { 
 NSLog( @"can not insert it to table" ); 
 [self ErrorReport: (NSString *)insertSql]; 
 } 
} 
 
 
//error 
- (void)ErrorReport: (NSString *)item 
{ 
 char *errorMsg; 
 
 if (sqlite3_exec(database, (const char *)item, NULL, NULL, &errorMsg)==SQLITE_OK) 
 { 
 NSLog(@"%@ ok.",item); 
 } 
 else 
 { 
 NSLog(@"error: %s",errorMsg); 
 sqlite3_free(errorMsg); 
 } 
} 
 
 
//query table 
- (void)queryTable 
{ 
 const char *selectSql="select id,name from persons"; 
 sqlite3_stmt *statement; 
 if (sqlite3_prepare_v2(database, selectSql, -1, &statement, nil)==SQLITE_OK) 
 { 
 NSLog(@"select ok."); 
 while (sqlite3_step(statement)==SQLITE_ROW)//SQLITE_OK SQLITE_ROW 
 { 
  int _id=sqlite3_column_int(statement, 0); 
  NSString *name=[[NSString alloc] initWithCString:(char *)sqlite3_column_text(statement, 1) encoding:NSUTF8StringEncoding]; 
  NSLog(@"row>>id %i, name>> %@",_id,name); 
 } 
  
 } 
 else 
 { 
 //error 
 [self ErrorReport: (NSString *)selectSql]; 
 } 
 
 sqlite3_finalize(statement); 
} 
 
//delete table 
- (void)deleteTable 
{ 
 char *errorMsg; 
 [self openDataBase]; 
 
 const char *sql = "DELETE FROM persons where id=24"; 
 if (sqlite3_exec(database, sql, NULL, NULL, &errorMsg)==SQLITE_OK) 
 { 
 NSLog(@"delete ok."); 
 } 
 else 
 { 
 NSLog( @"can not delete it" ); 
 [self ErrorReport: (NSString *)sql]; 
 } 
 
} 
命令行:

sqlite3 database //创建数据库 
  crate table tableFile(id smallint, file_name varchar(256), up_state smallint, file_size smallint); //创建一个表格 
 insert into tableFile values(1, "200110101.rcu", 100, 4500); //插入数据 
5 如何访问SQLite3数据库 
sqlite3_open //打开数据库 
sqlite3_prepare //将UTF-8格式的SQL语句转换为指向已备语句的指针 
sqlite3_column_string //返回某一行的字符串 
sqlite3_finalize //删除一条已备语句 
sqlite3_close //关闭数据库 
 
6 source code 
 
- (id)lookupSingularSQL:(NSString *)sql forType:(NSString *)rettype { 
 
sqlite3_stmt *statement; 
 
id result; 
 
if (statement = [self prepare:sql]) { 
 
if (sqlite3_step(statement) == SQLITE_ROW) { 
 
if ([rettype compare:@"text"] == NSOrderedSame) { 
 
char temp_buf[256]; 
 
memset(temp_buf, 0, 256); 
 
sprintf(temp_buf, "%s %s %s %s", 
 
(char *)sqlite3_column_text(statement,0), 
 
(char *)sqlite3_column_text(statement,1), 
 
(char *)sqlite3_column_text(statement,2), 
 
(char *)sqlite3_column_text(statement,3) 
 
); 
 
result = [NSString stringWithUTF8String:temp_buf]; 
 
//result = [NSString stringWithUTF8String:(char *)sqlite3_column_text(statement,0)]; 
 
} else if ([rettype compare:@"integer"] == NSOrderedSame) { 
 
result = (id)sqlite3_column_int(statement,0); 
 
  } 
 
} 
 
} 
 
sqlite3_finalize(statement); 
 
return result; 
 
} 
应该有个成员变量,比如我的代码:

@interface DetailViewController : UIViewController { 
UIPopoverController *popoverController; 
UIToolbar *toolbar; 
id detailItem; 
UILabel *detailDescriptionLabel; 
sqlite3 *database; 
打开数据库

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

NSArray *documentsPaths=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory 
, NSUserDomainMask 
, YES); 
NSString *databaseFilePath=[[documentsPaths objectAtIndex:0] stringByAppendingPathComponent:@"mydb"]; 
if (sqlite3_open([databaseFilePath UTF8String], &database)==SQLITE_OK) { 
NSLog(@"open sqlite db ok."); 
} 
通过ssh查看Documents目录,发现mydb文件已经创建。sqlite的策略是如果有该文件就打开,如果没有就创建文件,也就是创建数据库。

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

关闭数据库

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

- (void)viewDidUnload { 
// Release any retained subviews of the main view. 
// e.g. self.myOutlet = nil; 
sqlite3_close(database); 
self.popoverController = nil; 
} 
建表语句

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

char *errorMsg; 
const char *createSql="create table if not exists persons (id integer primary key autoincrement,name text)"; 
if (sqlite3_exec(database, createSql, NULL, NULL, &errorMsg)==SQLITE_OK) { 
NSLog(@"create ok."); 
} 
这里要特别注意errorMsg传的是地址,因为该函数要通过地址引用来写报错字符信息。

向表中插入记录

和建表语句类似:

const char *insertSql="insert into persons (name) values(‘张三’)"; 
if (sqlite3_exec(database, insertSql, NULL, NULL, &errorMsg)==SQLITE_OK) { 
NSLog(@"insert ok."); 
} 
错误信息的处理

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

if (sqlite3_exec(database, createSql, NULL, NULL, &errorMsg)==SQLITE_OK) { 
NSLog(@"create ok."); 
}else { 
NSLog(@"error: %s",errorMsg); 
sqlite3_free(errorMsg); 
} 
查询结果集

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

const char *selectSql="select id,name from persons"; 
sqlite3_stmt *statement; 
if (sqlite3_prepare_v2(database, selectSql, -1, &statement, nil)==SQLITE_OK) { 
NSLog(@"select ok."); 
} 
while (sqlite3_step(statement)==SQLITE_ROW) { 
int _id=sqlite3_column_int(statement, 0); 
char *name=(char *)sqlite3_column_text(statement, 1); 
NSLog(@"row>>id %i, name %s",_id,name); 
} 
sqlite3_finalize(statement); 
不过这里有个问题,看看打印的日志:

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

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

while (sqlite3_step(statement)==SQLITE_ROW) { 
int _id=sqlite3_column_int(statement, 0); 
NSString *name=[[NSString alloc] initWithCString:(char *)sqlite3_column_text(statement, 1) encoding:NSUTF8StringEncoding]; 
NSLog(@"row>>id %i, name %@",_id,name); 
} 
char生成nsstring的时候做一次显式的编码。问题解决:

image
这说明:

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

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

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

  

SQLite3-各个函数

标签:

热心网友 时间:2022-04-08 00:52

sqlite是c语言写的,开源的小型数据库。官网可以下到源代码(不带加密功能的),里面包含API的格式。sqlite3
是数据库定义的数据结构,**ppDb是个指针的指针,原文定义是:OUT: SQLite db
handle,所以delphi定义一个无类型指针就可以,比如db: pointer;
可以很容易搜索到Delphi与C语言类型转换对照表。有很多组件可以操作sqlite数据库(部分收费),比如UniDAC、zeoslib(开源)、DISQLite3、sivak3,高版本Delphi自带的FireDAC、dbExpress等。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
保温钉保温钉 《纯爱恋歌Ⅰ》txt全集下载 Win10实时防护无法打开怎样关闭? 网上银行添加下挂卡(猪福卡)可以交易吗? 违章显示已处理未交款 和女友闹矛盾,她说分手很多次了。今天我故意发我和前女友照片在空间并发... 我跟我男朋友分手了,我在朋友圈发了朋友送的花,还说重新开始新的恋_百... ...去送东西。他没要,他发了一个朋友圈,大家看看什么意思? 当一个人看着你发一些话在朋友圈故意气他,结果他又把你拉黑了,什么意思... 写以个作文题目为“从明天起做一个……的人” 如何处理自己的心理压力? 如何调适心理压力 如何发泄心里的种种压力? 如何解决心理上的压力? 如何减轻自己的心理压力 Intel赛扬J1900处理器的集显相当于什么独立显卡? 我发现我爸爸在看黄色,怎么办,我好怕啊 。?。。。。。。?。?,?。。@嗯嗯嗯行啊爸爸爸爸巴巴爸爸妈妈都把老妹网络也坏了帮大努力la bo笨 当遇到心理压力时如何解决 j1900的 hd graphics显卡具体型号是多少? 赛扬j1900四核处理器自带集成显卡怎么样 嗯嗯我今年十五岁 我爸爸有糖尿病和心脏病 我怕有遗传我也会中这么办 - 信息提示 成都在校大学本科户口满四年还没有毕业的可以买房吗 成都入集体户2年可以买房吗 成都两年户口没有社保可以在天府新区买房吗? 成都本科落户后多久可以买房 成都人才落户多久可以买房 成都本科落户不满2年可以购房吗 成都人才落户多久可以买房? 手机复机什么意思? 什么叫做复机? 什么是停机保号,复机功能? 天翼手机复机是什么意思? 什么是停机保号,复机功能 中国电信短信通知让复机是啥意思 中国联通停机保号复机是什么意思? 双向复机是什么意思(手机双向复机是什么意思) 什么是天翼手机停复机业务? 什么是移动手机停复机? 求这张壁纸的iphone无dock的图 小米平板2为什么不能再其他软件上下应用呢 ios10越狱了有什么主题能把界面改为老ios样式,比如3d dock栏的ios5 小米平板2 win10应用商店有微软账号为什么下不了软件 怎么弄成这样,dock栏,ios11最新版 怎么把win10任务栏变成iOS程序坞的样子 为什么小米平板不可以下载万能钥匙和应用宝 小米平板5如何下载hd版应用 ios7.1.1与ios7.1比,有什么变化 小米平板电脑刚买来,下载任何软件安装时都显示:禁止安装,说你的您的平板电脑己设置为禁止安装来源不明