SQLite,是一款轻型的数据库,是遵守ACID的关系型数据库管理系统,它的设计目标是嵌入式的,而且目前已经在很多嵌入式产品中使用了它,它占用资源非常的低,在嵌入式设备中,可能只需要几百K的内存就够了。它能够支持Windows/Linux/Unix等等主流的操作系统,同时能够跟很多程序语言相结合,比如 Tcl、C#、PHP、Java等,还有ODBC接口,同样比起Mysql、PostgreSQL这两款开源的世界著名数据库管理系统来讲,它的处理速度比他们都快。
SQLite的最新版本是SQLite3,官网http://www./,听说SQLite3还可以当内存数据库,特地研究一下。SQLite3的基本使用,我这边就不再介绍,网上很多,大家可以参考http://yuanzhifei89./blog/1123870这篇文章。
SQLite3,用C语言编写,有给C++提供很方便的类库,但是Delphi却不能使用,但是总有Delphi牛人把SQLite3的API封装了一下,方便Delphi调用。我使用的封装类是sqlite simple delphi,SQLite3官网上面还有很多其它的封装类,有兴趣的可以研究一下,http://www./cvstrac/wiki?p=SqliteWrappers。
sqlite simple delphi的官网网站是http://www./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的加密。
|