我的模式中有一个toMany关系("一个人有1..N只猫")。如果我查询实体的多目标实体,我使用以下代码:
List<Cat> cats = human.getCatList();
返回的列表是否保证可以订购?如果是,取决于哪个属性?
附加信息(生成代码):
在我的架构(生成器)中,实体的创建方式如下:
Entity human = schema.addEntity("human");
human.addIdProperty().autoincrement();
Entity cat = schema.addEntity("cat");
cat.addIdProperty().autoincrement();
pb = cat.addLongProperty("humanId");
pb.notNull();
pb.indexAsc(null, false);
human.addToMany(cat, pb.getProperty());
因此,我认为顺序是由创建的索引(隐式)定义的,但查看CatDao.java
表明索引是在没有定义顺序的情况下创建的:
"CREATE INDEX " + constraint + "IDX_CAT_HUMAN_ID ON CAT (HUMAN_ID);"
将pb.indexAsc
更改为pb.indexDesc
会更改索引名称,但不会更改列的索引顺序(请参阅:SQLite 语法:索引列)。
那么 - 这是通缉行为吗?如何定义目标实体的顺序?
短答案是(带返回的列表是否保证可以订购?如果是,取决于哪个属性?
if);长回答"否"(带 but):项的顺序不隐式定义,但可以在toMany
关系中显式设置。
human.addToMany(cat, [...]).orderAsc([...]);
将在为人类实体创建的Cat.java
中生成ORDER BY
语句(请参阅Cat#_queryHuman_CatList
)。
因此,我认为顺序是由创建的索引(隐式)定义的,但查看
CatDao.java
表明索引是在没有定义顺序的情况下创建的。
这似乎是想要的行为,因为正如SQLite Docs所述:每个列名后面可以跟一个"ASC"或"DESC"关键字以指示排序顺序。排序顺序可能会也可能不会被忽略,具体取决于数据库文件格式 [...]- 鉴于 GreenDAO 支持较旧的 Android 版本(因此支持较旧的 SQLite 版本,请参阅此处的 SO 问题/答案),不在索引上附加排序顺序是有意义的。