取出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分句器 三、运行程序四、额外补充 一、前言 在学习对数据训练的预处理的时候遇到了一个问题,就是如何将文本按句子切分&#…...

【轻松玩转MacOS】常用软件篇
引言 在本篇文章中,我将介绍如何安装和使用一些常用的软件,如Safari浏览器、邮件、日历、地图等。让我们一起来看看吧! 一、Safari浏览器 Safari是MacOS自带的浏览器,具有简洁、快速、安全的特点。 以下是一些Safari浏览器的使…...

Akshare简记
文章目录 基本信息安装Anaconda安装(推荐)Anaconda设置AKShare安装使用AKShare更新数据接口一览数据字典用例Hello WorldMFI指标SMA指标BOLL线指标股市新闻情绪判断市场情绪指标ARBR条件选股回测配对交易策略日线策略计算相近产品基本信息 线上文档:...

Jmeter常用断言之断言持续时间简介
Duration Assertion:断言持续时间。 断言持续时间通常用于做性能测试,一般用于检查HTTP请求的响应时间是否超过预期值。而这个响应时间是性能测试中常关注的一个性能指标。 一、添加断言方式 根据需要可在【测试计划】、【线程组】、【线程请求】下添加…...

C/C++/VS2022/指针/数组 调试出现debug
这个情况就很难受,编译没错,但是运行出现问题了,如果点击中止(重试、忽略)下一次运行还是会出现,看了显示的大致意思是在数组arry上出现了什么错误,经过检查发现,原来是数组在数入时…...

【设计模式】使用原型模式完成业务中“各种O”的转换
文章目录 1.原型模式概述2.浅拷贝与深拷贝2.1.浅拷贝的实现方式2.2.深拷贝的实现方式 3.结语 1.原型模式概述 原型模式是一种非常简单易懂的模型,在书上的定义是这样的: Specify the kinds of objects to create using a prototypical instance,and cre…...

[C++ 网络协议] IOCP(Input Output Completion Port)
1.什么是IOCP IOCP(Input Output Completion Port)输入输出完成端口。其实就是基于重叠I/O的一种改进的模型。 重叠I/O具有缺点:重复调用非阻塞模式的accpet函数和以进入alertablewait状态为目的的SleepEx函数会影响程序性能。 而IOCP提供…...

R实现地图相关图形绘制
大家好,我是带我去滑雪! 地图相关图形绘制具有许多优点,这些优点使其在各种领域和应用中非常有用。例如:地图相关图形提供了一种直观的方式来可视化数据,使数据更容易理解和分析。通过地图,可以看到数据的空…...

【Jmeter】性能测试脚本开发——性能测试环境准备、Jmeter脚本编写和执行
文章目录 一、常用的Jmeter元件二、性能测试环境准备三、编写Jmeter脚本四、执行测试脚本 一、常用的Jmeter元件 取样器-HTTP请求 作用:发送HTTP请求配置原件-HTTP请求默认值 作用:设置HTTP请求的默认参数配置原件-用户定义的变量 作用:定义…...

看好你家电视盒的后门!数千个Android电视盒感染了与欺诈相关的危险恶意软件
如果你从Android电视盒获得流媒体修复程序,则你的设备可能会被恶意软件所感染,这些恶意软件能够进行广告欺诈、创建假帐户,并通过悄悄地将你的数据转移到中国的服务器来销售对家庭网络的访问。 根据本周的一份新报告,网络安全公司…...

LeetCode 1251. 平均售价
题目链接:1251. 平均售价 题目描述 表:Prices Column NameTypeproduct_idintstart_datedateend_datedatepriceint (product_id,start_date,end_date) 是 prices 表的主键(具有唯一值的列的组合)。 price…...