android 中SQLiteDatabase的使用

2023-10-27

官方介绍:

Android provides full support for SQLite databases. Any databases you create will be accessible by name to any class in the application, but not outside the application.

The recommended method to create a new SQLite database is to create a subclass of SQLiteOpenHelper and override the onCreate() method, in which you can execute a SQLite command to create tables in the database. For example:

package com.zizhu.db;

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

/**
 * @author zizhu
 * 当调用SQLiteOpenHelper的getRead
 *
 */
public class DBOpenHelper extends SQLiteOpenHelper {

	public DBOpenHelper(Context context) {
		
		/**
		 * context 当前上下文环境
		 * 第二个参数:文件名称
		 * 第三个参数:游标工厂,null表示使用系统默认游标
		 * 第四个参数:版本号,当版本号发生变化的时候触发onUpgrade方法
		 */
		super(context, "zizhu", null, 1);
	}

	//第一次创建数据库的时候被调用
	@Override
	public void onCreate(SQLiteDatabase db) {
		db.execSQL("create table t_user (id integer primary key autoincrement, name varchar(20))");
	}

	@Override
	public void onUpgrade(SQLiteDatabase db, int version, int arg2) {
		db.execSQL("alter table t_user add mobile varchar(11) not null");
	}

}

You can then get an instance of your SQLiteOpenHelper implementation using the constructor you've defined. To write to and read from the database, call getWritableDatabase() and getReadableDatabase(), respectively. These both return a SQLiteDatabase object that represents the database and provides methods for SQLite operations.

一.SQLiteDatabase中基本操作:

package com.zizhu.service;

import java.util.ArrayList;
import java.util.List;

import android.content.ContentValues;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;

import com.zizhu.db.DBOpenHelper;
import com.zizhu.model.User;

public class UserService {

	private DBOpenHelper dbOpenHelper = null;

	public UserService(DBOpenHelper dbOpenHelper) {
		super();
		this.dbOpenHelper = dbOpenHelper;
	}

	/**
	 * getWritableDatabase方法具有缓存功能,在调用这个方法时,如果已存在db 则直接返回了,否则创建一个可写数据库对象
	 */
	private SQLiteDatabase getWritableDB() {
		SQLiteDatabase db = dbOpenHelper.getWritableDatabase();//
		return db;
	}

	/**
	 * getReadableDatabase方法中首先会调用getWritableDatabase方法,如果调用失败的时候,
	 * 才会已只读的方式创建一个新的数据库实例
	 * 
	 * 如果磁盘空间已满的情况下,getWritableDatabase方法会调用失败
	 * 相反,如果磁盘空间没有满的情况下,getReadableDatabase方法返回的一定是可写的数据库实例
	 */
	private SQLiteDatabase getReadableDB() {
		SQLiteDatabase db = dbOpenHelper.getReadableDatabase();
		return db;
	}

	public void save(User user){
		String sql = "insert into t_user(name) values('" + user.getName() + "')";
		//第一种方式,自己直接拼接sql语句
//		getWritableDB().execSQL(sql);
		//第二种方式,使用占位符,也是自己拼sql语句
//		getWritableDB().execSQL("insert into t_user(name) values(?)", new Object[]{user.getName()});
		//第三种方式,使用SQLiteDatabase提供的api,不过它的底层也是自己拼接的sql语句
		ContentValues values = new ContentValues();
		values.put("name", "zizhux");
		getWritableDB().insert("t_user", null, values);
	}

	public void delete(int id) {
//		getWritableDB().execSQL("delete from t_user where id=" + id);
		getWritableDB().delete("t_user", "id=?", new String[]{id+""});
	}

	public void update(User user) {
		getWritableDB().execSQL(
				"update t_user set name='" + user.getName() + "' where id="
						+ user.getId());
		// getWritableDB().execSQL("update t_user set name=? where id=?", new
		// Object[]{user.getName(), user.getId()});
		ContentValues values = new ContentValues();
		values.put("name", user.getName() + "hello,world");
		getWritableDB().update("t_user", values, "id=?", new String[]{user.getId()+""});
	}

	public User find(int id) {
		User u = new User();
		Cursor cursor = getReadableDB().rawQuery(
				"select * from t_user where id=?", new String[] { id + "" });
		if (cursor.moveToFirst()) {
			u.setName(cursor.getString(cursor.getColumnIndex("name")));
			u.setId(id);
		}
		cursor.close();
		return u;
	}

	public int getCount() {
		int count = 0;
		Cursor cursor = getReadableDB().rawQuery("select count(*) from t_user",
				null);
		if (cursor.moveToFirst()) {
			count = cursor.getInt(0);
		}
		cursor.close();
		return count;
	}

