运行Android应用程序时发生SQLite错误
我在android上开发了一个简单的应用程序,输入一系列数字并按下一个按钮,这些信息会传递到另一个活动,在那里应该存储在数据库中,当你提交数字时,很好,但错误是使用sqlite中的函数,根据Logcat,我的错误是语法,但我无法理解,我是为android开发的新手 航海日志运行Android应用程序时发生SQLite错误,android,sqlite,Android,Sqlite,我在android上开发了一个简单的应用程序,输入一系列数字并按下一个按钮,这些信息会传递到另一个活动,在那里应该存储在数据库中,当你提交数字时,很好,但错误是使用sqlite中的函数,根据Logcat,我的错误是语法,但我无法理解,我是为android开发的新手 航海日志 Build Date: 12/12/12 Wed Local Branch: Remote Branch: m/jb_rel_2.0.3 Local Patches: NONE Re
Build Date: 12/12/12 Wed
Local Branch:
Remote Branch: m/jb_rel_2.0.3
Local Patches: NONE
Reconstruct Branch: AU_LINUX_ANDROID_JB_REL_2.0.3_RB3.04.01.01.42.002 + NOTHING
02-04 16:12:56.247 10395-10395/austranet.myapplication2 E/SQLiteLog﹕ (1) near "/": syntax error
02-04 16:12:56.247 10395-10395/austranet.myapplication2 W/dalvikvm﹕ threadid=1: thread exiting with uncaught exception (group=0x40f7c438)
02-04 16:12:56.267 10395-10395/austranet.myapplication2 E/AndroidRuntime﹕ FATAL EXCEPTION: main
java.lang.RuntimeException: Unable to start activity ComponentInfo{austranet.myapplication2/austranet.myapplication2.registro}: android.database.sqlite.SQLiteException: near "/": syntax error (code 1): , while compiling: CREATE TABLE ingresos(_id INTEGER PRIMARY KEY AUTOINCREMENT,rut TEXT NOT NULL,fecha_registro DATETIME DEFAULT CURRENT_TIMESTAMP,ingreso/salida TEXT);
sqlite处理程序快照:
检查此字段:
…,Ingreo/salida文本)代码>
这是一个无效的列定义
使用类似于Ingreo_salida的代码
或者使用(强烈反对)方括号:
…[Ingreo/salida]文本)
如果要在列名中使用/
,则必须将其括在括号中:
CREATE TABLE ingresos
(_id INTEGER PRIMARY KEY AUTOINCREMENT,
rut TEXT NOT NULL,
fecha_registro DATETIME DEFAULT CURRENT_TIMESTAMP,
[ingreso/salida] TEXT);
看看这个。查找文档,第56页。请注意,不建议在标识符名称中使用任何类型的关键字。`Current create table query存在以下问题:
1.Ingreo/salida
是无效的列名。在列名中使用有效字符,如Ingreo_salida
2.列名之间缺少空格。因此,使用String.format
创建有效的sqlite查询:
String tableQuery=String.format("CREATE TABLE %s (%s
INTEGER PRIMARY KEY AUTOINCREMENT,
%s TEXT NOT NULL,
%s DATETIME DEFAULT CURRENT_TIMESTAMP,
%s TEXT)",
"ingresos", "_id",
"rut", "fecha_registro","ingreso_salida"));
对于您的情况,您不需要数据库,您可以使用Intent.putExtra
或SharedReferences
从文档中实现您的目标这不是标准的SQL。
双引号是括起标识符的标准方式。@njzk2:它在Android设备上与SQLite一起工作(请参见标记)。我知道这不是标准的SQL,甚至可能不好用。但这是可能的;)@特里尼蒙:在回答中,我们说的是不可能的。我们说,/
不是列名的有效字符。它是有效的,但不建议使用。阅读文档(,第56页)。@Der Golem:列名、列定义和元符号之间存在差异。如果可以,请向我展示任何说明ingreso/salida
是无效列名的Android SQLite文档。我肯定你不能。(见,)@Trinimon:是的,谢谢你提供的信息。让我知道为什么否决投票?因为“Ingreo/salida是无效的列名”。我想重点是,如果你想使用一些特殊的字符,比如/
@Trinimon,你的意思是ingreso/salida
是有效的名称吗?在表名和列名中允许读取/
?是的,我刚刚用一个真正的设备(adb shell…
)尝试了一下,效果非常好。如果你说列定义是错误的,我会同意的。但是列名是可以使用的,尽管它可能不是最好的选择。@Trinimon:伙计,在我们的回答中,我们说列名不能有任何特殊字符?我们是说Ingreo/salida不可能我希望你同意我们的观点。为了解决这个问题,您的建议是在[]
中使用列名(这不是sqlite标准的命名保护),我们建议在列名词中使用有效的分隔符,如\u
。那么问题在哪里??你为什么否决其他答案?好的。有这样一个“危险”的名字是不是很糟糕?不,请看我上面的评论——我也不会推荐它。但是,不能说它无效。/
不是有效字符。事实上,您必须使用变通方法才能使用它(即[]
)。我将此[]
称为修复无效字符(可以是/、空格、连字符等)的一种变通方法。在SQLite中,使用[]
是在标识符名称中使用保留关键字的一种已定义的方法-尽管不建议“作为一般经验法则,您应该尽量避免使用SQL语言中的任何关键字”,请参阅:@Trinimon,Ingreo/salida
(不带括号)是无效名称。