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新手需要了解“?android:attr/actionBarSize”

    我正在经历拉尔斯 沃格尔的教程 http www vogella com articles AndroidFragments article html在使用 Fragments 时 我遇到了以下代码 android layout margi
  • Android 和 iOS 中的应用程序文件大小差异

    通过使用两个应用程序分发服务 Android 市场和 Apple 应用程序商店 我发现了一个谜团 Apple 应用程序的文件大小通常大于 Android 应用程序 我似乎找不到任何对这些差异的解释 而且这似乎是一个未触及的主题 我尝试过分配
  • Android:NotificationCompat.MediaStyle 操作按钮不执行任何操作

    我有一个简单的 Android 应用程序 其中包含一个Activity and a Service源自于MediaBrowserServiceCompat 我已成功将其设置为通过使用播放我的主要活动中的音频MediaBrowserCompa
  • 将 MS-Access 表单结果导出到 Excel?

    我对 Access 有点陌生 我在将 MySQL 和 Oracle 与 PHP 集成以创建基于 Web 的数据库搜索引擎方面拥有一些经验 但我很难理解 Access 的某些概念 我有一个小型数据库 其中包含大约 200 个条目 每个条目有
  • 分区表查询仍然扫描所有分区

    我有一个包含超过十亿条记录的表 为了提高性能 我将其分区为30个分区 最常见的查询有 id 在他们的 where 子句中 所以我决定对表进行分区id column 基本上 分区是这样创建的 CREATE TABLE foo 0 CHECK
  • 如何将您的终端与 Android 模拟器连接

    我尝试导航到 android 工具文件夹并输入 adb shell 命令 但它似乎不起作用 我的终端似乎只能识别命令的 adb 部分 并给我一条错误消息 我究竟做错了什么 通过键入列出所有连接的设备adb devices 检查是否列出了任何
  • 通过覆盖滑动调整图像大小不会调整图像大小

    我在用着Glide下载并显示图像 但是 当我尝试调整图像大小时 它不会这样做 我得到随机大小 或者可能是图像的实际大小 这是我用于通过 Glide 加载的代码 Glide with context load file getUrl asBi
  • Android/三星 Galaxy S 模拟器

    有没有办法在三星银河模拟器或类似的东西上尝试我的项目 我的项目在 HTC Legend 上运行 但在该设备上崩溃了 我如何在 android eclipse 上设置三星 Galaxy s 我设置了 W800 854 2 2 AVD 但它可以
  • 无法在 Android 中使用自定义数组适配器进行搜索?

    我无法从以下位置搜索listview 我尝试了各种方法 但它对我不起作用 没有错误 我有其他方式进行搜索 但我想让这种方式成为可能 这是代码 public class MainActivity extends Activity implem
  • 如何从Android webview下载文件?

    我下面的代码可以很好地加载 url 页面 并且在搜索歌曲后 当我单击下载链接时 它崩溃了 关于如何让下载管理器与网络视图一起工作的教程并不多 我究竟做错了什么 import java io File import android app A
  • 拥有可重用对话框的最佳方法是什么?

    在 Android 中创建可重用对话框的最佳方法是什么 阅读通过对话框开发指南 http developer android com guide topics ui dialogs html 我知道我可以使用AlertDialog Buil
  • Android Studio错误的含义:未注释的参数覆盖@NonNull参数

    我正在尝试 Android Studio 创建新项目并添加默认值后onSaveInstanceState方法创建 MyActivity 类 当我尝试将代码提交到 Git 时 我收到一个我不明白的奇怪错误 代码是这样的 我得到的错误是这样的
  • 特定铃声 firebase 通知 xamarin.android

    How i can force the push notification to run ringtone instead of default notification sound is there any way to ovveride
  • 调用属于Fragment的Activity的函数

    我正在与多个Fragments在 Android 下 我对如何从嵌入式应用程序发送和接收数据感到困惑 为了简单的解释 我有一个ListFragment and a MapFragment使用解释的方法here https stackover
  • 尝试重新打开已关闭的对象:sqlitequery

    所以本质上我查询数据库两次 我不明白这个错误真正来自哪里 因为我没有在任何地方关闭数据库 返回错误的代码是这样运行的 我查了一下 刚刚看到一个像我这样的案例 BeaconHandler pullAllDB new BeaconHandler
  • 在字符串内打印单引号

    我想输出 XYZ s ABC 我在Python IDLE中尝试了以下3条语句 第一条和第二条语句输出 a before 带打印功能的第三条语句不输出 before 作为 Python 新手 我想了解为什么 之前输出 在第 1 条和第 2 条
  • 如何以相同的意图从相机获取全尺寸图片和缩略图

    我一直需要找到这个问题的解决方案 我已经从这个社区搜索并测试了许多解决方案 但任何人都适合帮助我 我有两个活动 第一个活动拍摄一张照片并将其发送到另一个活动 该活动有一个 ImageView 来接收该照片 直到这里我遇到问题 以及一个在数据
  • Android:在surfaceview上实现admob

    我有一个使用 SurfaceView 的小游戏形式的活动 下面是代码片段 我很困惑如何在 SurfaceView 上实现 admob 请建议 public class DroidzActivity extends Activity priv
  • 找不到与给定名称“@style/Theme.AppCompat.Light”匹配的资源

    我已经研究这个问题几个小时了 从 github 下载存储库后 任何 xml 文件中的唯一错误是 No resource found that matches the given name style Theme AppCompat Ligh
  • Android 中用于过渡的自定义动画对象?

    我想用一些更奇特的东西来覆盖 Android 中的默认活动转换 我想做的事情不能用通常使用的 XML 集来完成 所以我不能使用overridePendingTransition因为它只接受对基于 XML 的动画资源的整数引用 我想做的是创建

随机推荐

  • 一文讲懂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