SQLite数据库

  • 轻量级关系型数据库
  • 创建数据库需要使用的api:SQLiteOpenHelper
    • 必须定义一个构造方法:

      public MyOpenHelper(Context context, String name, CursorFactory factory, int version){}

      //arg1:数据库文件的名字

      //arg2:游标工厂

      //arg3:数据库版本
    • 数据库被创建时会调用:onCreate方法
    • 数据库升级时会调用:onUpgrade方法

创建数据库

  1. //创建OpenHelper对象
  2. MyOpenHelper oh = new MyOpenHelper(getContext(), "person.db", null, 1);
  3. //获得数据库对象,如果数据库不存在,先创建数据库,后获得,如果存在,则直接获得
  4. SQLiteDatabase db = oh.getWritableDatabase();
  5. * getWritableDatabase():打开可读写的数据库
  6. * getReadableDatabase():在磁盘空间不足时打开只读数据库,否则打开可读写数据库
  7. * 在创建数据库时创建表
  8. public void onCreate(SQLiteDatabase db) {
  9. db.execSQL("create table person (_id integer primary key autoincrement, name char(10), phone char(20), money integer(20))");
  10. }

数据库的增删改查

SQL语句

  1. * insert into person (name, phone, money) values ('张三', '159874611', 2000);
  2. * delete from person where name = '李四' and _id = 4;
  3. * update person set money = 6000 where name = '李四';
  4. * select name, phone from person where name = '张三';

执行SQL语句实现增删改查

  1. //插入
  2. db.execSQL("insert into person (name, phone, money) values (?, ?, ?);", new Object[]{"张三", 15987461, 75000});
  3. //查找
  4. Cursor cs = db.rawQuery("select _id, name, money from person where name = ?;", new String[]{"张三"});
  5. * 测试方法执行前会调用此方法
  6. protected void setUp() throws Exception {
  7. super.setUp();
  8. // 获取虚拟上下文对象
  9. oh = new MyOpenHelper(getContext(), "people.db", null, 1);
  10. }
  11. ###使用api实现增删改查
  12. * 插入
  13. //以键值对的形式保存要存入数据库的数据
  14. ContentValues cv = new ContentValues();
  15. cv.put("name", "刘能");
  16. cv.put("phone", 1651646);
  17. cv.put("money", 3500);
  18. //返回值是改行的主键,如果出错返回-1
  19. long i = db.insert("person", null, cv);
  • 删除

    1. //返回值是删除的行数
    2. int i = db.delete("person", "_id = ? and name = ?", new String[]{"1", "张三"});
  • 修改

    1. ContentValues cv = new ContentValues();
    2. cv.put("money", 25000);
    3. int i = db.update("person", cv, "name = ?", new String[]{"赵四"});
  • 查询

    1. //arg1:要查询的字段
    2. //arg2:查询条件
    3. //arg3:填充查询条件的占位符
    4. Cursor cs = db.query("person", new String[]{"name", "money"}, "name = ?", new String[]{"张三"}, null, null, null);
    5. while(cs.moveToNext()){
    6. // 获取指定列的索引值
    7. String name = cs.getString(cs.getColumnIndex("name"));
    8. String money = cs.getString(cs.getColumnIndex("money"));
    9. System.out.println(name + ";" + money);
    10. }

事务

  • 保证多条SQL语句要么同时成功,要么同时失败

  • 最常见案例:银行转账

  • 事务api

    1. try {
    2. //开启事务
    3. db.beginTransaction();
    4. ...........
    5. //设置事务执行成功
    6. db.setTransactionSuccessful();
    7. } finally{
    8. //关闭事务
    9. //如果此时已经设置事务执行成功,则sql语句生效,否则不生效
    10. db.endTransaction();
    11. }

