如果不存在则插入: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的主要内容,如果未能解决你的问题,请参考以下文章
如果表中的行存在,如何转义当前的 SQLite3 查询,但如果不存在则继续