Android开发之数据库Sqlite
在Android中使用的数据库是开源数据库Sqlite数据库,下面主要详细的介绍Sqlite的使用:
一 SQLite简介
我们在编写数据库应用软件时,需要考虑这样的问题:因为我们开发的软件可能会安装在很多用户的手机上,如果应用使用到了SQLite数据库,我们必须在用户初次使用软件时创建出应用使用到的数据库表结构及添加一些初始化记录,另外在软件升级的时候,也需要对数据表结构进行更新。那么,我们如何才能实现在用户初次使用或升级软件时自动在用户的手机上创建出应用需要的数据库表呢?总不能让我们在每个需要安装此软件的手机上通过手工方式创建数据库表吧?因为这种需求是每个数据库应用都要面临的,所以在Android系统,为我们提供了一个名为SQLiteOpenHelper的抽象类,必须继承它才能使用,它是通过对数据库版本进行管理来实现前面提出的需求。
为了实现对数据库版本进行管理,SQLiteOpenHelper类提供了两个重要的方法,分别是onCreate(SQLiteDatabasedb)和onUpgrade(SQLiteDatabasedb, intoldVersion, intnewVersion),前者用于初次使用软件时生成数据库表,后者用于升级软件时更新数据库表结构。当调用SQLiteOpenHelper的getWritableDatabase()或者getReadableDatabase()方法获取用于操作数据库的SQLiteDatabase实例的时候,如果数据库不存在,Android系统会自动生成一个数据库,接着调用onCreate()方法,onCreate()方法在初次生成数据库时才会被调用,在onCreate()方法里可以生成数据库表结构及添加一些应用使用到的初始化数据。onUpgrade()方法在数据库的版本发生变化时会被调用,一般在软件升级时才需改变版本号,而数据库的版本是由程序员控制的,假设数据库现在的版本是1,由于业务的变更,修改了数据库表结构,这时候就需要升级软件,升级软件时希望更新用户手机里的数据库表结构,为了实现这一目的,可以把原来的数据库版本设置为2(有同学问设置为3行不行?当然可以,如果你愿意,设置为100也行),并且在onUpgrade()方法里面实现表结构的更新。当软件的版本升级次数比较多,这时在onUpgrade()方法里面可以根据原版号和目标版本号进行判断,然后作出相应的表结构及数据更新。
getWritableDatabase()和getReadableDatabase()方法都可以获取一个用于操作数据库的SQLiteDatabase实例。但getWritableDatabase()方法以读写方式打开数据库,一旦数据库的磁盘空间满了,数据库就只能读而不能写,倘若使用getWritableDatabase()打开数据库就会出错。getReadableDatabase()方法先以读写方式打开数据库,如果数据库的磁盘空间满了,就会打开失败,当打开失败后会继续尝试以只读方式打开数据库。
1先完成创建数据库操作:定义DBOpenHelper需要继承SQLiteOpenHelper类,重写onCreate方法创建数据库,当版本号变化时,执行onUpgrade更新数据表信息。
package com.andy.service;import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;public class DBOpenHelper extends SQLiteOpenHelper{public DBOpenHelper(Context context) {super(context, "andy.db", null, 0);}//数据库版本号从0开始 第一次为创建 没加一次就会执行数据库信息的更新操作@Overridepublic void onCreate(SQLiteDatabase db) {//数据库每一次被创建的时间调用db.execSQL("CREATE TABLE person(personid integer primary key autoincrement, name varchar(20), phone VARCHAR(12) NULL)");}@Overridepublic void onUpgrade(SQLiteDatabase db, int orderVersion, int newVersion) {db.execSQL("ALTER TABLE person ADD amount integer");}}
2 定义实现的PersonService数据库操作类
package com.andy.service;import java.util.ArrayList;
import java.util.List;import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;import com.andy.domain.Person;public class PersonService {private DBOpenHelper dbOpenHelper;public PersonService(Context context) {dbOpenHelper = new DBOpenHelper(context);}// 打开数据库的方法有getWritableDatabase getReadableDatabase 如果数据库未满时 返回的是writablepublic void save(Person person) {SQLiteDatabase sqLiteDatabase = dbOpenHelper.getWritableDatabase();sqLiteDatabase.execSQL("insert into person(name, phone, amount) values(?, ?, ?) ",new String[] { person.getName(), person.getPhone(),String.valueOf(person.getAmount()) });}public void update(Person person) {SQLiteDatabase sqLiteDatabase = dbOpenHelper.getWritableDatabase();sqLiteDatabase.execSQL("update person set name=?, phone=?, amount=? where personid = ?",new String[] { person.getName(), person.getPhone(),person.getAmount().toString(),person.getId().toString() });}public void delete(int id) {SQLiteDatabase sqLiteDatabase = dbOpenHelper.getWritableDatabase();sqLiteDatabase.execSQL("delete from person where personid=?",new Integer[] { id });}public Person find(Integer id) {SQLiteDatabase sqLiteDatabase = dbOpenHelper.getReadableDatabase();// 读取数据Cursor cursor = sqLiteDatabase.rawQuery("SELECT * FROM person WHERE personid = ?",new String[] { id.toString() });if (cursor.moveToFirst()) {int personid = cursor.getInt(cursor.getColumnIndex("personid"));String name = cursor.getString(cursor.getColumnIndex("name"));String phone = cursor.getString(cursor.getColumnIndex("phone"));int amount = cursor.getInt(cursor.getColumnIndex("amount"));return new Person(personid, name, phone, amount);}cursor.close();// 游标 需要关闭return null;}public List<Person> getScrollData(int offset, int maxResult) {SQLiteDatabase sqLiteDatabase = dbOpenHelper.getReadableDatabase();List<Person> persons = new ArrayList<Person>();Cursor cursor = sqLiteDatabase.rawQuery("select * from person order by personid limit ?,? ",new String[] { String.valueOf(offset),String.valueOf(maxResult) });while (cursor.moveToNext()) {int personid = cursor.getInt(cursor.getColumnIndex("personid"));String name = cursor.getString(cursor.getColumnIndex("name"));String phone = cursor.getString(cursor.getColumnIndex("phone"));int amount = cursor.getInt(cursor.getColumnIndex("amount"));persons.add(new Person(personid, name, phone, amount));}cursor.close();return persons;}public long getCount() {SQLiteDatabase sqLiteDatabase = dbOpenHelper.getReadableDatabase();Cursor cursor = sqLiteDatabase.rawQuery("select count(*) from person",null);cursor.moveToFirst();long result = cursor.getLong(0);cursor.close();return result;}public Cursor getCursorScrollData(int offset, int maxResult){SQLiteDatabase sqLiteDatabase = dbOpenHelper.getReadableDatabase();Cursor cursor = sqLiteDatabase.rawQuery("select personid _id, name, phone, amount from person order by personid limit ?,? ",new String[] { String.valueOf(offset),String.valueOf(maxResult) });return cursor;}//测试事务 transaction public void payment(){SQLiteDatabase sqLiteDatabase = dbOpenHelper.getWritableDatabase();sqLiteDatabase.beginTransaction();try{sqLiteDatabase.execSQL("update person set amount = amount -10 where personid = 1");sqLiteDatabase.execSQL("update person set amount = amount + 10 where personid = 2");sqLiteDatabase.setTransactionSuccessful();}finally{sqLiteDatabase.endTransaction();//结束事务有两种情况 commit rollback //事物的提交是由事务的标志决定的,如果事务的标志为true,事务就会提交,否则就会回滚,默认情况下事务的状态的状态是FALSE//无论回滚或者是提交 必须要执行事务的结束 放在try finally中执行}}}
3 使用到的Person类
package com.andy.domain;public class Person {private Integer id;private String name;private String phone;private Integer amount;public Person(){}public Person(String name, String phone, Integer amount) {super();this.name = name;this.phone = phone;this.amount = amount;}public Person(Integer id, String name, String phone, Integer amount) {super();this.id = id;this.name = name;this.phone = phone;this.amount = amount;}public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getPhone() {return phone;}public void setPhone(String phone) {this.phone = phone;}public Integer getAmount() {return amount;}public void setAmount(Integer amount) {this.amount = amount;}@Overridepublic String toString() {return "Person [id=" + id + ", name=" + name + ", phone=" + phone+ ", amount=" + amount + "]";}}
Android开发之数据库Sqlite相关推荐
- sqlite数据库android使用教程,Android开发教程之 SQLite数据库的使用
在开发Android应用程序时经常需要存储数据,Android系统提供了SQLite数据库,还提供了SQLiteOpenHelper类,使我们可以很方便的操作数据库.通过一个例子来说明在Android ...
- 【转】Android开发之数据库SQL
android中的应用开发很难避免不去使用数据库,这次就和大家聊聊android中的数据库操作. 一.android内的数据库的基础知识介绍 1.用了什么数据库 android中采用的数据库是SQLi ...
- Android 学习心得(2)——Android内置数据库SQLite
一.简介: Android有一个内置数据库SQLite,它是一种轻型数据库,它有五种数据类型:NULL(空型).BLOB(二进制).INTEGER(整型).REAL(浮点型).TEXT(字符串文本), ...
- Android开发 AndroidStudio数据库可视化
一.导出数据库使用SQLiteStudio工具查看 相信大家做Android开发或多或少会遇到一些项目中需要用到数据库,过去咱们用了数据库想要实时查看自己创建的数据库中数据比较费劲,要从Devic ...
- android轻量数据库SQLite的使用
SQLite是一款轻型的数据库,它的设计目标是嵌入 式的,而且目前已经在很多嵌入式产品中使用了它,它占用资源非常的低,在嵌入式设备中,可能只需要几百K的内存就够了.它能够支持 Windows/Linu ...
- 安卓开发之数据库——SQLite的详细介绍,详细到连Alt+回车都有说
安卓原生数据库SQLite的小白级使用方法.自己刚开始学的时候踩过的坑,给大家标出来,供大家参考,也算是记录我的学习过程,我将以用户注册验证登录信息为例. 刚开始学的时候,数据库的查询方法在网上看了很 ...
- Android中有关数据库SQLite的介绍
SQLite是android提供的一个关系型数据库.今天要总结的主要内容就是它. 在使用SQLite的时候用到的抽象类是 SQLiteOpenHelper 有关这个函数的详细内容你可以在Android ...
- Android开发:ListView+SQLite实现一个简单的备忘录程序(ADT插件环境)
前话:明天要交安卓程序了,前几天在自己的电脑上配置了一下安卓环境,但是项目无法编译,原因好像是jdk版本过高,有一个包无法支持,然后换成1.8的jdk也不行,昨晚折腾到凌晨一点半也没成功,今天借了同学 ...
- Android开发_SQLite数据库
SQLite数据库简介 SQLite是D.Richard Hipp用C语言编写的开源嵌入式数据库引擎.它支持大多数的SQL92标准,并且可以在所有主要的操作系统上运行. SQLite由以下几个部分组成 ...
- Android开发中的SQLite事务处理,即beginTransaction()方法...
以下是Android API的官方注解 beginTransaction Added in API level 1 void beginTransaction () Begins a transact ...
最新文章
- Linux 下使用命令行查看 內核版本 | 系統版本 | cpu 位數 | 內存使用
- 中国移动雄安研究院 2020校园招聘笔试JAVA方向(一)
- VS.NET 2005真是太好用了!
- Linux常用命令--文件(夹)查找之find命令
- java自定义异常实验总结,Java实验--自定义异常的使用
- 高并发高可用的 架构实践
- mysql 重要维护工具 图解
- 2017上海ACM ECL-final 总结
- 【Windows版】CMake安装教程
- 年度最骚语言之文言文编程!!!
- 解决ColorPix拾色器提取颜色错误
- 学习微机原理与接口这一篇就够了
- 地图刷新 android,android – 如何刷新谷歌地图.
- 项目记录——ANSYS Fluent入门翼型风洞模型计算
- django 静态 html页面,Django模板:HTML静态模板的继承
- 使用Python和selenium的Chromedriver模拟登陆爬取网站信息(beautifulsoup)
- 【网课视频提取ppt】【原创好用】如何自动提取视频中的PPT画面?网课视频提取ppt教程
- 较于微信红包,支付宝AR红包是个好产品吗?
- [PowerQuery] PowerQuery各个组件功能
- Open3D Voxelization 体素化
热门文章
- iOS swift当app从后台切换到前台,或者锁屏后开启唤醒,app收到通知,didBecomeActiveNotification
- 易筋SpringBoot 2.1 | 第十一篇:SpringBoot使用actuator
- Count Primes
- git branch查看/删除分支
- sqlalchemy连接和关闭数据库
- 计算机网络与应用在线作业,北航《计算机网络与应用》在线作业一15秋满分答案...
- vue 检测ie版本_vue 兼容低版本ie浏览器
- CS231n李飞飞计算机视觉 神经网络训练细节part1上
- 有关深度估计的几篇文章的阅读笔记
- Nessus高级使用研究