Android:SQLite where 子句不会返回任何内容

标签 android sqlite

过去几天我一直在使用 SQLite,时不时地遇到一个我无法解决的错误。有时我的查询有效,有时无效,即使当我转储表时,它也应该有效。从 Logcat 检查这个转储(在设备上调试,还没有找到访问数据库的好方法......):

这是来自一个名为 ct_data 的表

01-05 20:13:16.619: I/DataDAO(12453): >===>ID  100
01-05 20:13:16.619: I/DataDAO(12453): >===>cablefinderID   4 
01-05 20:13:16.619: I/DataDAO(12453): >===>latitude  51.5077559
01-05 20:13:16.619: I/DataDAO(12453): >===>longitude  7.5959846
01-05 20:13:16.629: I/DataDAO(12453): >===>data  DV200SN041385SV4.01TM19:24DT12/04/09CM33ST0BT9MD0SS28UMMDP---
01-05 20:13:16.629: I/DataDAO(12453): >===>time  1357416761579
01-05 20:13:16.629: I/DataDAO(12453): >===>ID  101
01-05 20:13:16.629: I/DataDAO(12453): >===>cablefinderID   4 
01-05 20:13:16.629: I/DataDAO(12453): >===>latitude  51.5077559
01-05 20:13:16.629: I/DataDAO(12453): >===>longitude  7.5959846
01-05 20:13:16.629: I/DataDAO(12453): >===>data  DV200SN041385SV4.01TM19:24DT12/04/09CM33ST0BT9MD0SS27UMMDP---DV200SN041385SV4.01TM19:24DT12/04/09CM33ST0BT9MD0SS28UMMDP---
01-05 20:13:16.629: I/DataDAO(12453): >===>time  1357416771625

这是我也打印出来的sql语句(不带引号):

“SELECT * from ct_data WHERE cablefinderID='4'”

我尝试了带引号和不带引号 ('') 的 where 子句 ='4',但是 cablefinderID 在 SQL 中是 Integer 类型,在 Java 中是 long 类型。这是我的 Java 代码:

    String query = "SELECT * from  ct_data WHERE cablefinderID='" + registration.getId()+"'"; 
    cursor = database.rawQuery( query, null );
    // check if cursor is empty
    if(!cursor.moveToFirst()) {
        Log.i(TAG, "WTF!!!");
    }

我也已经尝试使用 rawQuery 的第二个参数,即 String[] selectionArgs。

String query = "SELECT * from  ct_cablefinder_data WHERE cablefinderID=?";
String[] args = {"4"};
cursor = database.rawQuery( query, null );

但是,有时我还是会“WTF”。这发生在两天前,后来我最终比较了 Java 中的值,但这只是一个修补程序,当数据库稍后有成千上万行时,这不是一件好事。我认为根据我的调试,索引可能已损坏,删除了所有应用程序数据,然后它就可以工作了。现在我再次删除了所有应用程序数据,同样的事情发生了。 在这里我开始怀疑自己,这让我疯狂......

请告诉我我刚才犯了一个愚蠢的错误!

问候, 西蒙。

--------------------------------编辑------------ ----------------------

首先,非常感谢您的帮助!但这太疯狂了。它只是行不通。同样,之前删除了所有应用程序数据以获得全新且干净的数据库。检查这个:

01-06 05:54:38.969: I/DataDAO(19394): ====================ct_cablefinder_data====================
01-06 05:54:39.039: I/DataDAO(19394): >===>ID  1
01-06 05:54:39.039: I/DataDAO(19394): >===>cablefinderID   1 
01-06 05:54:39.039: I/DataDAO(19394): >===>latitude  51.5077559
01-06 05:54:39.039: I/DataDAO(19394): >===>longitude  7.5959846
01-06 05:54:39.039: I/DataDAO(19394): >===>data  DV200SN041385SV4.01TM05:06DT13/04/09CM33ST0BT9MD0SS00UMMDP---
01-06 05:54:39.039: I/DataDAO(19394): >===>time  1357451653224
01-06 05:54:39.039: I/DataDAO(19394): >===>ID  2
01-06 05:54:39.039: I/DataDAO(19394): >===>cablefinderID   1 
01-06 05:54:39.039: I/DataDAO(19394): >===>latitude  51.5077559
01-06 05:54:39.049: I/DataDAO(19394): >===>longitude  7.5959846
01-06 05:54:39.049: I/DataDAO(19394): >===>data  DV200SN041385SV4.01TM05:06DT13/04/09CM33ST0BT9MD0SS00UMMDP---
DV200SN041385SV4.01TM05:06DT13/04/09CM33ST0BT9MD0SS00UMMDP---
DV200SN041385SV4.01TM05:06DT13/04/09CM33ST0BT9MD0SS00UMMDP---
DV200SN041385SV4.01TM05:06DT13/04/09CM33ST0BT9MD0SS00UMMDP---
01-06 05:54:39.049: I/DataDAO(19394): >===>time  1357451663259
01-06 05:54:39.049: I/DataDAO(19394): ==============================================

