为什么SQLite没有给出这样的列错误?

时间:2019-12-26 19:56:46

标签: java android sqlite

Logcat:

  

android.database.sqlite.SQLiteException:无此类列:kelime(代码   1):,而在编译时: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;
    }

2 个答案:

答案 0 :(得分:1)

  

为什么SQLite没有给出这样的列错误?

因为您要告诉它从mylist表中获取行,其中 name 列= kelime 列,所以当然没有此类列。

您很有可能想做的是从我的列表其中 中选择名为 name 的em> 的 等于值 基莱姆 。如果您指定的是值而不是名称,并且该值不是数字,则必须告诉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);

答案 1 :(得分:0)

使用

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);