【问题标题】:SQL lite query reads wrong Id'sSQLite 查询读取错误的 ID
【发布时间】: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 会感到困惑。

标签: java android mysql sqlite


【解决方案1】:

您的日期字符串“15-04-2015”是DD-MM-YYYY 格式,但它似乎在某些时候被视为MM-DD-YYYY。您没有在问题中显示 ANY 代码,因此我无法确切告诉您需要如何解决此问题。通常,您需要向数据库指定您正在使用的日期格式,或者切换到将其作为字符串或整数存储在数据库中。你可以看看这个问题的一些答案:Best way to work with dates in Android SQLite

【讨论】:

  • 感谢 Mark B,我以为是日期问题,但问题是 sql lite 无法区分列名的变量名。但是,通过重命名上述列名,我的问题得到了解决。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-10-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-11
  • 2020-04-04
  • 2012-11-24
相关资源
最近更新 更多