01-06 05:54:51.889: I/DataDAO(19394): ====================ct_cableregistration====================
01-06 05:54:51.939: I/DataDAO(19394): >===>ID  1
01-06 05:54:51.939: I/DataDAO(19394): >===>projectID  1
01-06 05:54:51.939: I/DataDAO(19394): >===>startTime  2013-01-06 05:54:12
01-06 05:54:51.939: I/DataDAO(19394): >===>endTime  null
01-06 05:54:51.939: I/DataDAO(19394): >===>deviceType  DC200-041385
01-06 05:54:51.939: I/DataDAO(19394): >===>deviceKey  00:01:95:08:2F:3B
01-06 05:54:51.939: I/DataDAO(19394): >===>registrationServerID  0
01-06 05:54:51.949: I/DataDAO(19394): ==============================================

And the SQL statement:
01-05 20:14:20.859: E/DataDAO(12453): SELECT * from  ct_cablefinder_data WHERE cablefinderID=1

这是我根据 Meghal Shah 的建议调整后的代码:

public List<DataVO> getDataByRegistration( CableRegistrationVO registration ) {
    synchronized ( lock ) {

        openReadable();
        Cursor cursor = null;
        List<DataVO> result = new ArrayList<DataVO>();

        try {       
            String query = "SELECT * from  ct_cablefinder_data WHERE cablefinderID="
                + registration.getId();

            cursor = database.rawQuery( query, null );
            dumpTableI( "ct_cablefinder_data" );        // see tabledump above
            dumpTableI( "ct_cableregistration" );       // again, dump above
            Log.e( TAG, query );

            while ( cursor.moveToNext() ) { 
                result.add( this.bindSQLite( cursor ) );
            }

        } catch ( Throwable t ) {
            Log.e( TAG, t.toString() );
        } finally {
            if ( cursor != null ) {
                cursor.close();
            }
        }
        close();
        return result;
    }
}

我的意思是,我正在逐步调试,每次程序到达 while 条件时,它都会直接跳到 finally block 并关闭游标,不会检索任何数据。结果 ArrayList 保持为空。但它就在那里:cablefinderID = 1,我能看到,你也能看到,不是吗?

我现在将尝试将所有内容都转换为字符串,并尝试比较 WHERE 子句中的字符串,如果这不起作用,我不知道,但严重酗酒似乎相当严重。

最佳答案

好的。所以在线的某个地方存在数据类型问题。我特别声明 cablefinderID 为 Integer。然而,Sqlite 可能认为这还不够。所以我所做的是在比较之前再次显式转换为 Integer:

String query = "SELECT * from  ct_cablefinder_data WHERE CAST(cablefinderID as integer)=" + registration.getId();

这就成功了。

不过,谢谢你帮助我,现在我可以继续写代码了,不会再酗酒了!

关于Android:SQLite where 子句不会返回任何内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14176313/

相关文章:

iphone - 使用 FMDB 插入表失败

Android:MediaPlayer 启动新 Activity 后未发布而已完成

当 su 到 ssh session 中的另一个用户时,Android 常规用户登录会丢失组信息

android - 简单隐藏/混淆 APK 中的字符串?

php - SQLiteConnector.php 第 34 行 : Database (homestead) does not exist 中的 InvalidArgumentException

sqlite - 如何在一台服务器上托管多个幽灵博客

android - 动态创建表格布局(android)

android - 如何使用 Retrofit 同时获得两个对象——原始 Response 对象和 POJO?

c - SQLite3错误: 'near "UP": syntax error'?

sqlite - 如何通过子字符串正则表达式排序?