最近,在使用sqlite3进行GIS开发。使用sqlite3作为数据库引擎,存储空间数据。但不是使用OGC标准,也不是类似Oracle Saptial的管理模式,而是自定义的数据管理方式、Geometry模型。在开发过程中,遇到的点点滴滴都记录下来,以备今后赏析。
写法1:
写法2:
sqlite 文件的压缩
在多次删除数据、插入数据、更新数据后,数据库体积增大,但实际有效数据量很小,则需要对数据库进行压缩、整理,把已经删除的数据从物理文件中移除。调用一下sql命令即可:
表清空
sqlITE目前并不支持TRUNCATE命令,可以用一下命令代替:
自增字段
在sqlITE3中,如果字段被声明为 INTEGER PRIMARY KEY AUTOINCREMENT,则此字段为AUTOINCREMENT类型,字段值自增;
INSERT记录时,不需要对此字段赋值。
sqlite3_last_insert_rowid()函数可以获取刚插入记录的自增字段值。
数据插入与更新
使用REPLACE替代INSERT、UPDATE命令。在无满足条件记录,则执行Insert,有满足条件记录,则执行UPDATE。
还需要测试与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 *)函数,负责释放字符串占用的内存。
原文链接:https://www.f2er.com/sqlite/202854.html