1.SQLite的特点

比较小巧,适合在小型设备上使用

Android手机自带SQLite

SQLite除了主键意外,不区分数据类型

SQLite语句和MySQL语句基本相同

2.创建数据库

定义类继承SQLiteOpenHelper,该类没有无参的构造函数,必须调用有参数的构造函数,分别传入:环境对象、数据库名称、游标工厂和数据库版本。

需要重写两个抽象方法:onCreate()和onUpgrade(),用于创建或更新修改数据库。

使用数据库:创建该类的对象,调用getWritableDatabase()或者getReadableDatabase()方法即可获取到SQLiteDatabase对象,该对象可以执行SQL语句;

情况1:数据库不存在时,创建数据库执行onCreate()方法

情况2:数据库存在,版本未变,直接打开数据库,不执行任何方法

情况3:数据库存在,版本发生改变,打开数据库,执行onUpgrade()方法

3.增删改查

增删改时需要使用getWritableDatabase()方法得到SQLiteDatabase对象,然后调用execSQL()方法来执行SQL语句。

查询时要使用getReadableDatabase()方法来得到SQLiteDatabase对象,然后调用rawQuery()方法查询得到Cursor,然后调用moveToNext()方法移动Cursor,使用getString()、getInt()等方法来获取对应数据。

public class MyOpenHelper extends SQLiteOpenHelper {public MyOpenHelper(Context context) {super(context, "xxx.db", null, 1);/** 参数1:Context,用来确认数据库文件的位置* 参数2:数据库文件的名称* 参数3:用来创建游标对象的工厂,null代表使用默认工厂* 参数4:数据库版本,从1开始*/}@Overridepublic void onCreate(SQLiteDatabase db) {db.execSQL("CREATE TABLE person(id INTEGER PRIMARY KEY AUTOINCREMENT,name VARCHAR(20))");}@Overridepublic void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {db.execSQL("ALTER TABLE person ADD balance INTEGER");}}