	/**
	 * 分页,跳过前面over条数据,这个地方以前没注意
	 * 
	 * @param over
	 * @param count
	 * @return
	 */
	public List<User> getUsers(int over, int count) {
		List<User> users = new ArrayList<User>();
		Cursor cursor = getReadableDB().rawQuery(
				"select * from t_user order by name asc limit ?,?",
				new String[] { String.valueOf(over), String.valueOf(count) });
		while (cursor.moveToNext()) {
			User u = new User();
			u.setName(cursor.getString(cursor.getColumnIndex("name")));
			u.setId(cursor.getInt(cursor.getColumnIndex("id")));
			users.add(u);
		}
		cursor.close();
		return users;
	}

}


二.在SQLiteDatabase中使用事务:

/**
	 * 模拟转账,用户1转200元到用户2
	 */
	public void payment() {
		SQLiteDatabase db = getWritableDB();
		/**
		 * 官方解释:事务会默认回滚,如果没有明确调用setTransactionSuccessful方法
		 * The changes will be rolled back if any transaction is ended without
		 * being marked as clean (by calling setTransactionSuccessful).
		 * Otherwise they will be committed.
		 */
		db.beginTransaction();
		try{
			int amount = 200;
			User u1 = find(1);
			User u2 = find(2);
			u1.setAmount(u1.getAmount() - amount);
			u2.setAmount(u2.getAmount() + amount);
			update(u1);
			update(u2);
			db.setTransactionSuccessful();//如果中间报错了,则不能执行到这一句,则事务会回滚
		}finally{
			db.endTransaction();
		}
	}



本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

android 中SQLiteDatabase的使用 的相关文章

  • Android Q:file.mkdirs() 返回 false

    我们有一个应用程序 使用外部存储来存储一些临时文件 图像 二进制数据 该代码已经运行了几年 直到最近才发生重大变化 在 Android Q 上它不起作用 File f new File Environment getExternalStor
  • Java中有没有一种方法可以通过名称实例化一个类?

    我正在寻找问题 从字符串名称实例化一个类 https stackoverflow com questions 9854900 instantiate an class from its string name它描述了如何在有名称的情况下实例
  • 如何在 Linux 内核中定义并触发我自己的新软中断?

    我想在 Linux 内核中创建自己的软中断 这是正确的方法吗 In the init我想触发该模块的softirq我将添加一个调用 394 void open softirq int nr void action struct softir
  • Bitmap.getPixels() 中的 IllegalArgumentException

    我想将数据从位图复制到int using getPixels 这是我当前的代码 int pixels new int myBitmap getHeight myBitmap getWidth myBitmap getPixels pixel
  • java.lang.IllegalStateException:应用程序 PagerAdapter 更改了适配器的内容,而没有调用 PagerAdapter#notifyDataSetChanged android

    我正在尝试使用静态类将值传递给视图 而不是使用意图 因为我必须传递大量数据 有时我会收到此错误 但无法找出主要原因是什么 Error java lang IllegalStateException The application s Pag
  • ExoPlayer2 - 如何使 HTTP 301 重定向工作?

    我开始使用 ExoPlayer 来传输一些音频 一切都很顺利 直到我遇到一个带有 301 永久移动 重定向的 URL ExoPlayer2 默认情况下不处理该问题 我已经看过这个线程 https github com google ExoP
  • Android 深度链接至 Instagram 应用

    Instagram 已经发布了 iOS 深层链接的 url 方案 但尚未为 Android 创建文档 有没有办法深入链接到 Android 上的 Instagram 应用程序 以转到 Instagram 应用程序中的特定位置 例如 Inst
  • 当它的父级是 ConstraintLayout 时设计 CardView 吗?

    我在编辑包含Relativelayout的Cardview内的RelativeLayout时搞砸了 ConstraintLayout会将相对布局的wrap content更改为0并添加工具 layout editor absoluteX 1
  • 在 android 中建立与 MySQL 的池连接

    我需要从我的 Android 应用程序访问 MySQL 数据库 现在所有的工作都通过 DriverManager getConnection url 等等 但我必须从多个线程访问数据库 所以我必须使用连接池 问题1 是 com mysql
  • Android:后台Activity可以执行代码吗?

    后台的活动是否被视为 正在运行 并且可以执行代码 还是处于挂起状态 他们暂停了 活动生命周期 http developer android com reference android app Activity html ActivityLi
  • Python 3:将字符串转换为变量[重复]

    这个问题在这里已经有答案了 我正在从 txt 文件读取文本 并且需要使用我读取的数据之一作为类实例的变量 class Sports def init self players 0 location name self players pla
  • Mipmap 与可绘制文件夹[重复]

    这个问题在这里已经有答案了 我正在使用 Android Studio 1 1 Preview 1 我注意到 当我创建一个新项目时 我得到以下层次结构 不同 DPI 的 Mipmap 文件夹 不再有不同 DPI 的可绘制文件夹 我应该将所有资
  • Android 2.3 模拟器在更新位置时崩溃

    我正在使用 Eclipse 编写和调试 Android 应用程序 我需要做的事情之一是更新设备的位置 因此我尝试使用模拟器控制窗口中的位置控制面板 在 手动 选项卡上 我选择 十进制 输入有效的纬度和经度 然后单击 发送 不幸的是 接下来发
  • 我应该释放或重置 MediaPlayer 吗?

    我有自己的自定义适配器类 称为 WordAdapter 并且我正在使用媒体播放器 名为pronounce WordAdapter 类中的全局变量 我有不同的活动 其中每个列表项都有线性布局 名为linearLayout 我正在设置onCli
  • Dagger 2 没有生成我的组件类

    我正在使用 Dagger 2 创建我的依赖注入 几个小时前它还在工作 但现在不再生成组件 这是我创建组件的地方 public class App extends Application CacheComponent mCacheCompon
  • Android 中的处理程序与异步调用

    目前我正在使用处理程序来调用 Web 服务方法以使其在后台运行 问题是它需要更多的时间来给出响应 在性能方面似乎更昂贵 现在我计划使用异步调用 哪一个是最好的 Android 中的处理程序和异步调用有什么区别 请帮我想出一个最好的解决方案
  • 在命令行上卸载 Android SDK 的选定部分

    这与 卸载旧的 Android SDK 版本 https stackoverflow com questions 15182377 uninstall old android sdk versions 除非我想在无头 Linux CI 服务
  • 通过电子邮件发送文本文件附件

    我正在尝试附加一个文本文件以便通过电子邮件发送 但每当我打开电子邮件应用程序时 它都会说该文件不存在 请帮助 Intent i new Intent Intent ACTION SEND i setType text plain i put
  • 在virtualenv中下载sqlite3

    我正在尝试使用命令创建应用程序python3 manage py startapp webapp但我收到一条错误消息 django core exceptions ImproperlyConfigured 加载时出错 pysqlite2 或
  • Git 实验分支还是单独的实验存储库?

    我正在开发一个 Android 应用程序 并且在整个开发周期中一直使用 Git 现在 我想构建并发布实验性功能 供人们尝试和安装 同时仍将原始的 稳定的应用程序安装在他们的设备上 现在 这意味着我需要使用不同的包名称 这会更改开发项目中的一

