代码之家  ›  专栏  ›  技术社区  ›  CQM

ormlite创建列顺序错误的表

  •  2
  • CQM  · 技术社区  · 11 年前

    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]));
    

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

    1 回复  |  直到 8 年前
        1
  •  1
  •   Gray droiddeveloper    8 年前

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

    ORMLite正在使用反射(或表配置文件)来确定字段顺序。出于某种原因,当它遍历实体时,反射会以您意想不到的顺序生成字段列表。

    “永远不要依赖于任何数据库中定义的字段顺序。这不仅仅是安卓系统的提示,它只是一个很好的数据库实践。”

    这是一个非常好的提示。

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

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

    而且 GenericRawResults has a getColumnNames() method 它返回列名,使用这些列名可以验证哪个列名位于哪个位置。