SQLite开发拾遗

最近,在使用SQLite3进行GIS开发。使用SQLite3作为数据库引擎,存储空间数据。但不是使用OGC标准,也不是类似Oracle Saptial的管理模式,而是自定义的数据管理方式、Geometry模型。在开发过程中,遇到的点点滴滴都记录下来,以备今后赏析。

 

 

SQLite 分页查询

写法1:

SELECT * FROM TABLE1 LIMIT  20 OFFSET 20 ;

写法2:

SELECT * FROM TABLE1 LIMIT 20 , 20;

 

 

SQLite 文件的压缩
在多次删除数据、插入数据、更新数据后,数据库体积增大,但实际有效数据量很小,则需要对数据库进行压缩、整理,把已经删除的数据从物理文件中移除。调用一下SQL命令即可:

VACUUM

 

表清空

SQLITE目前并不支持TRUNCATE命令,可以用一下命令代替:

 

DELETE FROM TABLE1;


自增字段

 

在SQLITE3中,如果字段被声明为 INTEGER PRIMARY KEY AUTOINCREMENT,则此字段为AUTOINCREMENT类型,字段值自增;

INSERT记录时,不需要对此字段赋值。

 

CREATE TABLE TABLE1(ID INTEGER PRIMARY KEY AUTOINCREMENT, NAME TEXT);
INSERT INTO TABLE1(NULL, 'Jacky');

 

sqlite3_last_insert_rowid()函数可以获取刚插入记录的自增字段值。

 

数据插入与更新

使用REPLACE替代INSERT、UPDATE命令。在无满足条件记录,则执行Insert,有满足条件记录,则执行UPDATE。

 

REPLACE INTO TABLE1(col1, col2, col3) VALUES(val1, val2,val3);

还需要测试与INSERT INTO、UPDATE比较的效率如何。

 


字符编码转换

sqlite3的源码中,提供了utf8ToUnicode()、unicodeToUtf8()、mbcsToUnicode()、unicodeToMbcs()、sqlite3_win32_mbcs_to_utf8 ()、utf8ToMbcs ()等8个函数进行字符在不同编码间的转换,但未在sqlite3.def、sqlite3.h文件中列出,即未对外公开。这些函数中,都使用了MultiByteToWideChar()、WideCharToMultiByte()两个函数实现字符间转换。

 

所以,可以将几个函数,放入sqlite3.def、sqlite3.h,使其导出DLL使用,提供给二次开发者调用。但是,还有一个问题:转换后的字符串内存释放。以上函数转换出的字符串都是使用malloc()、free()两个标准库函数进行内存分配、释放。一但在sqlite3的DLL中得到转换后的字符串,也需要在此DLL中释放,否则将引起程序错误。因此,在sqlite3的库中,添加了utf8Free(void *)函数,负责释放字符串占用的内存。

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值