最近在做下载m3u8视频下载方面,发现往Sqlite中插入下载记录后,下载进度始终为0,通过Log分析发现往Sqlite中插入视频名称中存在英文单引号,解决办法是把英文单引号转换成中文单引号,希望给遇到同样问题的朋友一些帮助。

一:使用ORMLite单引号处理方法

1、问题描述:

E/SQLiteLog(13416):<strong> <span style="color:#ff0000;">(1) near "s": syntax error</span></strong>
E/SQLiteLog(13416): (257) Record real error code: 1
E/SQLiteLog(13416): (257) Record real error code: 1
W/System.err(13416): java.sql.SQLException: Problems executing runUpdate Android statement: UPDATE `t_m3u8_download_list` SET `<strong><span style="color:#ff0000;">movie_name` = 'It's Yo'</span></strong> ,`total_duration` = 296 ,`total_size` = 0 ,`downloaded_duration` = 296 ,`download_state` = 'DONE' ,`movie_name` = 'It's Yo' WHERE `_id` = 322
W/System.err(13416):    at com.j256.ormlite.misc.SqlExceptionUtil.create(SqlExceptionUtil.java:22)
W/System.err(13416):    at com.j256.ormlite.android.AndroidCompiledStatement.execSql(AndroidCompiledStatement.java:203)
W/System.err(13416):    at com.j256.ormlite.android.AndroidCompiledStatement.runUpdate(AndroidCompiledStatement.java:78)
W/System.err(13416):    at com.j256.ormlite.stmt.StatementExecutor.update(StatementExecutor.java:480)
W/System.err(13416):    at com.j256.ormlite.dao.BaseDaoImpl.update(BaseDaoImpl.java:378)
W/System.err(13416):    at com.j256.ormlite.stmt.UpdateBuilder.update(UpdateBuilder.java:117)
W/System.err(13416):    at com.bobo.downloadframework.m3u8download.M3u8DownloadDAO.updateByMovieId(M3u8DownloadDAO.java:113)
W/System.err(13416):    at com.bobo.downloadframework.m3u8download.M3u8DownloadTask.executeDownload(M3u8DownloadTask.java:257)
W/System.err(13416):    at com.bobo.downloadframework.m3u8download.M3u8DownloadTask.doInBackground(M3u8DownloadTask.java:72)
W/System.err(13416):    at com.bobo.downloadframework.m3u8download.M3u8DownloadTask.doInBackground(M3u8DownloadTask.java:1)
W/System.err(13416):    at android.os.AsyncTask$2.call(AsyncTask.java:287)
W/System.err(13416):    at java.util.concurrent.FutureTask.run(FutureTask.java:234)
W/System.err(13416):    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080)
W/System.err(13416):    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573)
W/System.err(13416):    at java.lang.Thread.run(Thread.java:838)
W/System.err(13416): Caused by: android.database.sqlite.SQLiteException: near "s": syntax error (code 1): , while compiling: UPDATE `t_m3u8_download_list` SET `movie_name` = 'It's Yo' ,`total_duration` = 296 ,`total_size` = 0 ,`downloaded_duration` = 296 ,`download_state` = 'DONE' ,`movie_name` = 'It's Yo' WHERE `_id` = 322
W/System.err(13416):    at android.database.sqlite.SQLiteConnection.nativePrepareStatement(Native Method)
W/System.err(13416):    at android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:886)
W/System.err(13416):    at android.database.sqlite.SQLiteConnection.prepare(SQLiteConnection.java:497)
W/System.err(13416):    at android.database.sqlite.SQLiteSession.prepare(SQLiteSession.java:588)
W/System.err(13416):    at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:58)
W/System.err(13416):    at android.database.sqlite.SQLiteStatement.<init>(SQLiteStatement.java:31)
W/System.err(13416):    at android.database.sqlite.SQLiteDatabase.executeSql(SQLiteDatabase.java:1663)
W/System.err(13416):    at android.database.sqlite.SQLiteDatabase.execSQL(SQLiteDatabase.java:1644)
W/System.err(13416):    at com.j256.ormlite.android.AndroidCompiledStatement.execSql(AndroidCompiledStatement.java:201)
W/System.err(13416):    ... 13 more

2、分析:

根据 1) near "s": syntax error 提示s附近有语法错误,仔细观察发现是因为It's Yo中包含英文单引号

3、解决方法:

将英文单引号转换为中文单引号

  String regexp = "\'";String.replaceAll(regexp, "‘")
二:未使用ORMLite单引号处理方法

1、问题描述:

SQLiteDatabase mDB = this.getWritableDatabase();
String insertStr = "insert into mTable(id,name,age,phone) values(1,'iOcean's','80','110')";
mDB.execSQL(insertStr);

