[英]why does SQLite give a no such column error?
日志猫:
android.database.sqlite.SQLiteException: no such column: kelime (code 1): , while compile: SELECT * FROM Mylist WHERE Name = kelime
但我的专栏不是“kelime”,而是“姓名”。
我的数据库
public void onCreate(SQLiteDatabase db) {
db.execSQL("CREATE TABLE IF NOT EXISTS \"Words\" (\n" +
"\t\"Id\"\tINTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,\n" +
"\t\"Name\"\tTEXT,\n" +
"\t\"Mean\"\tTEXT\n" +
");");
db.execSQL("CREATE TABLE IF NOT EXISTS \"MyList\" (\n" +
"\t\"Id\"\tINTEGER NOT NULL,\n" +
"\t\"Name\"\tTEXT,\n" +
"\t\"Mean\"\tTEXT,\n" +
"\tFOREIGN KEY(\"Id\") REFERENCES \"Words\"(\"Id\"),\n" +
"\tPRIMARY KEY(\"Id\")\n" +
");");
}
public Word FindWord(DbConnection data, String kelime, SQLiteDatabase db){
Word w= null;
Cursor c = db.rawQuery("SELECT * FROM Words WHERE Name = kelime",null);
while (c.moveToNext()){
w = new Word(c.getInt(c.getColumnIndex("Id"))
,c.getString(c.getColumnIndex("Name"))
,c.getString(c.getColumnIndex("Mean")));
}
return w;
}
public Boolean ifExists (DbConnection data, String kelime, SQLiteDatabase db) {
Word w= new Word();
Cursor c = db.rawQuery("SELECT * FROM Mylist WHERE Name = kelime",null);
while (c.moveToNext()){
w = new Word(c.getInt(c.getColumnIndex("Id"))
,c.getString(c.getColumnIndex("Name"))
,c.getString(c.getColumnIndex("Mean")));
}
if(w!=null) return true;
else return false;
}
用
db.rawQuery("SELECT * FROM Words WHERE Name = '" + kelime + "'", null);
db.rawQuery("SELECT * FROM Mylist WHERE Name = '" + kelime + "'", null);
代替
db.rawQuery("SELECT * FROM Words WHERE Name = kelime",null);
db.rawQuery("SELECT * FROM Mylist WHERE Name = kelime",null);
为什么 SQLite 没有给出这样的列错误?
因为您告诉它从 mylist 表中获取名称列 = kelime列的行,当然没有这样的列。
您很可能会尝试从mylist表中选择行,其中名为name的列的值等于值kelime 。 如果您指定的是一个值而不是名称,并且该值不是数字,那么您必须告诉 sqlite 什么类型的值。 如果是字符串 (TEXT),则将其括在单引号中。
因此,您希望查询为:-
SELECT * FROM Mylist WHERE Name = 'kelime'
rawQuery 方法有第二个参数,可以正确地包含(绑定)这些值。 因此,您将值作为字符串数组传递而不是 null。 每个元素将替换一个 ? 在查询中以 1 为 1 为基础。 推荐使用此方法,因为它还可提供针对 SQL 注入的保护。
因此,您可以使用:-
Cursor c = db.rawQuery("SELECT * FROM Words WHERE Name = ?",new String[]{"kelime"});
Cursor c = db.rawQuery("SELECT * FROM Words WHERE Name = 'kelime'",null);
不推荐这样做,因为它可能会受到 SQL 注入的影响。还有一些方便的方法。 它们很方便,因为它们不仅正确地包含(转义)值,它们还构建 SQL 并提供针对 SQL 注入的保护。
因此,您可以使用:-
Cursor c = db.query("Words",null,"Name=?", new String[]{"kelime"},null,null,null);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.