public class PersonDaoClassic {private MyOpenHelper helper;public PersonDaoClassic(Context context){helper = new MyOpenHelper(context);}public void insert(Person p){SQLiteDatabase db = helper.getWritableDatabase();db.execSQL("INSERT INTO person(name,balance) VALUES(?,?)",new Object[]{p.getName(),p.getBalance()});db.close();}public void delete(int id){SQLiteDatabase db = helper.getWritableDatabase();db.execSQL("DELETE FROM person WHERE id=?",new Object[]{id});db.close();}public void update(Person p){SQLiteDatabase db = helper.getWritableDatabase();db.execSQL("UPDATE person SET name=?,balance=? WHERE id=?",new Object[]{p.getName(),p.getBalance(),p.getId()});db.close();}public Person query(int id){Person p = null;SQLiteDatabase db = helper.getReadableDatabase();Cursor c = db.rawQuery("SELECT name,balance FROM person WHERE id=?",  new String[]{id+""});//查询获得游标(结果集)if(c.moveToNext()){//把游标向后移一位,判断是否有数据String name = c.getString(c.getColumnIndex("name"));//先根据列名获得索引,再根据索引获取数据int balance = c.getInt(1);//由于知道balance的索引,所以直接通过索引获取数据p = new Person(id, name, balance);}c.close();db.close();return p;}public List<Person> queryAll(){List<Person> persons = new ArrayList<Person>();SQLiteDatabase db = helper.getReadableDatabase();Cursor c = db.rawQuery("SELECT * FROM person", null);while(c.moveToNext()){int id = c.getInt(c.getColumnIndex("id"));String name = c.getString(c.getColumnIndex("name"));int balance = c.getInt(c.getColumnIndex("balance"));persons.add(new Person(id, name, balance));}c.close();db.close();return persons;}public List<Person> queryPage(int pageNum,int pageSize){int offset = (pageNum-1)*pageSize;List<Person> persons = new ArrayList<Person>();SQLiteDatabase db = helper.getReadableDatabase();Cursor c = db.rawQuery("SELECT * FROM person LIMIT ?,?", new String[]{offset+"",pageSize+""});while(c.moveToNext()){int id = c.getInt(c.getColumnIndex("id"));String name=c.getString(c.getColumnIndex("name"));int balance = c.getInt(c.getColumnIndex("balance"));persons.add(new Person(id, name, balance));}c.close();db.close();return persons;}
}

public class Person {private Integer id;private String name;private Integer balance;public Person() {super();}public Person(String name, Integer balance) {super();this.name = name;this.balance = balance;}public Person(Integer id, String name, Integer balance) {super();this.id = id;this.name = name;this.balance = balance;}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 Integer getBalance() {return balance;}public void setBalance(Integer balance) {this.balance = balance;}@Overridepublic String toString() {return "Person [id=" + id + ", name=" + name + ", balance=" + balance+"]";}}

4.另一种增删改查

使用insert()、delete()、update()、query()四个方法,而不是用SQL语句,通过传入一些参数,方法内部自动拼装SQL语句。

public class PersonDao {private MyOpenHelper helper;public PersonDao(Context context){helper = new MyOpenHelper(context);}public long insert(Person p){SQLiteDatabase db = helper.getWritableDatabase();ContentValues values = new ContentValues();//这是一个Map,用来装载要插入的列名和值values.put("name", p.getName());values.put("balance", p.getBalance());long id = db.insert("person", "id", values);//向person表中插入values中的数据,得到新纪录的id。第二个参数可以为null//如果values中的键值都为null时,此时插入的是空记录(第二个参数不能为null)db.close();return id;}public int delete(int id){SQLiteDatabase db = helper.getWritableDatabase();int rows = db.delete("person", "id=?", new String[]{id+""});//删除指定条件的记录,返回值为影响到的行数db.close();return rows;}public int update(Person p){SQLiteDatabase db = helper.getWritableDatabase();ContentValues values = new ContentValues();values.put("name", p.getName());values.put("balance", p.getBalance());int rows = db.update("person", values, "id=?", new String[]{p.getId()+""});db.close();return rows;}public Person query(int id){Person p = null;SQLiteDatabase db = helper.getReadableDatabase();Cursor c = db.query("person", new String[]{"name","balance"}, "id=?", new String[]{id+""}, null, null, null);if(c.moveToNext()){//把游标向后移一位,判断是否有数据String name = c.getString(c.getColumnIndex("name"));//先根据列名获得索引,再根据索引获取数据int balance = c.getInt(1);//由于知道balance的索引,所以直接通过索引获取数据p = new Person(id, name, balance);}c.close();db.close();return p;}public List<Person> queryAll(){List<Person> persons = new ArrayList<Person>();SQLiteDatabase db = helper.getReadableDatabase();Cursor c = db.query("person", null, null, null,null, null, "balance DESC", null);while(c.moveToNext()){int id = c.getInt(c.getColumnIndex("id"));String name = c.getString(c.getColumnIndex("name"));int balance = c.getInt(c.getColumnIndex("balance"));persons.add(new Person(id, name, balance));}c.close();db.close();return persons;}public List<Person> queryPage(int pageNum,int pageSize){int offset = (pageNum-1)*pageSize;List<Person> persons = new ArrayList<Person>();SQLiteDatabase db = helper.getReadableDatabase();Cursor c = db.query("person", null, null, null,null, null, null, offset+","+pageSize);while(c.moveToNext()){int id = c.getInt(c.getColumnIndex("id"));String name=c.getString(c.getColumnIndex("name"));int balance = c.getInt(c.getColumnIndex("balance"));persons.add(new Person(id, name, balance));}c.close();db.close();return persons;}public Cursor queryAllCusor(){SQLiteDatabase db = helper.getReadableDatabase();return db.query("person", new String[]{"id as _id","name","balance"}, null, null, null, null, null);}
}

该方法适用于ContentProvider中,在ContentProvider中的一些回调函数的参数就是表名和数据,直接调用这四个方法执行操作即可。

转载于:https://www.cnblogs.com/chenchong/archive/2013/04/20/3033020.html

Android基础(三) 数据库SQLite相关推荐

  1. Android 学习心得(2)——Android内置数据库SQLite

    一.简介: Android有一个内置数据库SQLite,它是一种轻型数据库,它有五种数据类型:NULL(空型).BLOB(二进制).INTEGER(整型).REAL(浮点型).TEXT(字符串文本), ...

