2

Ormlite 以两种不同的方式从同一个模型对象创建我的表

预期的:

create table statement changed 0 rows: CREATE TABLE `clientspace` 
(`id` INTEGER PRIMARY KEY AUTOINCREMENT , `user_is_following` INTEGER , 
`space_id` INTEGER , `client_id` INTEGER , `name` VARCHAR , `state` VARCHAR , 
`latitude` FLOAT , `longitude` FLOAT , `url_twitter` VARCHAR ,.....

错误的:

executed create table statement changed 1 rows: CREATE TABLE `clientspace` 
(`about_text` VARCHAR , `website` VARCHAR , `app_name` VARCHAR , 
`url_twitter` VARCHAR , `color` VARCHAR , `url_facebook` VARCHAR ,
`tagline` VARCHAR , `state` VARCHAR , `logo` VARCHAR , `skyline` VARCHAR ,
`name` VARCHAR .....

在不知道 id 字段将是哪个列索引的情况下,我无法通过 queryId 检索行!

为什么会发生这种情况以及如何使列顺序一致。

在某些情况下,我删除表并重新创建它们,而不是删除,这不应该影响列顺序

TableUtils.createTable(getConnectionSource(), ClientSpace.class);

我也在用安卓

我的ormlite_config文件的结构是预期表格的格式

编辑:找到这个话题,还没有得出结论https://groups.google.com/forum/#!topic/ormlite-android/N-tJ-2OVKL8

如果"Don't ever rely on the defined order of fields in any database. This is not just an Android tip, it's just good database practice in general."我不必使用queryforId(并给它一个行结果的精确索引,我绝对不会这样做。

例子:

final GenericRawResults<String[]> rawCustomFieldResults =
        customFieldDao.queryRaw(customFieldQuery.prepareStatementString());
    for(final String[] resultArray : rawCustomFieldResults) {
        CustomFieldVO mCustomField =
            customFieldDao.queryForId(Integer.valueOf(resultArray[2]));

wherequeryForId(Integer.valueOf(resultArray[2])要求我只有 id 并且确切地知道 id 将在哪个索引中。

4

1 回答 1

1

在不知道 id 字段将是哪个列索引的情况下,我无法通过 queryId 检索行!为什么会发生这种情况,如何使列顺序一致?

ORMLite 使用反射(或表配置文件)来确定字段顺序。由于某种原因,当它通过您的实体时,反射会以您不期望的顺序生成字段列表。

“永远不要依赖任何数据库中定义的字段顺序。这不仅仅是一个 Android 技巧,它只是一般的数据库实践。”

这是一个非常好的提示。

其中 queryForId(Integer.valueOf(resultArray[2]) 要求我只有 id 并且确切地知道 id 将在哪个索引中。

当然可以,但是由于您正在执行自己的自定义查询,因此您可以SELECT按特定顺序指定列表,这样您就可以知道哪个字段在resultArray. 你不应该在SELECT *那里做。

此外,GenericRawResults还有一个返回列名的getColumnNames()方法,您可以使用该方法验证哪个列名在哪个位置。

于 2013-12-16T14:16:22.493 回答