Sqlite 如何在设计时Firedac中设置主表字段?

Sqlite 如何在设计时Firedac中设置主表字段?,sqlite,delphi,firedac,delphi-10.2-tokyo,Sqlite,Delphi,Firedac,Delphi 10.2 Tokyo,我想让一个非空非自动inc整数成为我的主键,但我无法在使用Firedac的设计时这样做。TIntegerfield没有参数允许我将其设为主要参数。TFDTable中也没有参数,我可以从所有可用字段中选择主字段 我明白了在代码中实现它是可能的&将它与我的设计时间表结合起来,但这超出了在设计时完成所有工作的全部目的 早些时候,我的表中有一个auto inc ID,它被自动设置为主键。我现在删除了这个字段,因为我需要另一个整数作为主整数。 另外,我在Embacadero官方网站上找不到关于主键的信息&

我想让一个非空非自动inc整数成为我的主键,但我无法在使用Firedac的设计时这样做。
TIntegerfield
没有参数允许我将其设为主要参数。
TFDTable
中也没有参数,我可以从所有可用字段中选择主字段

我明白了在代码中实现它是可能的&将它与我的设计时间表结合起来,但这超出了在设计时完成所有工作的全部目的

早些时候,我的表中有一个auto inc ID,它被自动设置为主键。我现在删除了这个字段,因为我需要另一个整数作为主整数。
另外,我在Embacadero官方网站上找不到关于主键的信息&
TFDTable

最好使用数据库中的一个新表和一个最小的新Delphi项目进行试验

更新:有关数据库DDL和表单的DFM,请参见下文

您需要将ID字段标记为数据库中的主键

将FDConnection和FDTable添加到项目后,从下拉列表中选择FDTable的TableName。然后,单击FDTable的IndexName字段,您应该会在表的主键上找到一个自动命名的索引。只需选择它,以便IndexName获取其值。就这些

对于使用下面的DDL创建的表,FDTable的IndexName属性显示为
sqlite\u autoindex\u test\u 1

如果随后dbl单击FDTable并使用弹出字段编辑器在FDTable上设置持久字段,然后选择ID字段,您应该会发现,如果检查其ProviderFlags,它们应该包括
pfInKey
,这告诉FireDAC在生成SQL时将字段用作表的主键来更新它,做插页等

顺便说一句,您应该发现ID字段的必填字段自动设置为True

如果要在添加新记录时自己提供ID字段的值,请使用表的
OnNewRecord
生成ID值并将其分配给字段

test
Sqlite数据库的DDL

create table test(
id int not null primary key,
AName nchar(12)
)
项目DFM摘录

object Form2: TForm2
  object DBGrid1: TDBGrid
    DataSource = DataSource1
  end
  object DBNavigator1: TDBNavigator
    DataSource = DataSource1
  end
  object FDConnection1: TFDConnection
    Params.Strings = (
      'Database=D:\aaad7\sqlite\MADB1.sqlite'
      'DriverID=SQLite')
    Connected = True
    LoginPrompt = False
  end
  object DataSource1: TDataSource
    DataSet = FDTable1
  end
  object FDTable1: TFDTable
    IndexName = 'sqlite_autoindex_test_1'
    Connection = FDConnection1
    UpdateOptions.UpdateTableName = 'test'
    TableName = 'test'
    object FDTable1id: TIntegerField
      FieldName = 'id'
      Origin = 'id'
      ProviderFlags = [pfInUpdate, pfInWhere, pfInKey]
      Required = True
    end
    object FDTable1AName: TWideStringField
      FieldName = 'AName'
      Origin = 'AName'
      FixedChar = True
      Size = 12
    end
  end
end

谢谢你的回答。然而,我遵循了你的步骤,我没有看到ID获得主键。我只使用一个小的Delphi应用程序来创建数据库,并使用Database.net工具进行检查。只是为了证实;当您创建一个新的FDTable时,由于该表没有字段,IndexName中怎么会有内容?我不应该使用IndexFieldNames吗?该字段的“pfInKey”和“Required”处于活动状态。如何设置?FireDAC从数据库中读取表的元数据,因此它不需要已经定义持久字段来执行此操作。与其他db组件相比,FD似乎在获取此类元数据方面做得更好。顺便说一句,你说的“我没有看到ID得到主键”到底是什么意思?Delphi的TDataSet或其子体中没有这样的“PrimaryKey”。请参阅更新,它添加了DDL SQL来创建我正在使用的测试表。我重新检查了我的答案中的步骤,它们都很好地工作,正如所描述的那样。试试看。