我有三个实体类: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 错误或缺少数据库(没有此类列:playerData_id)
。表是使用 TableUtils.createIfNotExists()
自动生成的。
这是抛出该异常的代码:
// playerData is retrieved from Dao<PlayerData, Integer>
playerData.getIps().stream().noneMatch(ip -> ip.getAddress().equals(playerIp))
我只是不太明白为什么它尝试选择 playerData_id
列。
我是否应该使用 playerData_id
列为 TwinData
和 IpData
手动创建数据库表?尚未尝试过,但我认为这不会有帮助。
最佳答案
When I try to iterate over
PlayerData.ips
with streams, I getSQLException
[SQLITE_ERROR] SQL error or missing database (no such column:playerData_id
). Tables are auto-generated withTableUtils.createIfNotExists()
.
如果 playerData_id
不是表中的字段,您将收到该错误。我很惊讶 TableUtils.createIfNotExists()
没有在 IpData
表中创建字段 playerData_id
。我怀疑这些表已经存在,并且您没有使用 ORMLite 生成的架构。
默认情况下,当 ORMLite 看到 foreign = true
字段时,它会将该类型的 id 存储在相关实体中。请参阅foreign fields documentation 。如果您的架构以不同的方式定义实体之间的关系,例如使用另一个表来定义关系,那么您将需要自己设置该实体并使用该实体的 DAO 对其进行查询。
您也许应该看看 foreign object example了解更多信息。
希望这有帮助。
关于java - 使用流进行迭代时,ForeignCollection 会抛出 SQLException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56558906/