【发布时间】:2016-04-15 15:09:44
【问题描述】:
mysql 和 sql lite 日期问题之间的斗争已经很长时间了。我有一个返回多个数据的复杂查询。
我读取服务器 Json 对象并将它们存储在 sql lite android 中很好。 所以我做了一个类似于下面的查询
“SELECT * FROM” + MAIN_TABLE + “ LEFT OUTER JOIN” + SERVICE_INFO_TABLE + “ ON ServiceInfo.main_id = MAIN_TABLE._ID” +“左外连接”+ M_USER_TABLE +“ON M._ID = ServiceInfo.m_id” + " 左外连接 " + U_TABLE + " ON MAIN_TABLE.u_id = U_TABLE._ID"
当我读取包含 creation_time 和 upation_time 的 MAIN_TABLE 时,问题就开始了,SERVICE_INFO_TABLE 还包含 creation_time,updation_time。
但是该表分别包含不同的日期和时间。游标为所有实体返回相同的日期和时间。
游标方法似乎被混淆并返回从 ServiceInfo 表中读取的相同数据和时间。
当 SQL lite 读取查询时,我更深入地研究调试模式,我看到那里发生了奇怪的事情。下面是阅读示例
Cursor cursor = sqLiteDatabase.rawQuery(selectQuery, null);
if (cursor != null && cursor.getCount() > 0) {
cursor.moveToFirst();
do {
Log.d("dummy", "dummy stopper");
VParcelable vParcelable = new VParcelable();
vParcelable.setId(cursor.getInt(cursor.getColumnIndex(VEntry._ID)));
vParcelable.setModel(cursor.getString(cursor.getColumnIndex(VEntry.MODEL)));
vParcelable.setYearMdl(cursor.getInt(cursor.getColumnIndex(VEntry.YEAR_MODEL)));
vParcelable.setCreationTime(cursor.getString(cursor.getColumnIndex(VEntry.CRE_TIME)));
vParcelable.setUpdationTime(cursor.getString(cursor.getColumnIndex(VEntry.UPA_TIME)));
所以ServiceInfo 表也包含相同的creation_time 和updation_time。
vParcelable.setCreationTime(cursor.getString(cursor.getColumnIndex(VEntry.CRE_TIME)));
游标调试模式下的 mColumns 显示 VTable 的“updation_time”和“creation_time”,与 ServiceInfo 表相同。
那个问题是sql lite不能区分表列名吗?
这真的很糟糕。
请帮忙。
谢谢
【问题讨论】:
-
通过重命名列名解决了问题。
-
请注意,SQL lite android 将列表 id 读取为一个组。如果你的表很少并且条目 id 相似,那么 SQL lite 会感到困惑。