代码展示:

  1. public class TestCase extends AndroidTestCase {
  2. //此时测试框架还没有初始化完毕,没有虚拟上下文对象
  3. //private MyOpenHelper oh = new MyOpenHelper(getContext(), "people.db", null, 1);
  4. private MyOpenHelper oh;
  5. private SQLiteDatabase db;
  6. public void test(){
  7. //getContext():获取一个虚拟的上下文
  8. MyOpenHelper oh = new MyOpenHelper(getContext(), "people.db", null, 1);
  9. //如果数据库不存在,先创建数据库,再获取可读可写的数据库对象,如果数据库存在,就直接打开
  10. SQLiteDatabase db = oh.getWritableDatabase();
  11. //如果存储空间满了,那么返回只读数据库对象
  12. //SQLiteDatabase db = oh.getReadableDatabase();
  13. }
  14. //测试框架初始化完毕之后,在测试方法执行之前,此方法调用
  15. @Override
  16. protected void setUp() throws Exception {
  17. super.setUp();
  18. oh = new MyOpenHelper(getContext(), "people.db", null, 1);
  19. db = oh.getWritableDatabase();
  20. }
  21. //测试方法执行完毕之后,此方法调用
  22. @Override
  23. protected void tearDown() throws Exception {
  24. // TODO Auto-generated method stub
  25. super.tearDown();
  26. db.close();
  27. }
  28. public void insert(){
  29. db.execSQL("insert into person (name, salary, phone)values(?, ?, ?)", new Object[]{"小志的老婆[1]", "13000", 138438});
  30. db.execSQL("insert into person (name, salary, phone)values(?, ?, ?)", new Object[]{"小志的儿子", 14000, "13888"});
  31. db.execSQL("insert into person (name, salary, phone)values(?, ?, ?)", new Object[]{"小志", 14000, "13888"});
  32. }
  33. public void delete(){
  34. db.execSQL("delete from person where name = ?", new Object[]{"小志"});
  35. }
  36. public void update(){
  37. db.execSQL("update person set phone = ? where name = ?", new Object[]{186666, "小志的儿子"});
  38. }
  39. public void select(){
  40. Cursor cursor = db.rawQuery("select name, salary from person", null);
  41. while(cursor.moveToNext()){
  42. //通过列索引获取列的值
  43. String name = cursor.getString(cursor.getColumnIndex("name"));
  44. String salary = cursor.getString(1);
  45. System.out.println(name + ";" + salary);
  46. }
  47. }
  48. public void insertApi(){
  49. //把要插入的数据全部封装至ContentValues对象
  50. ContentValues values = new ContentValues();
  51. values.put("name", "游天龙");
  52. values.put("phone", "15999");
  53. values.put("salary", 16000);
  54. db.insert("person", null, values);
  55. }
  56. public void deleteApi(){
  57. int i = db.delete("person", "name = ? and _id = ?", new String[]{"小志的儿子", "3"});
  58. System.out.println(i);
  59. }
  60. public void updateApi(){
  61. ContentValues values = new ContentValues();
  62. values.put("salary", 26000);
  63. int i = db.update("person", values, "name = ?", new String[]{"游天龙"});
  64. System.out.println(i);
  65. }
  66. public void selectApi(){
  67. Cursor cursor = db.query("person", null, null, null, null, null, null, null);
  68. while(cursor.moveToNext()){
  69. String name = cursor.getString(cursor.getColumnIndex("name"));
  70. String phone = cursor.getString(cursor.getColumnIndex("phone"));
  71. String salary = cursor.getString(cursor.getColumnIndex("salary"));
  72. System.out.println(name + ";" + phone + ";" + salary);
  73. }
  74. }
  75. public void transaction(){
  76. try{
  77. //开启事务
  78. db.beginTransaction();
  79. ContentValues values = new ContentValues();
  80. values.put("salary", 12000);
  81. db.update("person", values, "name = ?", new String[]{"小志"});
  82. values.clear();
  83. values.put("salary", 16000);
  84. db.update("person", values, "name = ?", new String[]{"小志的儿子"});
  85. int i = 3/1;
  86. //设置 事务执行成功
  87. db.setTransactionSuccessful();
  88. }
  89. finally{
  90. //关闭事务,同时提交,如果已经设置事务执行成功,那么sql语句就生效了,反之,sql语句回滚
  91. db.endTransaction();
  92. }
  93. }
  94. }

