【问题标题】:why does SQLite give a no such column error?为什么 SQLite 没有这样的列错误?
【发布时间】:2019-12-27 04:34:32
【问题描述】:

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

【问题讨论】:

标签: java android sqlite


【解决方案1】:

使用

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

【讨论】:

  • @Kestane,你检查过这个吗?
【解决方案2】:

为什么 SQLite 会给出 no such column 错误?

因为您告诉它从 mylist 表中获取行,其中 name 列 = kelime 列,当然没有这样的列。

您很可能尝试从 mylistwhere 列中选择 em> 名为 namevalue 等于值 kelime >。如果您指定一个值而不是名称,并且该值不是数字,那么您必须告诉 sqlite 什么类型的值。如果是字符串 (TEXT),那么您可以将其括在单引号中。

因此,您希望查询是:-

SELECT * FROM Mylist WHERE Name = 'kelime'

rawQuery 方法有第二个参数,可以正确地封装(绑定)这些值。因此,您将值作为字符串数组传递,而不是 null。每个元素将替换一个?在 1 per 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);

【讨论】:

    猜你喜欢
    • 2017-02-09
    • 2015-09-07
    • 1970-01-01
    • 2022-11-17
    • 1970-01-01
    • 2022-01-19
    • 2019-05-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多