注:数据可能是server拿来的数据,为说明问题此处临时写死的。
当执行该代码时后台就会报异常如下:
insert Exception:android.database.sqlite.SQLiteException: near "s": syntax error: insert into mTable(id,name,age,phone) values(1,'iOcean's','80','110')
很明显,是因为单引号引起的

2、解决方法:

先是考虑的可不可以手动转义后insert,但是简单的使用String的replace方法不行,仍会报错
str.replace("'", "\\\\'");就算这种方法可行,但是引起问题的还有可能是其他字符,所以这种思路比较麻烦。那就换换喽^_^
后来查资料发现,SQLiteDatabase类的execSQL方法有两个,上面是其一execSQL (String sql),而另一个为execSQL (String sql, Object[] bindArgs)
而该方法支持使用占位符参数(?),所以试试喽,结果该方法对特殊字符通吃,嘛4么有,呵呵~

所以代码可以这样了:

SQLiteDatabase mDB = this.getWritableDatabase();
String insertStr = "insert into mTable(id,name,age,phone) values(?,?,?,?)";
Object[] mValue = new Object[]{1,"iOcean's","80","110");
mDB.execSQL(insertStr, mValue);

Android sqlite执行insert,英文单引号报错问题的解决相关推荐

  1. SqlServer执行insert语句,不报错,数据也插不进去

    项目中遇到,SqlServer执行insert语句,不报错,数据也插不进去, 原因:数据库中某条数据的某列为空,后面为这列创建了索引,插入的时候没有指定这列就会造成不报错也插不进去

  2. java 中的单引号报错_shell中的单引号,双引号,反引号

    docker的父镜像中定义了一个环境变量,我们的镜像在启动命令中需要用到这个环境变量.但是不加双引号时总是报错,报找不到java的启动类,加上双引号就不报错了. 父镜像中定义的变量:$xxx_CMD ...

  3. 解决文本搜索框输入中文出现单引号报错问题

    索引 为什么会出现单引号 出现错误报错 视图XAML代码 后台C#代码 原因 解决方法: 为什么会出现单引号 拼音中单引号作为拼音字节的分隔符出现当你输入的声母超过一个,系统会认为你是输入了两个中文符 ...

  4. 字符串声明太大出现错误_搜索框输入中文出现单引号报错问题

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 开发工具与关键技术:Visual Stud ...

  5. MySQL建表两个单引号报错_极客起源 - geekori.com - 问题详情 - mysql建表报错,查手册看不懂,求解?...

    创建带索引的数据库表需要为表名和属性添加反单引号,并且你当前的primary key的位置需要调整一下: create table `abc`( `id` int unsigned auto_incr ...

  6. java程序单引号报错_JavaScript中的单引号和双引号报错的解决方法

    在使用JavaScript显示消息或者传递字符数据的时候,经常会碰到数据中夹杂单引号(')或者双引号("),这种语句往往会造成JavaScript报错.对此一般采用/'或者/"的解 ...

  7. java程序单引号报错,javapoigetInpuStream报错br/是这样的, 爱问知识人

    是这样的,我写了重载了两个getInputStream方法,当调用不带参数的方法时,运行正常,当调用带参的方法则报 Can not find a java.io.InputStream with th ...

  8. Ubuntu无法正常输入英文单引号符号 + 误删除package导致系统设置异常(解决方案)...

    1 先说解决单引号的问题 写代码,遇到了输入英文单引号无法正常输入,需要按两次,而且不是竖向,而是斜的. 然后在寻找解决方案的过程中又遇到了把中文输入法搞得不能使用的问题.破费周折!!! 对Ubunt ...

  9. 统计字符串中特定字符成对的数量(英文单引号统计)

    以统计英文单引号的对数为例 我的思路,先统计所有的单引号数量,之后通过取余判断是否存在没有配对的单引号. 需要主要直接的数值运算结果是浮点数类型,所以需要转换为整数类型. st = input() p ...

最新文章

  1. RabbitMQ 实战(四)消费者 ack 以及 生产者 confirms
  2. 用Python实现最速下降法求极值
  3. 解决ie7不支持after、before的方法
  4. 电脑上同时安装了tensorflow和tensorflow-gpu,如何默认使用tensorflow-gpu
  5. 初步了解并使用正则表达式 (REGular EXPression)
  6. 【文件处理】——Python pandas 写入数据到excel中
  7. python requests 代理超时_python requests 超时与重试
  8. React:开发者友好性和易用性
  9. chattr lsattr
  10. Wordpress博客首页能打开 子页打不开解决办法
  11. python退出帮助系统_Python退出脚本并返回Main
  12. Hive 数据质量检测
  13. 空类型(void *)的简单理解
  14. HashMap源码剖析(代码基于JDK11)
  15. 常用工具列表清单及常用系统介绍
  16. 腾讯云数据迁移工具解决方案:阿里云迁移到腾讯云
  17. PicGo: image not found in clipboard
  18. linux 前台和后台,Linux前台进程与后台进程的区别
  19. EOF in header-net core
  20. 51单片机的中断源入口地址是程序存储器空间的5个单元

热门文章

  1. 2023计算机毕业设计SSM最新选题之java公交电子站牌管理系统软件9430l
  2. html避免多次点击选中页面文字或者内容时出现蓝色背景
  3. 物联网常见概念总结(期末复习)
  4. 023.二叉树的最近公共祖先
  5. AssertionError: Egg-link *** does not match installed location ***
  6. Idea使用系统应用打开md文件
  7. 二补数(2’scomplement)乘法算法及其Verilog实现 - 固定系数h
  8. 苹果cms v8模板仿q2002电影网站电脑手机自适应模板
  9. semantic_slam环境配置
  10. 第三类边界条件 matlab,matlab怎么解偏微分方程