  2. android轻量数据库SQLite的使用

    SQLite是一款轻型的数据库,它的设计目标是嵌入 式的,而且目前已经在很多嵌入式产品中使用了它,它占用资源非常的低,在嵌入式设备中,可能只需要几百K的内存就够了.它能够支持 Windows/Linu ...

  3. Android 第三章 SQLite 数据库

    1,使用execSQL API 操作数据库.      步骤1,创建Class MyOpenHelper实现接口SQLiteOpenHelper,复写构造函数.onCreate.onUpgrade方法 ...

  4. Android中有关数据库SQLite的介绍

    SQLite是android提供的一个关系型数据库.今天要总结的主要内容就是它. 在使用SQLite的时候用到的抽象类是 SQLiteOpenHelper 有关这个函数的详细内容你可以在Android ...

  5. Android客户端开发—数据库SQLite基本语句

    之前接触过一点MySQL数据库方面的知识,现在在学习Android软件开发过程中发现SQLite语句与MySQL的语句还是有部分不同,SQLite中的命令不算太多,可以在adb shell中进入App ...

  6. Android基础(三) UI开发 Part 1

    1.常用控件 1)TextView 2)Button 3)EditText 4)ImageView 5)ProgressBar 6)AlertDialog 7)ProgressDialog 2.四种布 ...

  7. android基础题型

    android基础 1.数据库的操作类型有哪些,如何导入外部数据库? 把原数据库包括在项目源码的 res/raw Android系统下数据库应该存放在 /data/data/com..(package ...

  8. Android基础知识 - SQLite数据库的最佳实践(使用事务、升级数据库的最佳写法)

    目录 使用事务 升级数据库的最佳写法 使用事务 SQLite数据库时支持事务的,事务的特性可以保证让某一系列的操作要么全部完成,要么一个都不会完成. 那么在什么情况下才需要使用事务呢? 想象以下场景, ...

  9. Android基础总结+SQlite数据库【申明:来源于网络】

    Android基础总结+SQlite数据库[申明:来源于网络] 基础总结篇之一:Activity生命周期:http://blog.csdn.net/liuhe688/article/details/6 ...

  10. 2010-02-28 传智播客—Android(三)数据存储之三SQLite嵌入式数据库

    2010-02-28 传智播客-Android(三)数据存储之三SQLite嵌入式数据库 前两篇日志我已经总结了本地数据存储的前两种:文件和配置项.还剩下最后一种数据库存储--SQLite. 一.SQ ...

最新文章

  1. 入坑emacs之配置文件 .emas.d/init.el -v1.0
  2. 计算机技术会议排名,计算机学科会议排名
  3. 推荐原创Python号主:猪哥
  4. Android画布的保存,Android canvas用法介绍之save()和restore()
  5. 计算机图形学二维变换知识点,计算机图形学 二维变换及二维.ppt
  6. LeetCode 14. 最长公共前缀
  7. java 系统类型_Java获取操作系统类型
  8. 在GDI+中如何实现以左下角为原点的笛卡尔坐标系
  9. 程序员的进阶课-架构师之路(3)-线性表
  10. windows 7 引导过程概述
  11. 一个虚拟社交公司的融资历程
  12. ERP系统-库存子系统-销售/领料出库单
  13. 第四周作业-多线程编程
  14. Spring中Resource接口详解
  15. 小喵的VUE项目搭建(一)
  16. 斯德哥尔摩的照片七:城市漫步(下)
  17. html/template
  18. AWS Boto3 使用介绍(一)
  19. 俩台虚拟机,一台有网,一台没网
  20. 多线程实例之售卖车票

热门文章

  1. 自定义异常的两种方式
  2. 多因子策略介绍与应用
  3. 输出匹配项:grep
  4. 1049. Counting Ones
  5. poj2406 Power Strings 模式匹配算法KMP变形
  6. Android 中的长度单位详解 dp、sp、px、in、pt、mm 转载
  7. Everything 中文绿色版
  8. java编程思想--协变返回类型
  9. 打造最便捷的异步分页技术(提供下载)
  10. CentOS - 安装mysql