2010-01-01 87 views
0

我的一个Android应用程序的执行下列具体SQLite的查询:的Android SQLiteException:没有这样的列:-1

SELECT _id, hourMin, actions FROM profiles 
WHERE type=2 AND hourMin > -1 AND days & 8 != 0 AND prof_id >> 16 IN (256) 
ORDER BY hourMin ASC LIMIT 1 

现在,在一些Android手机的工作原理,但他们几个人将其与下面的崩溃错误:

android.database.sqlite.SQLiteException: no such column: -1: , while 
compiling: SELECT _id, hourMin, actions FROM profiles WHERE type=2 AND 
hourMin > -1 AND days & 8 != 0 AND prof_id >> 16 IN (256) ORDER BY hourMin 
ASC LIMIT 1 

出于某种原因,“-1”被视为列,而不是数量......这没有多大意义,当我阅读SQLite的查询语言,我认为没有必要逃跑这个数字在括号里。它可能是一个不同版本的SQLite的问题?添加括号可以帮助吗?相反,我可能会用> = 0来重写它,但我仍然想知道发生了什么。

+1

尝试将它包装在圆括号中,看看它是否有帮助。在声明中分组可能是一个问题或其他问题。如果我是你,我会找出每部手机上的sqlite版本号,这样你就有了一个比较点。 – avpx 2010-01-01 19:05:53

+0

是的,这是我会做的,但它是一个随机拍摄。我喜欢了解我的修复:-) 不幸的是,我从用户那里得到了一些报告,我自己无法访问这些电话。实际上,用户甚至很难猜测他们的手机具有哪种SQLite版本。真的不能要求他们在他们的手机上设置ADB,在他们的桌面上安装SDK,通过USB连接他们的手机并运行一些神秘的命令行... :-) – ralfoide 2010-01-01 20:40:30

+0

我不知道哪些版本的SQLite甚至可能在Android上运行,所以我不会冒这个评论。但是我从变更日志中看到,按位运算符并不总是存在。如果语法分析器不能识别语句中的按位运算符,那么很容易想象这种特定的错误。另外,〜的优先级在3.5.3中被固定。再次,我不知道,但我可以想象,与〜的优先错误也会以否定的形式存在(不太可能,但不是完全没有问题)。 – 2010-01-01 23:45:11

回答

0

测试问题是否由不同版本的Android与不同版本的Android而无法访问实际手机所导致的问题的方法是为不同的Android平台创建多个模拟器图像。

这对于android图形用户界面工具来说很简单快捷,并且可以让您查看是否在不同版本的Android上出现问题,并查看日志文件。

0

在执行SELECT查询之前,请确保您创建了表并且是非空的。通常是一列:-1错误是由于空表导致的。

,如果你要检查创建表试试这个代码:

Cursor c = dbObject.rawQuery(....some query....); 
    try{ 
    c.moveToFirst(); //checking for non-empty table 
    } 
    catch(Exception e){  // in case table is empty 
    ContentValues cv = new ContentValues(); 
    //add some default table entries 
    } 

在此之后,如果你参考,你不会得到任何列的表:-1错误。

相关问题