随机推荐

  • 一文讲懂gPTP

    原文链接 https zhuanlan zhihu com p 113398852 一文讲懂gPTP 简介 gPTP是general precise time protocol的简称 是PTP协议的派生 gPTP的目的是确保所有局域网里的节
  • 性能测试报告:用于项目的性能验证、性能调优、发现性能缺陷等应用场景

    性能测试报告是一种重要的报告类型 旨在评估软件系统的性能 稳定性和安全性 在这篇文章中 我们将详细介绍性能测试报告的应用场景 测试方法和性能指标 以及如何撰写一份有效的性能测试报告 一 概述 性能测试报告的目的是对软件系统的性能进行全面的评
  • 沃尔沃T5发动机涡轮增压器

    电控废气涡轮增压系统的结构与工作原理 马明芳 https wenku baidu com view a9700e5cda38376baf1faea4 html 废气涡轮增压控制系统的工作原理 https www asklib com vie
  • 解决VSCode下载过慢的问题

    我使用的是谷歌浏览器 1 去官网https code visualstudio com Download下载自己所需的版本 可以看到很明显的下载速度过慢 我们只需要把下载的链接拿出来 把链接中红方框圈住的内容替换成vscode cdn az
  • SDUT 2023 summer team contest(for 22) - 7

    A JB Loves Math 题意 给你两个数a b 让你找一个奇数x 一个偶数y a只能加x或减y 问让你最少操作几次可以令a b 思路 我们将其分为三大种情况 1 a b ans 0 2 a gt b 这时如果a与b的差值为偶数ans
  • OpenGait:首个步态识别框架开源了!

    远远地 看一眼你走路方式 就知道你是谁 这就是步态识别技术 首个步态识别框架OpenGait正式发布了 OpenGait由南方科技大学计算机系于仕琪科研团队开发 银河水滴公司予以支持 欢迎大家三连 使用 反馈和建议 项目主页 https g
  • 【python数据挖掘课程】十一.Pandas、Matplotlib结合SQL语句可视化分析

    这是非常好的一篇文章 可以认为是我做数据分析的转折点 为什么呢 因为这是我做数据分析第一次引入SQL语句 然后爱不释手 结合SQL语句返回结果进行数据分析的效果真的很好 很多大神看到可能会笑话晚辈 但是如果你是数据分析的新人 那我强烈推荐
  • 干货!移动端真机调试指南,对调试说easy

    点击上方 前端瓶子君 关注公众号 回复算法 加入前端编程面试算法每日一题群 前言 这么快就年终了 回顾2021年发现没干啥事 换了个城市 换了份工作 新公司新坑 现在主做Hybrid APP 那么年终就总结下移动端的调试方案来划划水吧 移动
  • 记录loadrunner12保存录制脚本提示【是要保存此文件,还是要联机查找程序来打开此文件】的解决方法

    现象 loadrunner保存录制脚本提示 是要保存此文件 还是要联机查找程序来打开此文件 直接参考网上提供的方法执行脚本仍报错 再尝试摸索一下解决了问题 解决方法 第一步 管理员模式运行cmd 第二步 分别执行 regsvr32 msxm
  • 漫步数学分析二十一——逐点收敛与一致收敛

    对一个函数序列来说 最自然的收敛类型可能是逐点 pointwise 收敛 定义如下 定义1 textbf 23450 20041 1 函数序列 fk A Rm A Rn f k A to R m A subset R n逐点收敛到 f A
  • 在阿里云服务器上配置jenkins部署spring boot jar项目

    由于最近时间多 听说jenkins部署项目非常简单 所以在空余时间尝试了下 并记录本次操作中的问题 一 安装jenkins 1 首先在usr local下创建一个jenkins文件夹 使用命令 mkdir jenkins 下载jenkins
  • 入门级题解15. 三数之和

    题目 给你一个包含 n 个整数的数组 nums 判断 nums 中是否存在三个元素 a b c 使得 a b c 0 请你找出所有和为 0 且不重复的三元组 注意 答案中不可以包含重复的三元组 来源 力扣 LeetCode 链接 https
  • [924]sql中的if条件语句的用法

    IF 表达式 IF a b c a的值为TRUE 则返回值为 b a的值为FALSE 则返回值为 c 如下 SELECT IF TRUE 1 2 gt 1 SELECT IF FALSE 1 2 gt 2 SELECT IF STRCMP
  • 信用卡定时还款

    目录 1 功能说明 2 核心代码 3 结果截图 4 实验小结 5 仓库链接 功能说明 总功能 使用委托实现信用卡用户定时还款功能 具体算法 1 创建一个储蓄卡和一个信用卡 储蓄卡中存有姓名和余额两个数据成员 信用卡中存有姓名 还款金额和还款
  • C语言从键盘上输入若干个整数,其值在0~10的范围内,用-1作为输入结束的标准,统计整数的个数。要求通过不带参数的函数实现。

    C语言从键盘上输入若干个整数 其值在0 10的范围内 用 1作为输入结束的标准 统计整数的个数 要求通过不带参数的函数实现 include
  • Git忽略规则及.gitignore规则不生效的解决办法

    修改 gitignore发现并未生效 原因是 gitignore只能忽略那些原来没有被track的文件 如果某些文件已经被纳入了版本管理中 则修改 gitignore是无效的 那么解决方法就是先把本地缓存删除 改变成未track状态 然后再
  • [从零学习汇编语言] - 标志寄存器

    文章目录 前言 一 标志寄存器的简介 二 标志位详解 2 1 ZF标志 2 2 PF标志 2 3 SF标志 2 4 CF标志 2 4 1 无符号运算 2 4 2 有符号运算 2 5 OF标志 2 5 1 CF标志及OF标志的区别 2 6 D
  • filename在matlab,matlab中的filename

    2 文件名不要取为 matlab 的一个固有函数 m Matlab 中 m 文件的命名规则 matlab 的 m 文件保存的命名规则 1 文件名命名要用英文字符 第一个字符不能是 matlab 编程中需要调入电脑中的某个文件时采用的语句 m
  • AD中用户帐户属性userAccountControl

    http blog csdn net xjzdr article details 3553246 在打开用户帐户的属性后 单击帐户选项卡 然后选中或清除 帐户选项 对话框中的复选框 则会将数值分配给 UserAccountControl 属
  • android 中SQLiteDatabase的使用

    官方介绍 Android provides full support for SQLite databases Any databases you create will be accessible by name to any class