在过去的几天中,我一直在使用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语句(不带引号):
“从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数据,然后它开始工作。现在,我再次删除了所有应用程序数据,并且发生了同样的事情。
我在这里开始on自己,这让我发疯了...
请告诉我,我所监督的只是一个愚蠢的错误!
问候,
西蒙
- - - - - - - - - - - - - - - - -编辑 - - - - - - - - ------------------
首先,非常感谢您的帮助!但这太疯狂了。只是行不通。再次,删除所有应用程序数据,然后再获得一个全新且干净的数据库。检查一下:
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,我可以看到,您可以看到,不是吗?
现在,我将尝试将所有内容转换为Strings并尝试比较WHERE子句中的内容,如果那行不通,我不知道,但是严重滥用酒精似乎相当可观。
最佳答案
好。因此,在某个地方,数据类型存在问题。我专门将cablefinderID声明为Integer。但是,Sqlite可能认为这还不够。所以我要做的是在比较之前再次显式转换为Integer:
String query = "SELECT * from ct_cablefinder_data WHERE CAST(cablefinderID as integer)=" + registration.getId();
就是这样。
但是,感谢您的帮助,现在我可以继续编码,不会因为酗酒而陷入困境!