Android first---SQLite的更多相关文章

  1. Android之SQLite数据存储

    一.SQLite保存数据介绍 将数据库保存在数据库对于重复或者结构化数据(比如契约信息)而言是理想之选.SQL数据库的主要原则之一是架构:数据库如何组织正式声明.架构体现于用于创建数据库的SQL语句. ...

  2. android安卓Sqlite数据库实现用户登录注册

    看了很多别人写的安卓SQlite数据的操作代码,一点也不通俗易懂,我觉得我写的不错,而且安卓项目也用上了,所以在博客园里保存分享一下!建立一个类 并继承SQLiteOpenHelper public ...

  3. Android中SQLite数据库小计

    2016-03-16 Android数据库支持 本文节选并翻译<Enterprise Android - Programing Android Database Applications for ...

  4. android 对sqlite数据库的增删改查等各种操作

    转载:http://blog.csdn.net/vrix/article/details/6717090 package com.sqlite.main; import java.io.File; i ...

  5. Android学习---SQLite数据库的增删改查和事务(transaction)调用

    上一篇文章中介绍了手工拼写sql语句进行数据库的CRUD操作,本文将介绍调用sqlite内置的方法实现CRUD操作,其实质也是通过拼写sql语句. 首先,创建一个新的android项目: 其次,查看代 ...

  6. android数据库SQLite的设计模式

    Dao设计模式可能是使用最多的数据库的设计模式其基本思路是将数据库操作的代码 与设计代码分离以便于维护和升级.具体的实现方法是使用包,然后在设计代码中调 用数据库的操作代码,dao设计模式需要创建5个 ...

  7. Android使用SQLite数据库(2)

    打开SQLite数据库,首先要建立一个DatabaseHelper类的实例,然后,再获得数据库: DatabaseHelper mDBH; SQLiteDatabase db; mDBH = new ...

  8. 我的Android六章:Android中SQLite数据库操作

    今天学习的内容是Android中的SQLite数据库操作,在讲解这个内容之前小编在前面有一篇博客也是讲解了SQLite数据库的操作,而那篇博客的讲解是讲述了 如何在Window中通过DOM来操作数据库 ...

  9. Android和SQLite版本对应关系

    Android和SQLite版本对应关系 今天Xamarin群有人问到Android和SQLite版本如何对应,顺手查了一下,贴出来. SQLite 3.8.4.3: • 21-5.0-Lollipo ...

  10. Android中SQLite应用详解

    上次我向大家介绍了SQLite的基本信息和使用过程,相信朋友们对SQLite已经有所了解了,那今天呢,我就和大家分享一下在Android中如何使用SQLite. 现在的主流移动设备像Android.i ...

随机推荐

  1. web前端开发学习路径图

    第一阶段 WEB前端工程师课程 HTML语句,HTML页面结构.css语法.style属性.link和style标签.id属性.等HTML语句中的相关属性: 通过Dreamweaver制作出跨越平台限 ...

  2. Sublime、Webstorm等在APICloud平台上全面支持WiFi真机同步和实时预览功能

    APICloud工具插件包括APICloud Studio.Sublime Text和Webstorm全面为开发者提供iOS和Android平台真机同步调试功能,不仅可以通过USB方式进行APP真机同 ...

  3. [译]何时使用 Parallel.ForEach,何时使用 PLINQ

    原作者: Pamela Vagata, Parallel Computing Platform Group, Microsoft Corporation 原文pdf:http://download.c ...

  4. 如何使用抓包工具fiddler对app进行接口分析

    如果你还不知道什么是抓包,点我 如果你还不知道什么是http,点它 如果你想知道什么是fiddler 什么是接口测试 正文来了.安装fiddler后,打开界面,点击tools,找到如图的options ...

  5. linux定时任务的设置 crontab 配置指南

    为当前用户创建cron服务 1.  键入 crontab  -e 编辑crontab服务文件 例如 文件内容如下: */2 * * * * /bin/sh /home/admin/jiaoben/bu ...

  6. js 复选框 全选都选 如果某一个子复选框没选中 则全选按钮不选中

    <!DOCTYPE HTML> <html> <head> <meta charset=UTF-8> <title>js 复选框 全选都选 ...

  7. node 实现视频播放后端,前端使用video标签,视频文件视频mp4

    var fs = require("fs"), http = require("http"), url = require("url"), ...

  8. linux格式批量转换为dos格式

    注:写的只是基本知识,望高手勿喷,写这个不是为了炫耀,只是为了方便其他人,仅此而已. 一:脚本功能: 批量处理目录以及子目录下的文件格式问题,能够轻易的将linux格式转换为dos格式. 二:写此博客 ...

  9. WebSQL 查询工具

    最近在写 WebSQL ,每次都在浏览器控制台执行 SQL 太费劲了,并且脑子不好使,总是忘记上次初始化的数据库是什么,所以写了一个特别简单的 WebSQL 可视化工具,说工具有点大了,就是为了方便, ...

  10. java String 详解

    1.java语言的字符串序列是通过字符串类实现的.java提供了3个字符串类:String类.StringBuilder类和StringBuffer类.String类是不变字符串,StringBuff ...