Delphi中使用SQLite3(一)

时间:2022-04-03 23:05:48


        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的加密。