安卓奇葩问题之SQLite条件查找不到数据

今天真是日了狗了。

先说需求:要做一个累死支付宝首页的可自定义的栏目。栏目是动态从后台获取的,所以就会有一个本地数据和后台数据的同步问题。为了方便对本地数据的增删改查,首先想到SQLite。

然后就写了个工具类,调用接口后,先进行插入操作,成功;然后查询所有数据,成功;

然而,人生处处是惊喜。根据ID进行的查询、删除、更新,都会报错:游标的index越界了。

那就是没有查到数据嘛。首先想到是SQL语句写错了,或者是执行SQL的方法掉错了。

然后就试了无数种方法,发现都不行,还是一样的错误。

然后我就蒙逼了。

然后突然灵光一现,SQLite是弱类型的数据库,所以在插入的时候我的ID是int类型,但是在写SQl的时候,用int类型就不行了,必须要string类型。疑难杂症终于解决了。

下面上代码:

/**
     * 添加数据
     */
    public void insert(ChannelItem channelItem) {
        db.execSQL("insert into HNBLife_Channel values(?,?,?,?,?,?,?)",
                new Object[]{channelItem.getId(), channelItem.getName(), channelItem.getUrlStr(),
                        channelItem.getSmallPicUrl(), channelItem.getBigPicUrl(), channelItem.isBig(), channelItem.isAdd()});
    }

注意这里:channelItem.getId(),这个是int类型

然后在查询的时候:

/**
     * 根据id查询数据
     */
    public ChannelItem findById(int id) {
        Cursor cursor = db.rawQuery("select * from HNBLife_Channel where id=?",
                new String[]{String.valueOf(id)});
        ChannelItem item = null;
        while (cursor.moveToNext()) {
            item = getItem(cursor);
        }
        return item;
    }

注意rawQuery方法的第二个参数:这里是String类型。

所以就出现了上述问题。

解决方案很简单,在插入的时候把int转换成String就可以了。

时间: 2024-08-10 21:14:08

安卓奇葩问题之SQLite条件查找不到数据的相关文章

在安卓开发中使用SQLite数据库操作实例

前段时间写了个安卓平台下SQLite数据库操作的实例 ,一直没得时间总结 ,今天把它弄出来了. 在Android 运行时环境包含了完整的 SQLite. 首先介绍一下SQLite这个数据库: SQLite,是一款轻型的数据库,是遵守ACID的关联式数据库管理系统,它的设计目标是嵌入式的,而且目前已经在很多嵌入式产品中使用了它,它占用资源非常的低,在嵌入式设备中,可能只需要几百K的内存就够了.它能够支持Windows/Linux/Unix等等主流的操作系统,同时能够跟很多程序语言相结合,比如 Tc

orcal 实现多条件查找

主类 /** * 多条件动态查询 */ @Test public void selByConditions() {//通过条件查找,实现多条件查找 Configuration cfg = null; SessionFactory sf = null; Session session = null; EmpCondition condition = new EmpCondition(); condition.setJob("CLERK"); condition.setSalary(100

【Excel】多条件查找

例如下图:要求在单元格从C10中根据分类与名称找出相应的数量 1.VLOOKUP函数(数组公式) {=VLOOKUP(A10&B10,IF({1,0},A2:A6&B2:B6,C2:C6),2,0)} 原理:使用if{1,0}构造了数据 2.LOOKUP函数 =LOOKUP(1,0/(A10=A2:A6)*(B10=B2:B6),C2:C6) 原理:用lookup(1,0/(条件) 结构完成查找 3.SUM函数(数组公式)------有限制 {=SUM((A10=A2:A6)*(B10=B

sqlite 删除表中重复数据(亲测可用)

例子:表名  Paper .通过字段PaperID查找重复数据. 1 --查询某表中重复的数据       select * from Paper group by PaperID having count(*)>1; 2--删除重复行数,只剩不重复的记录(rowid为sqlite自带字段)      delete from Paper where Paper.rowid not in (select MAX(Paper.rowid) from Paper group by PaperID);

【SQL】检索满足条件的最大值的数据集合

是不是看题目觉的看不懂?其实我自己也看不懂,但是又找不到更好的词来形容. 为了更好的表达我的意思,请看下. 如果有一张成绩表(Points), 学生(student) 成绩(point) 科目(subject ) 张三 70 英语 张三 80 数学 李四 75 语文 李四 85 数学 我想知道每个学生成绩最好的是哪一科,该怎么算?? 我们应该先找到每个学生最好的成绩 ? 1 2 3 SELECT student , Max(point) FROM Points GROUP BY student

sqlite学习笔记10:C语言中使用sqlite之查询和更新数据

前面说到的 sqlite_exec() 中的第三个参数, SQLite 将为 sql 参数内执行的每个 SELECT 语句中处理的每个记录调用这个回调函数. 本节添加了两个函数,selectFromTable和updateTable. 实例程序如下: #include <stdio.h> #include <stdlib.h> #include "sqlite/sqlite3.h" #define DB_NANE "sqlite/test.db&quo

根据字段条件清理mysql数据库数据

根据字段条件清理mysql数据库数据 背景 线上某个数据库有1000个分库的DB,磁盘告警,每个库的大小都不是很大但是加起来就非常大了.手动根据时间字段来清理数据不太现实,于是决定写脚本来删除指定时间以前的数据. 脚本: #/bin/bash ##auth by qunyingliu ## files in xxx     HOST=$1 DBPORT=3306 USER="xxxx" PASSWORD="xxxx" DB_SKIP_CLEAN="mysq

安卓实战开发之SQLite从简单使用crud

前言 最近项目忙,然后呢很久没有更新博客了,react-native也是没有时间学习,然后项目里面用到了数据持久化(数据存储),Android系统中主要提供了三种数据持久化方式:文件存储.SharedPreference存储.数据库存储.说实在的毕竟app这种轻量级的使用数据库还是不多,然后呢要使用数据库也是在特定场合,这也导致了很多的移动端开发(对数据库操作不多)对数据库使用不太熟练. 应用场景 一般我们都不使用数据库的,基本上使用SharedPreference就能处理大部分问题,然后在特定

论安卓手机的恢复---SQLITE结构

之前我们了解了安卓数据的分类,这里继续来分析下SQLITE,之所以要分析它,是因为其它多媒体类的恢复早就有了解决方案.那么就有必要分析下SQLITE了,SQLITE是"轻量"级数据库的优秀代表,被很多大公司所使用.还有一点就是SQLITE是开源的,任何人都可以拿来使用(其支持并兼容主流SQL语句),我们研究其结构就是在了解世界上最聪明.最有智慧的程序员大脑中的想法!