簡體   English   中英

為什么 SQLite 沒有給出這樣的列錯誤?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM