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

时间:2013-01-05 20:54:13

标签: 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中的值,但这只是一个修补程序,并且当数据库中有数千行时,这不是一件好事。我想根据我的调试,索引可能已经破坏,删除了所有的App数据,然后它工作。现在我再次删除了所有App数据,同样的事情发生了。 我开始在这里开始自己,这让我很疯狂......

请告诉我,我监督的只是一个愚蠢的错误!

此致 西蒙。

--------------------------------- EDIT ------------- ---------------------

首先,非常感谢您的帮助!但这太疯狂了。它只是赢了工作。再次,删除所有应用程序数据之前,以获得一个新的干净的数据库。检查一下:

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块并关闭光标,不检索任何数据。结果ArrayList保持为空。但它在那里:cablefinderID = 1,我可以看到它,你可以看到它,不能吗?

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

2 个答案:

答案 0 :(得分:1)

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

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

这就是诀窍。

但是,感谢您帮助我,现在我可以继续编码并且不会因酗酒而堕落!

答案 1 :(得分:0)

在第一个查询中,如果cablefinderID是一个整数,则不需要''或“”。你应该尝试以下它应该工作的片段

        String query = "SELECT * from  ct_data WHERE cablefinderID=" + registration.getId();
        cursor = database.rawQuery( query, null );
        while(cursor.moveToNext()){
          //your code here
        }
        cursor.close();

第二个查询使用ct_cablefinder_data而不是ct_data,这可能是问题所在。还有助于你如何创建你的表。