SQLite,是一款轻型的数据库,是遵守ACID的关系型数据库管理系统,它的设计目标是嵌入式的,而且目前已经在很多嵌入式产品中使用了它,它占用资源非常的低,在嵌入式设备中,可能只需要几百K的内存就够了。它能够支持Windows/Linux/Unix等等主流的操作系统,同时能够跟很多程序语言相结合,比如 Tcl、C#、PHP、Java等,还有ODBC接口,同样比起Mysql、PostgreSQL这两款开源的世界著名数据库管理系统来讲,它的处理速度比他们都快。
SQLite的最新版本是SQLite3,官网http://www.sqlite.org/,听说SQLite3还可以当内存数据库,特地研究一下。SQLite3的基本使用,我这边就不再介绍,网上很多,大家可以参考http://yuanzhifei89.iteye.com/blog/1123870这篇文章。
SQLite3,用C语言编写,有给C++提供很方便的类库,但是Delphi却不能使用,但是总有Delphi牛人把SQLite3的API封装了一下,方便Delphi调用。我使用的封装类是sqlite simple delphi,SQLite3官网上面还有很多其它的封装类,有兴趣的可以研究一下,http://www.sqlite.org/cvstrac/wiki?p=SqliteWrappers。
sqlite simple delphi的官网网站是http://www.itwriting.com/blog/?page_id=659,下载下来以后是一个压缩包里面是一个demo。咱们需要里面的两个文件。SQLite3.pas 跟 SQLiteTable3.pas ,把他们复制到工程目录下面,然后在需要操作库的单元文件里面 uses SQLiteTable3 。
procedure TForm1.btnTestClick(Sender: TObject); var slDBpath: string; sldb: TSQLiteDatabase; sltb: TSQLIteTable; sSQL: String; Notes: String; begin slDBPath := ExtractFilepath(application.exename)+ 'test.db'; sldb := TSQLiteDatabase.Create(slDBPath); try if sldb.TableExists('testTable') then begin sSQL := 'DROP TABLE testtable'; sldb.execsql(sSQL); end; sSQL := 'CREATE TABLE testtable ([ID] INTEGER PRIMARY KEY,[OtherID] INTEGER NULL,'; sSQL := sSQL + '[Name] VARCHAR (255),[Number] FLOAT, [notes] BLOB, [picture] BLOB COLLATE NOCASE);'; sldb.execsql(sSQL); sldb.execsql('CREATE INDEX TestTableName ON [testtable]([Name]);'); //begin a transaction sldb.BeginTransaction; sSQL := 'INSERT INTO testtable(Name,OtherID,Number,Notes) VALUES ("Some Name",4,587.6594,"Here are some notes");'; //do the insert sldb.ExecSQL(sSQL); sSQL := 'INSERT INTO testtable(Name,OtherID,Number,Notes) VALUES ("Another Name",12,4758.3265,"More notes");'; //do the insert sldb.ExecSQL(sSQL); //end the transaction sldb.Commit; //query the data sltb := slDb.GetTable('SELECT * FROM testtable'); try if sltb.Count > 0 then begin //display first row ebName.Text := sltb.FieldAsString(sltb.FieldIndex['Name']); ebID.Text := inttostr(sltb.FieldAsInteger(sltb.FieldIndex['ID'])); ebNumber.Text := floattostr( sltb.FieldAsDouble(sltb.FieldIndex['Number'])); Notes := sltb.FieldAsBlobText(sltb.FieldIndex['Notes']); memNotes.Text := notes; end; finally sltb.Free; end; finally sldb.Free; end; end;当数据库的路径包含中文的时候,使用sqlitetable3就打不开数据库了,我把sqlitetable3的源码改动了一下,中文路径就能正常识别了。
修改后的SQLite3.pas 跟 SQLiteTable3.pas下载地址
当SQLite3作内存数据库时,只需要将数据库路径改成“:memory:”即可,其它的操作如创建表、查询表都是和操作本地数据库一样的,如下:
SqlDb := TSQLiteDatabase.Create(':memory:');
我编写的Delphi使用SQLite3的Demo,包括本地数据库和内存数据库,本地数据库加载到内存,内存数据库备份到本地,下载地址
用记事本打开sqlite3的数据库文件,发现之前我们插入的数据都能看到,几乎都是明文显示的,这很明显是不满足我们要求的。请关注下一篇文章,关于SQLite3的加密。