我有三个实体类:PlayerData
,IpData
和TwinData
。
TwinData
和IpData
都用外键引用PlayerData
。
代码如下:
@DatabaseTable
public class PlayerData {
@DatabaseField(generatedId = true)
private int id;
@DatabaseField
private UUID uuid;
@ForeignCollectionField
private ForeignCollection<IpData> ips;
@ForeignCollectionField
private ForeignCollection<TwinData> twins;
// Getters and setters...
}
@DatabaseTable
public class IpData {
@DatabaseField(generatedId = true)
private int id;
@DatabaseField(foreign = true)
private PlayerData playerData;
@DatabaseField
private Date firstUsage;
@DatabaseField
private String address;
// Getters and setters...
}
@DatabaseTable
public class TwinData {
@DatabaseField(generatedId = true)
private int id;
@DatabaseField(foreign = true)
private PlayerData mainPlayer;
@DatabaseField
private boolean adminNoticed;
@DatabaseField
private UUID uuid;
// Getters and setters...
}
当我尝试使用流迭代PlayerData.ips
时,我得到SQLException [SQLITE_ERROR] SQL error or missing database (no such column: playerData_id)
。表格是通过TableUtils.createIfNotExists()
自动生成的。
这是引发该异常的代码:
// playerData is retrieved from Dao<PlayerData, Integer>
playerData.getIps().stream().noneMatch(ip -> ip.getAddress().equals(playerIp))
我真的不明白为什么它尝试选择playerData_id
列。
是否应该使用TwinData
列为IpData
和playerData_id
手动创建数据库表?还没有尝试过,但是我认为这没有帮助。
答案 0 :(得分:0)
当我尝试使用流迭代
PlayerData.ips
时,出现SQLException
[SQLITE_ERROR] SQL错误或缺少数据库(没有这样的列:playerData_id
)。表格是使用TableUtils.createIfNotExists()
自动生成的。
如果playerData_id
不是表中的字段,则会出现该错误。令TableUtils.createIfNotExists()
不在playerData_id
表中创建字段IpData
感到惊讶。我怀疑这些表已经存在,并且您没有使用ORMLite生成的架构。
默认情况下,当ORMLite看到一个foreign = true
字段时,它将在相关实体中存储该类型的ID。请参见foreign fields documentation。如果您的架构以不同的方式定义实体之间的关系,例如使用另一个表来定义关系,那么您将需要自己设置该实体,并使用该实体的DAO查询该实体。
您也许应该查看foreign object example以获得更多信息。
希望这会有所帮助。