取出SQLite数据(基本游标)
前面一节中已经为Starbuzz创建了一个SQLite帮助器。
目前还是从Java Drink类获取数据,这时候要修改这个应用从SQLite数据库获取数据。
本文所有代码均存放于
https://github.com/MADMAX110/Starbuzz
一、修改DrinkActivity来使用Starbuzz数据库
基本步骤:
1、得到Starbuzz数据库的一个引用
2、创建一个游标从数据库读取数据
3、导航到饮料记录
4、在DrinkActiviy中显示饮料的详细信息
1、得到数据库引用
首先需要用上一章创建的SQLite帮助器得到Starbuzz数据库的一个引用。为此我们先要得到SQLite帮助器的一个引用。
SQLiteOpenHelper starbuzzDatabaseHelper = new StarbuzzDatabaseHelper(this);
然后调用SQLite帮助器的getReadableDatabase() 或getWriteableDatabase() 得到数据库一个引用。前者只读,后者可以进行更新。这两者都会返回一个SQLiteDatabase对象,可以用来访问数据库。
SQLiteDatabase db = starbuzzDatabaseHelper.getReadableDatabase();SQLiteDatabase db = starbuzzDatabaseHelper.getWritableDatabase();
如果Android没能得到数据库的一个引用,会抛出一个SQLiteExeception异常。例如,如果调用getWriteableDatabase来读写数据库,但是由于磁盘已满而无法写入数据库就会发生这种情况。
如果得到异常就可以使用一个Toast(一个弹出式消息)告诉用户这个消息不可用。
得到数据库的一个引用后,就可以使用游标从数据库中获取数据了。
2、用游标从数据库获取数据
创建游标
Cursor cursor = db.query(...);
最简单的数据库查询是从一个数据库的一个表中返回所有记录, 第一个参数是表名,第二个参数表示想要返回这些列中的值,如果想要返回一个表中的所有记录,将这些参数设置为null。
Cursor cursor = db.query("DRINK", new String[]{"_id", "NAME", "DESCRIPTION"}, null, null, null, null, null);
默认情况下,表中数据按_id的顺序显示,这是因为输入数据时的顺序。如果希望按NAME的升序顺序,可以使用以下代码。
Cursor cursor = db.query("DRINK", new String[]{"_id", "NAME", "DESCRIPTION"}, null, null, null, null, null, "NAME ASC");
ASC关键字表示你希望按升序对这一列排序。默认的都会按升序队列排序,所以也可以省略ASC,倘若要以降序排序则要使用DESC。
还可以对多个列进行排序,例如对FAVORITE降序排列,然后对NAME按升序排列。
Cursor cursor = db.query("DRINK", new String[]{"_id", "NAME", "DESCRIPTION"}, null, null, null, null, null, "FAVORITE DESC, NAME");
为数据设置过滤条件,返回特定的记录:例如返回DRINK列表中饮料名为Lattle的记录:
Cursor cursor = db.query("DRINK", new String[]{"_id", "NAME", "DESCRIPTION"}, "NAME = ?", new String[] {"Lattle"}, null, null, null);
或是DRINK列表中_id为1的记录:
Cursor cursor = db.query("DRINK", new String[]{"_id", "NAME", "DESCRIPTION"}, "_id = ?", new String[] {Integer.toString(1)}, null, null, null);
3、导航到游标记录
要从一个游标获取某个特定记录的值,首先要导航到这个记录。
游标主要有4个方法,这些方法分别是moveToFirst、moveToLast、moveToPrevious、moveToNext。
要返回游标的第一个记录可以使用moveToFirst方法,如果发现一个记录,这个方法就会返回一个true值。如果游标未返回任何记录就会返回false。
if (cursor.moveToFirst()){
}
同理、moveToLast是返回游标最后一个记录,moveToPrevious是前一个记录,moveToNext是后一个记录。
4、获取游标值
从第0列获取字符串,从第2列获取数值。
String name = cursor.getString(0);
int imageRes = cursor.getInt(2);
最后,关闭游标和数据库。
cursor.close();
db.close();
完整的DrinkActivity代码
package com.hfad.starbuzz;import androidx.appcompat.app.AppCompatActivity;import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.os.Bundle;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;public class DrinkActivity extends AppCompatActivity {public static final String EXTRA_DRINKID = "drinkId";@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_drink);int drinkId = (Integer)getIntent().getExtras().get(EXTRA_DRINKID);SQLiteOpenHelper starbuzzDatabaseHelper = new StarbuzzDatabaseHelper(this);try {SQLiteDatabase db = starbuzzDatabaseHelper.getReadableDatabase();Cursor cursor = db.query("DRINK",new String[]{"NAME", "DESCRIPTION", "IMAGE_RESOURCE_ID"},"_id = ?",new String[] {Integer.toString(drinkId)},null, null, null);if (cursor.moveToFirst()) {String nameText = cursor.getString(0);String descriptionText = cursor.getString(1);int photoId = cursor.getInt(2);TextView name = (TextView) findViewById(R.id.name);name.setText(nameText);TextView description = (TextView) findViewById(R.id.description);description.setText(descriptionText);ImageView photo = (ImageView) findViewById(R.id.photo);photo.setImageResource(photoId);photo.setContentDescription(nameText);}cursor.close();db.close();}catch (SQLException e){Toast toast = Toast.makeText(this,"Database unavailable",Toast.LENGTH_SHORT);toast.show();}}
}
二、修改DrinkCategoryActivity来使用Starbuzz数据库
这里的步骤与之前的有所不同,因为这里要显示一个列表视图,它使用饮料数据作为它的数据源。我们要把这个数据的数据源转换为Starbuzz数据库,
1、创建一个游标从数据库读取饮料数据。
2、将列表视图的数组适配器替换为一个游标适配器。
第一步与之前的一样,这里需要做的是替换列表视图中的数组数据。
简单游标适配器
原理:
1、列表视图向适配器请求数据
2、适配器向游标请求数据库中的数据
3、适配器向列表视图返回数据
使用简单游标适配器的做法与使用数组适配器很类似:要初始化适配器,然后把它关联到列表视图。
SimpleCursorAdapter listAdapter = new SimpleCursorAdapter(this , //当前活动android.R.layout.simple_list_item_1,//在列表视图中对应每一行显示一个值cursor,//这是游标new String[]{"NAME"},//使用游标的哪些列new int[]{android.R.id.text1},//希望在那些视图中显示这些数据0);//用来确定游标的行为,通常为0,这是默认值,也可以注册一个内容观察器listDrinks.setAdapter(listAdapter);
修改后的DrinkCategoryActivity代码:
package com.hfad.starbuzz;import androidx.appcompat.app.AppCompatActivity;import android.content.Intent;
import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.SimpleCursorAdapter;
import android.widget.Toast;public class DrinkCategoryActivity extends AppCompatActivity {private SQLiteDatabase db;private Cursor cursor;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_drink_category);ListView listDrinks = (ListView) findViewById(R.id.list_drinks);SQLiteOpenHelper starbuzzDatabaseHelper = new StarbuzzDatabaseHelper(this);try {db = starbuzzDatabaseHelper.getReadableDatabase();cursor = db.query("DRINK",new String[]{"_id", "NAME"},null, null, null, null, null);SimpleCursorAdapter listAdapter = new SimpleCursorAdapter(this , //当前活动android.R.layout.simple_list_item_1,//在列表视图中对应每一行显示一个值cursor,//这是游标new String[]{"NAME"},//使用游标的哪些列new int[]{android.R.id.text1},//希望在那些视图中显示这些数据0);//用来确定游标的行为,通常为0,这是默认值,也可以注册一个内容观察器listDrinks.setAdapter(listAdapter);}catch(SQLException e){Toast toast = Toast.makeText(this, "Database unavailable", Toast.LENGTH_SHORT);toast.show();}AdapterView.OnItemClickListener itemClickListener = new AdapterView.OnItemClickListener() {@Overridepublic void onItemClick(AdapterView<?> parent, View view, int position, long id) {if (position == 0) {Intent intent = new Intent(DrinkCategoryActivity.this, DrinkCategoryActivity.class);startActivity(intent);}Intent intent = new Intent(DrinkCategoryActivity.this, DrinkActivity.class);//向意图增加所单击列表项的ID,第一个参数表示使用这个常量名表示意图中的额外信息名//这样就能知道DrinkCategoryActivity和DrinkActivity在使用同一个字符串//创建DrinkActivity活动时要增加这个常量。intent.putExtra(DrinkActivity.EXTRA_DRINKID, (int)id);startActivity(intent);}};listDrinks.setOnItemClickListener(itemClickListener);}@Overrideprotected void onDestroy() {super.onDestroy();cursor.close();db.close();}
}
相关文章:
取出SQLite数据(基本游标)
前面一节中已经为Starbuzz创建了一个SQLite帮助器。 目前还是从Java Drink类获取数据,这时候要修改这个应用从SQLite数据库获取数据。 本文所有代码均存放于 https://github.com/MADMAX110/Starbuzz 一、修改DrinkActivity来使用Starbuzz数据库 基本步骤ÿ…...
信息增益,经验熵和经验条件熵——决策树
目录 1.经验熵 2.经验条件熵 3.信息增益 4.增益比率 5.例子1 6.例子2 在决策树模型中,我们会考虑应该选择哪一个特征作为根节点最好,这里就用到了信息增益 通俗上讲,信息增益就是在做出判断时,该信息对你影响程度的大小。比…...
手摸手系列之批量修改MySQL数据库所有表中某些字段的类型
在迁移老项目的数据库时,使用Navicat Premium的数据传输功能同步了表结构和数据。但是,发现某些字段的数据类型出现了错误,例如,租户ID从Oracle的NUMBER类型变成了MySQL的decimal(10),正确的应该是bigInt(20)。此外&am…...
视频号直播弹幕采集
系列文章目录 websocket逆向http拦截websocket拦截视频号直播弹幕采集 系列文章目录前言技术分析分析技术选择前提准备事件分析消息去重用户进房用户发言用户送礼用户点赞用户唯一id前言 很多小伙伴倒在了礼物事件,还有用户唯一标识下。 本篇文章将讲解视频号直播弹幕的获取的…...
PostgreSQL ash —— pgsentinel插件 学习与踩坑记录
零、 注意事项 测试发现,pgsentinel插件在pg_active_session_history视图记录条数较多时,存在严重的内存占用问题,群里的其他朋友反馈还可能存在严重的内存泄漏问题。本文仅用于学习和测试,未用于生产环境。 设置 pgsentinel_ash.…...
HarmonyOS/OpenHarmony原生应用开发-华为Serverless云端服务支持说明(一)
云端服务的实现是HarmonyOS/OpenHarmony原生应用开发的一个重要的环节,如果用户端是鸿蒙原生应用,但是服务端即云端还是基于传统的各种WEB网络框架、数据库与云服务器,那么所谓的原生应用开发实现的数据即后端服务是和以前、现在的互联网、移…...
3分钟基于Chat GPT完成工作中的小程序
1. 写在前面 GPT自从去年爆发以来,各大公司在大模型方面持续发力,行业大模型也如雨后春笋一般发展迅速,日常工作中比较多的应用场景还是问答模式,作为写程序的辅助也偶尔使用。今天看到一篇翻译的博客“我用 ChatGPT,…...
使用hugo+github搭建免费个人博客
使用hugogithub搭建免费个人博客 前提条件 win11电脑一台电脑安装了git电脑安装了hugogithub账号一个 个人博客本地搭建 初始化一个博客 打开cmd窗口,使用hugo新建一个博客工程 hugo new site blogtest下载主题 主题官网:themes.gohugo.io 在上面…...
打印字节流和字符流
打印字节流和字符流 printStream/ printWriter的构造器和方法都是一样的 package printfile;import java.io.FileOutputStream; import java.io.OutputStream; import java.io.PrintStream; import java.io.PrintWriter; import java.nio.charset.Charset;public class Prin…...
elementplus下载表格为excel格式
安装xlsx npm i --save https://cdn.sheetjs.com/xlsx-0.20.0/xlsx-0.20.0.tgz引入xlsx并使用 import XLSX from xlsx;const tableRef ref<any>(null); // 导出为 Excel const exportToExcel () > {// 获取 el-table 的引用tableRef.value tableRef.value || doc…...
聊聊僵尸进程
文章目录 1. 前言1.1 什么是僵尸进程1.2 为什么需要关注僵尸进程 2. 僵尸进程的产生2.2 为什么会产生僵尸进程2.3 举个栗子 3. 僵尸进程的影响3.1 僵尸进程为何会占用系统资源3.2 操作系统如何知道哪个资源需要被释放3.3 什么是进程表3.4 什么是PCB 5. 如何处理僵尸进程4.1 识别…...
stm32的时钟、中断的配置(针对寄存器),一些基础知识
一、学习参考资料 (1)正点原子的寄存器源码。 (2)STM32F103最小系统板开发指南-寄存器版本_V1.1(正点) (3)STM32F103最小系统板开发指南-库函数版本_V1.1(正点࿰…...
Vue14 监视属性简写
监视属性简写 当监视属性只有handler时,可以使用简写 <!DOCTYPE html> <html><head><meta charset"UTF-8" /><title>天气案例_监视属性_简写</title><!-- 引入Vue --><script type"text/javascript&…...
基于docker+Keepalived+Haproxy高可用前后的分离技术
基于dockerKeepalivedHaproxy高可用前后端分离技术 架构图 服务名docker-ip地址docker-keepalived-vip-iphaproxy-01docker-ip自动分配 未指定ip192.168.31.252haproxy-02docker-ip自动分配 未指定ip192.168.31.253 安装haproxy 宿主机ip 192.168.31.254 宿主机keepalived虚…...
安装配置deep learning开发环境
1. 下载安装anacondahttps://www.anaconda.com/download-success vim ~/.condarcchannels: - bioconda - https://mirrors.ustc.edu.cn/anaconda/pkgs/main/ - https://mirrors.ustc.edu.cn/anaconda/cloud/conda-forge/ - https://mirrors.tuna.tsinghua.edu.cn/anaco…...
Docker基础(CentOS 7)
参考资料 hub.docker.com 查看docker官方仓库,需要梯子 Docker命令大全 黑马程序员docker实操教程 (黑马讲的真的不错 容器与虚拟机 安装 yum install -y docker Docker服务命令 启动服务 systemctl start docker停止服务 systemctl stop docker重启…...
HTTP的基本格式
HTTP/HTTPS HTTPhttp的协议格式 HTTP 应用层,一方面是需要自定义协议,一方面也会用到一些现成的协议. HTTP协议,就是最常用到的应用层协议. 使用浏览器,打开网站,使用手机app,加载数据,这些过程大概率都是HTTP来支持的 HTTP是一个超文本传输协议, 文本>字符串 超文本>除…...
Qt元对象系统 day5
Qt元对象系统 day5 内存管理 QObject以对象树的形式组织起来,当为一个对象创建子对象时,子对象回自动添加到父对象的children()列表中。父对象拥有子对象所有权,比如父对象可以在自己的析构函数中删除它的孩子对象。使用findChild()或findC…...
【audio】alsa pcm音频路径
文章目录 AML方案音频路径分析dump alsa pcm各个音频路径的原始音频流数据 AML方案音频路径分析 一个Audio Patch用来表示一个或多个source端到一个或多个sink端。这个是从代码的注释翻译来的,大家可以把它比作大坝,可以有好几个入水口和出水口…...
NLP - 数据预处理 - 文本按句子进行切分
NLP - 数据预处理 - 文本按句子进行切分 文章目录 NLP - 数据预处理 - 文本按句子进行切分一、前言二、环境配置1、安装nltk库2、下载punkt分句器 三、运行程序四、额外补充 一、前言 在学习对数据训练的预处理的时候遇到了一个问题,就是如何将文本按句子切分&#…...
在HarmonyOS ArkTS ArkUI-X 5.0及以上版本中,手势开发全攻略:
在 HarmonyOS 应用开发中,手势交互是连接用户与设备的核心纽带。ArkTS 框架提供了丰富的手势处理能力,既支持点击、长按、拖拽等基础单一手势的精细控制,也能通过多种绑定策略解决父子组件的手势竞争问题。本文将结合官方开发文档,…...
最新SpringBoot+SpringCloud+Nacos微服务框架分享
文章目录 前言一、服务规划二、架构核心1.cloud的pom2.gateway的异常handler3.gateway的filter4、admin的pom5、admin的登录核心 三、code-helper分享总结 前言 最近有个活蛮赶的,根据Excel列的需求预估的工时直接打骨折,不要问我为什么,主要…...
MMaDA: Multimodal Large Diffusion Language Models
CODE : https://github.com/Gen-Verse/MMaDA Abstract 我们介绍了一种新型的多模态扩散基础模型MMaDA,它被设计用于在文本推理、多模态理解和文本到图像生成等不同领域实现卓越的性能。该方法的特点是三个关键创新:(i) MMaDA采用统一的扩散架构…...
macOS多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用
文章目录 问题现象问题原因解决办法 问题现象 macOS启动台(Launchpad)多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用。 问题原因 很明显,都是Google家的办公全家桶。这些应用并不是通过独立安装的…...
【Zephyr 系列 10】实战项目:打造一个蓝牙传感器终端 + 网关系统(完整架构与全栈实现)
🧠关键词:Zephyr、BLE、终端、网关、广播、连接、传感器、数据采集、低功耗、系统集成 📌目标读者:希望基于 Zephyr 构建 BLE 系统架构、实现终端与网关协作、具备产品交付能力的开发者 📊篇幅字数:约 5200 字 ✨ 项目总览 在物联网实际项目中,**“终端 + 网关”**是…...
聊一聊接口测试的意义有哪些?
目录 一、隔离性 & 早期测试 二、保障系统集成质量 三、验证业务逻辑的核心层 四、提升测试效率与覆盖度 五、系统稳定性的守护者 六、驱动团队协作与契约管理 七、性能与扩展性的前置评估 八、持续交付的核心支撑 接口测试的意义可以从四个维度展开,首…...
USB Over IP专用硬件的5个特点
USB over IP技术通过将USB协议数据封装在标准TCP/IP网络数据包中,从根本上改变了USB连接。这允许客户端通过局域网或广域网远程访问和控制物理连接到服务器的USB设备(如专用硬件设备),从而消除了直接物理连接的需要。USB over IP的…...
10-Oracle 23 ai Vector Search 概述和参数
一、Oracle AI Vector Search 概述 企业和个人都在尝试各种AI,使用客户端或是内部自己搭建集成大模型的终端,加速与大型语言模型(LLM)的结合,同时使用检索增强生成(Retrieval Augmented Generation &#…...
高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数
高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数 在软件开发中,单例模式(Singleton Pattern)是一种常见的设计模式,确保一个类仅有一个实例,并提供一个全局访问点。在多线程环境下,实现单例模式时需要注意线程安全问题,以防止多个线程同时创建实例,导致…...
虚拟电厂发展三大趋势:市场化、技术主导、车网互联
市场化:从政策驱动到多元盈利 政策全面赋能 2025年4月,国家发改委、能源局发布《关于加快推进虚拟电厂发展的指导意见》,首次明确虚拟电厂为“独立市场主体”,提出硬性目标:2027年全国调节能力≥2000万千瓦࿰…...
