文/何晓杰Dev(高级Android架构师)著作权归作者所有,转载请联系作者获得授权。
初看这个标题你可能会不解,SQLite 本身就是一个跨平台的数据库,在这里再说跨平台有什么意义呢?
其实不然,目前我就遇到了一个项目需要使用 SQLite 数据库,而且我甚至完全不想花多套代码在不同的平台上,毕竟每个平台的包含的相关 SDK 并不一致。举个简单的例子,在 Android 上操作 SQLite,需要用到 SQLiteDatabase 这个类,用 Java 来操作;而在 iOS 上,除了需要引入 libsqlite3.tbd 外,还需要引入 sqlite3.h 这个头文件,使用 Objective-C 来操作,到了 PC 上,虽然都是以使用 sqlite3.h 为主,但是依然会有不一致的地方,比如说种类繁多的编程语言,大多都有不同的封装,API 不一致这足以让人头疼。
因此,在不同的平台上操作 SQLite,必定会使用不同的代码。当然了,除了 SQLite 之外,实现相同的功能,在不同平台上使用不同的代码也许已经是惯例,大家也习以为常。
请输入标题 bcdef
Roll your eggs 的习以为常!作为一个懒人,当这样一个锅需要自己背的时候,自然是去找更简单的解决方案了。目标是一套代码走天下!
请输入标题 abcdefg
那么也不多废话了,直接上手写代码,这里有很多种技术可以选择,比如说 C++,sqlite3.h 还是很好用的。不过我依然是折腾自己喜欢的 CodeTyphon,因为它有更让人觉得方便的封装。
很幸运的是,CodeTyphon 已经自带了 sqlite3conn 单元,直接引用之即可。关于如何查找可引用的库,可以看 CTC 的 Typhon-IDE Pkgs 和 FPC Pkgs 这两页,你会找到你要的。
CTC
首先先制作一个简单的数据库吧,用于测试代码能否正常工作:
$ sqlite3 demo.db
> create table user(id INTEGER PRIMARY KEY AUTOINCREMENT, name VARCHAR(32) NOT NULL);
> insert into user(name) value ('ABC');
> insert into user(name) value ('XYZ');
然后根据数据库结构声明一个结构体,后面会用于数据传递:
type
TDemoRec = record
AId: Integer;
AName: PChar;
end;
与这个结构等价的 C++ 的结构体是这样的:
struct DemoRec {
int AId;
char* AName;
};
这一瞬间我们会发现原来操作 SQLite 是如此的简单,在此我定义了一个类,用来保存一些数据:
TSQLite =