如果不存在则插入:SQLite

Posted

技术标签:

【中文标题】如果不存在则插入:SQLite【英文标题】:Insert if not exists: SQLite 【发布时间】:2021-10-14 15:26:08 【问题描述】:

如果数据库中尚不存在该标题,我想插入数据。

这是我在书面查询中遇到的错误:

“with”附近:语法错误(代码 1):,编译时:SELECT * FROM movie WHERE header=Albert Collen

代码:

public boolean Insert(Item item) 
    SQLiteDatabase sqLiteDatabase = this.getWritableDatabase();
    ContentValues contentValues = new ContentValues();
    Cursor cursor = sqLiteDatabase.rawQuery("SELECT * FROM " + TABLE + " WHERE headline=" + item.getName() , null);

    if (cursor.moveToFirst()) 
     else 
        contentValues.put("name", item.getName());           
        long result = sqLiteDatabase.insert(TABLE, null, contentValues);

        if (result == -1) 
            return false;
         else 
            return true;
        
    

    cursor.close();
    sqLiteDatabase.close();

    return true;

【问题讨论】:

嗨,ghazalia。可以发布“名称”参数的值是多少?它可以包含非字母字符吗? 嗨。名称是一个字符串。字符串值是什么重要吗? 【参考方案1】:

你应该使用查询参数

rawQuery("SELECT * FROM movie WHERE headline = ?", new String[] "Albert Collen");

避免转义引号和其他字符。

【讨论】:

【参考方案2】:

首先,结果查询是错误的。所有的字符串常量都要被引用,像这样

SELECT * FROM movie WHERE headline='Albert Collen';

所以,试着像这样编写查询,也许会有所帮助

Cursor cursor = sqLiteDatabase.rawQuery("SELECT * FROM " + TABLE + " WHERE headline='" + item.getName() + "'" , null);

但是连接查询并不是一个好主意,因为它至少可以进行 SQL 注入。

例如,当 item.getName() 包含以下行“'; drop table movies;”时可能会导致问题

更好的选择是使用绑定查询变量。不幸的是,我不熟悉如何将 java-android 与 sqlite 一起使用,因此您最好检查一下如何在 android 中使用此类查询

【讨论】:

谢谢。但是如果名字有一个 ' 呢?例如,如果名字是 The Queen's Gambit ?@ekochergin @ghazalia 由于您编写查询的方式,它也会导致查询失败。如果您决定将查询与绑定变量一起使用,我相信它不会失败。避免这种特殊情况的另一种方法是将每个引号加倍,因此“Queen's Gambit”将转换为“Queen's Gambit”。请注意,这不是双引号 ("),而是两个单引号 ('')

以上是关于如果不存在则插入:SQLite的主要内容,如果未能解决你的问题,请参考以下文章

Android Sqlite 如果不存在则插入

sqlite不存在记录则插入数据

如果表中的行存在,如何转义当前的 SQLite3 查询,但如果不存在则继续

android sqlite 如果不存在则创建表

SQLITE检查表users是不是存在的sql语句,如果不存在则创建表users

SQLite 判断表存在/删除表/创建表及if not exist插入数据