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 .....
我无法通过queryId检索行,而不知道id字段将是哪个列索引!
为什么会发生这种情况,如何使列顺序保持一致。
在某些情况下,我删除表并重新创建它们,而不是删除,这不应该影响列顺序
TableUtils.createTable(getConnectionSource(), ClientSpace.class);
我也在使用Android
我的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将在哪个索引中。
答案 0 :(得分:1)
我不能通过queryId检索行,而不知道id字段将是哪个列索引! 为什么会发生这种情况?如何使列顺序保持一致?
ORMLite使用反射(或表配置文件)来确定字段顺序。出于某种原因,当它通过您的实体时,反射会按照您不期望的顺序生成字段列表。
“不要依赖任何数据库中定义的字段顺序。这不仅仅是一个Android技巧,一般来说它只是一个很好的数据库实践。”
这是一个非常好的提示。
其中queryForId(Integer.valueOf(resultArray [2])要求我只拥有id,并且确切知道id将在哪个索引中。
当然,但由于您正在执行自己的自定义查询,因此您可以按特定顺序指定SELECT
列表,以便了解哪个字段位于resultArray
的哪个位置。你不应该在那里做SELECT *
。
此外,GenericRawResults
has a getColumnNames()
method返回列名,您可以使用这些列名验证哪个列名在哪个位置。