Android编程操作嵌入式关系型SQLite数据库实例详解

本文实例分析了Android编程操作嵌入式关系型SQLite数据库的方法。分享给大家供大家参考,具体如下:

SQLite特点

1.Android平台中嵌入了一个关系型数据库SQLite,和其他数据库不同的是SQLite存储数据时不区分类型

例如一个字段声明为Integer类型,我们也可以将一个字符串存入,一个字段声明为布尔型,我们也可以存入浮点数。

除非是主键被定义为Integer,这时只能存储64位整数

2.创建数据库的表时可以不指定数据类型,例如:

代码如下:

CREATE TABLEperson(id INTEGER PRIMARY KEY, name)

3.SQLite支持大部分标准SQL语句,增删改查语句都是通用的,分页查询语句和MySQL相同

SELECT * FROMperson LIMIT 20 OFFSET 10
SELECT * FROMperson LIMIT 20,10

创建数据库

1.定义类继承SQLiteOpenHelper
2.声明构造函数,4个参数
3.重写onCreate()方法
4. 重写upGrade()方法

示例:

package cn.itcast.sqlite;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
public class DBOpenHelper extends SQLiteOpenHelper {
  /**
   * 创建OpenHelper
   * @param context 上下文
   * @param name 数据库名
   * @param factory 游标工厂
   * @param version 数据库版本, 不要设置为0, 如果为0则会每次都创建数据库
   */
  public DBOpenHelper(Context context, String name, CursorFactory factory, int version) {
    super(context, name, factory, version);
  }
  /**
   * 当数据库第一次创建的时候被调用
   */
  public void onCreate(SQLiteDatabase db) {
    db.execSQL("CREATE TABLE person(id INTEGER PRIMARY KEY AUTOINCREMENT, name)");
  }
  /**
   * 当数据库版本发生改变的时候被调用
   */
  public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    db.execSQL("ALTER TABLE person ADD balance");
  }
}
public void testCreateDB() {
  DBOpenHelper helper = new DBOpenHelper(getContext(), "itcast.db", null, 2);
  helper.getWritableDatabase(); // 创建数据库
}

CRUD操作

1.和JDBC访问数据库不同,操作SQLite数据库无需加载驱动,不用获取连接,直接可以使用

获取SQLiteDatabase对象之后通过该对象直接可以执行SQL语句:

SQLiteDatabase.execSQL()
SQLiteDatabase.rawQuery()

2.getReadableDatabase()和getWritableDatabase()的区别

查看源代码后我们发现getReadableDatabase()在通常情况下返回的就是getWritableDatabase()拿到的数据库只有在抛出异常的时候才会以只读方式打开

3.数据库对象缓存

getWritableDatabase()方法最后会使用一个成员变量记住这个数据库对象,下次打开时判断是否重用

4.SQLiteDatabase封装了insert()、delete()、update()、query()四个方法也可以对数据库进行操作

这些方法封装了部分SQL语句,通过参数进行拼接

执行crud操作有两种方式,第一种方式自己写sql语句执行操作,第二种方式是使用SQLiteDatabase类调用响应的方法执行操作

execSQL()方法可以执行insert、delete、update和CREATETABLE之类有更改行为的SQL语句; rawQuery()方法用于执行select语句。

第一种方式示例:

package cn.itcast.sqlite.service;
import java.util.ArrayList;
import java.util.List;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import cn.itcast.sqlite.DBOpenHelper;
import cn.itcast.sqlite.domain.Person;
public class SQLPersonService {
  private DBOpenHelper helper;
  public SQLPersonService(Context context) {
    helper = new DBOpenHelper(context, "itcast.db", null, 2);//初始化数据库
  }
  /**
   * 插入一个Person
   * @param p 要插入的Person
   */
  public void insert(Person p) {
    SQLiteDatabase db = helper.getWritableDatabase(); //获取到数据库
    db.execSQL("INSERT INTO person(name,phone,balance) VALUES(?,?)", new Object[] { p.getName(), p.getPhone() });
    db.close();
  }
  /**
   * 根据ID删除
   * @param id 要删除的PERSON的ID
   */
  public void delete(Integer id) {
    SQLiteDatabase db = helper.getWritableDatabase();
    db.execSQL("DELETE FROM person WHERE id=?", new Object[] { id });
    db.close();
  }
  /**
   * 更新Person
   * @param p 要更新的Person
   */
  public void update(Person p) {
    SQLiteDatabase db = helper.getWritableDatabase();
    db.execSQL("UPDATE person SET name=?,phone=?,balance=? WHERE id=?", new Object[] { p.getName(), p.getPhone(), p.getBalance(), p.getId() });
    db.close();
  }
  /**
   * 根据ID查找
   * @param id 要查的ID
   * @return 对应的对象, 如果未找到返回null
   */
  public Person find(Integer id) {
    SQLiteDatabase db = helper.getReadableDatabase();
    Cursor cursor = db.rawQuery("SELECT name,phone,balance FROM person WHERE id=?", new String[] { id.toString() });
    Person p = null;
    if (cursor.moveToNext()) {
      String name = cursor.getString(cursor.getColumnIndex("name"));
      String phone = cursor.getString(1);
      Integer balance = cursor.getInt(2);
      p = new Person(id, name, phone, balance);
    }
    cursor.close();
    db.close();
    return p;
  }
  /**
   * 查询所有Person对象
   * @return Person对象集合, 如未找到, 返回一个size()为0的List
   */
  public List<Person> findAll() {
    SQLiteDatabase db = helper.getReadableDatabase();
    Cursor cursor = db.rawQuery("SELECT id,name,phone,balance FROM person", null);
    List<Person> persons = new ArrayList<Person>();
    while (cursor.moveToNext()) {
      Integer id = cursor.getInt(0);
      String name = cursor.getString(1);
      String phone = cursor.getString(2);
      Integer balance = cursor.getInt(3);
      persons.add(new Person(id, name, phone, balance));
    }
    cursor.close();
    db.close();
    return persons;
  }
  /**
   * 查询某一页数据
   * @param page 页码
   * @param size 每页记录数
   * @return
   */
  public List<Person> findPage(int page, int size) {
    SQLiteDatabase db = helper.getReadableDatabase();
    Cursor cursor = db.rawQuery("SELECT id,name,phone,balance FROM person LIMIT ?,?" //
        , new String[] { String.valueOf((page - 1) * size), String.valueOf(size) });
    List<Person> persons = new ArrayList<Person>();
    while (cursor.moveToNext()) {
      Integer id = cursor.getInt(0);
      String name = cursor.getString(1);
      String phone = cursor.getString(2);
      Integer balance = cursor.getInt(3);
      persons.add(new Person(id, name, phone, balance));
    }
    cursor.close();
    db.close();
    return persons;
  }
  /**
   * 获取记录数
   * @return 记录数
   */
  public int getCount() {
    SQLiteDatabase db = helper.getReadableDatabase();
    Cursor cursor = db.rawQuery("SELECT COUNT(*) FROM person", null);
    cursor.moveToNext();
    return cursor.getInt(0);
  }
}

第二种方式示例:

/**
 * 插入一个Person
 * @param p 要插入的Person
 */
public void insert(Person p) {
  SQLiteDatabase db = helper.getWritableDatabase();
  ContentValues values = new ContentValues();
  values.put("name", p.getName());
  values.put("phone", p.getPhone());
  values.put("balance", p.getBalance());
  // 第一个参数是表名, 第二个参数是如果要插入一条空记录时指定的某一列的名字, 第三个参数是数据
  db.insert("person", null, values);
  db.close();
}
/**
 * 根据ID删除
 * @param id 要删除的PERSON的ID
 */
public void delete(Integer id) {
  SQLiteDatabase db = helper.getWritableDatabase();
  db.delete("person", "id=?", new String[] { id.toString() });
  db.close();
}
/**
 * 更新Person
 * @param p 要更新的Person
 */
public void update(Person p) {
  SQLiteDatabase db = helper.getWritableDatabase();
  ContentValues values = new ContentValues();
  values.put("id", p.getId());
  values.put("name", p.getName());
  values.put("phone", p.getPhone());
  values.put("balance", p.getBalance());
  db.update("person", values, "id=?", new String[] { p.getId().toString() });
  db.close();
}
/**
 * 根据ID查找
 * @param id 要查的ID
 * @return 对应的对象, 如果未找到返回null
 */
public Person find(Integer id) {
  SQLiteDatabase db = helper.getReadableDatabase();
  Cursor cursor = db.query("person", new String[] { "name", "phone", "balance" }, "id=?", new String[] { id.toString() }, null, null, null);
  Person p = null;
  if (cursor.moveToNext()) {
    String name = cursor.getString(cursor.getColumnIndex("name"));
    String phone = cursor.getString(1);
    Integer balance = cursor.getInt(2);
    p = new Person(id, name, phone, balance);
  }
  cursor.close();
  db.close();
  return p;
}
/**
 * 查询所有Person对象
 * @return Person对象集合, 如未找到, 返回一个size()为0的List
 */
public List<Person> findAll() {
  SQLiteDatabase db = helper.getReadableDatabase();
  Cursor cursor = db.query("person", new String[] { "id", "name", "phone", "balance" }, null, null, null, null, "id desc");
  List<Person> persons = new ArrayList<Person>();
  while (cursor.moveToNext()) {
    Integer id = cursor.getInt(0);
    String name = cursor.getString(1);
    String phone = cursor.getString(2);
    Integer balance = cursor.getInt(3);
    persons.add(new Person(id, name, phone, balance));
  }
  cursor.close();
  db.close();
  return persons;
}
/**
 * 查询某一页数据
 * @param page 页码
 * @param size 每页记录数
 * @return
 */
public List<Person> findPage(int page, int size) {
  SQLiteDatabase db = helper.getReadableDatabase();
  Cursor cursor = db.query( //
      "person", new String[] { "id", "name", "phone", "balance" }, null, null, null, null, null, (page - 1) * size + "," + size);
  List<Person> persons = new ArrayList<Person>();
  while (cursor.moveToNext()) {
    Integer id = cursor.getInt(0);
    String name = cursor.getString(1);
    String phone = cursor.getString(2);
    Integer balance = cursor.getInt(3);
    persons.add(new Person(id, name, phone, balance));
  }
  cursor.close();
  db.close();
  return persons;
}
/**
 * 获取记录数
 * @return 记录数
 */
public int getCount() {
  SQLiteDatabase db = helper.getReadableDatabase();
  Cursor cursor = db.query( //
      "person", new String[] { "COUNT(*)" }, null, null, null, null, null);
  cursor.moveToNext();
  return cursor.getInt(0);
}

事务管理

1.使用在SQLite数据库时可以使用SQLiteDatabase类中定义的相关方法控制事务

beginTransaction() 开启事务
setTransactionSuccessful() 设置事务成功标记
endTransaction() 结束事务

2.endTransaction()需要放在finally中执行,否则事务只有到超时的时候才自动结束,会降低数据库并发效率

示例:

public void remit(int from, int to, int amount) {
  SQLiteDatabase db = helper.getWritableDatabase();
  // 开启事务
  try {
    db.beginTransaction();
    db.execSQL("UPDATE person SET balance=balance-? WHERE id=?", new Object[] { amount, from });
    System.out.println(1 / 0);
    db.execSQL("UPDATE person SET balance=balance+? WHERE id=?", new Object[] { amount, to });
    // 设置事务标记
    db.setTransactionSuccessful();
  } finally {
    // 结束事务
    db.endTransaction();
  }
  db.close();
}

希望本文所述对大家Android程序设计有所帮助。

(0)

相关推荐

  • Linux du命令查看文件夹大小并按降序排列

    1. df -lh 2. du -s /usr/* | sort -rn 这是按字节排序 3. du -sh /usr/* | sort -rn 这是按兆(M)来排序 4.选出排在前面的10个 du -s /usr/* | sort -rn | head 5.选出排在后面的10个 du -s /usr/* | sort -rn | tail du -h –-max-depth=0 user du -sh –-max-depth=2 | more 总结du常用命令 du -h --max-dept

  • javascript中var的重要性分析

    本文实例分析了javascript中var的重要性.分享给大家供大家参考.具体分析如下: javascript 的 var 作用是声明变量. 一般情况下不写都不会出错,但有些情况如果不写,会有不同的结果.先看下面的示例: <div id="a"></div> <script type="text/javascript"> a = 1; alert(a); </script> 上面这个例子在FF Chrome执行不会有问

  • linux下使用 du查看某个文件或目录占用磁盘空间的大小方法

    du -ah --max-depth=1 这个是我想要的结果 a表示显示目录下所有的文件和文件夹(不含子目录),h表示以人类能看懂的方式,max-depth表示目录的深度. du命令用来查看目录或文件所占用磁盘空间的大小.常用选项组合为:du -sh 一.du的功能:`du` reports the amount of disk space used by the specified files and for each subdirectory (of directory arguments)

  • php中删除、清空session的方式总结

    session删除清空是很讲究了如果我们定义好可以清除指定变量否则不小心会把所有session都清除掉了,下面我们来看一些总结. 第一种方式:unset($_SESSION['xxx']) 删除单个session,unset($_SESSION['xxx']) 用来unregister一个已注册的session变量. 其作用和session_unregister()相同. session_unregister()在PHP5中已经废弃.  php 官方删除session方式 <?php // 初始

  • Android编程操作嵌入式关系型SQLite数据库实例详解

    本文实例分析了Android编程操作嵌入式关系型SQLite数据库的方法.分享给大家供大家参考,具体如下: SQLite特点 1.Android平台中嵌入了一个关系型数据库SQLite,和其他数据库不同的是SQLite存储数据时不区分类型 例如一个字段声明为Integer类型,我们也可以将一个字符串存入,一个字段声明为布尔型,我们也可以存入浮点数. 除非是主键被定义为Integer,这时只能存储64位整数 2.创建数据库的表时可以不指定数据类型,例如: 复制代码 代码如下: CREATE TAB

  • C#编程实现连接SQL SERVER数据库实例详解

    本文实例讲述了C#编程实现连接SQL SERVER数据库.分享给大家供大家参考,具体如下: 首先,在SQL SEVER里建立一个名为"Exercise"的数据库名,在该数据库下建立一张名为"lianxi"的表.好,现在开始写代码. 在FORM1里拖一个DATAGIRDVIEW用于显示表,在放一个BUTTON用于执行操作.加入命名空间 复制代码 代码如下: using system.data.sqlclient; private void button1_Click(

  • Android编程显示网络上的图片实例详解

    本文实例讲述了Android编程显示网络上的图片的方法.分享给大家供大家参考,具体如下: 在Android中显示网络上的图片,需要先根据url找到图片地址,然后把该图片转化成Java的InputStream,然后把该InputStream流转化成BitMap,BitMap可以直接显示在android中的ImageView里.这就是显示网络上图片的思路,实现起来很简单.下面让我们看一下实现起来的过程. 首先在AndroidManifest.xml中给程序加上访问Internet的权限: 复制代码

  • Android编程设置全屏的方法实例详解

    本文实例讲述了Android编程设置全屏的方法.分享给大家供大家参考,具体如下: 在实际的应用程序开发中,我们有时需要把 Activity 设置成全屏显示,一般情况下,可以通过两种方式来设置全屏显示效果.其一,通过在代码中可以设置,其二,通过manifest配置文件来设置全屏. 其一:在代码中设置(如下) package xiaohang.zhimeng; import android.app.Activity; import android.content.pm.ActivityInfo; i

  • Android编程之菜单的实现方法实例详解

    本文实例讲述了Android编程之菜单的实现方法.分享给大家供大家参考,具体如下: Options Menu 当用户按下menu button按钮时显示的菜单 Context Menu 当用户长久按住屏幕,被注册显示上下文菜单的视图时显示的菜单 Submenu    当用户按下一个菜单的某个选项时弹出的子菜单 以上三种菜单也就是我们经常所说的:选项菜单,上下文菜单和子菜单. 一.上下文菜单 1. 实现onCreateContextMenu即可创建该菜单 @Override public void

  • Android编程设计模式之工厂方法模式实例详解

    本文实例讲述了Android编程设计模式之工厂方法模式.分享给大家供大家参考,具体如下: 一.介绍 工厂方法模式(Factory Pattern),是创建型设计模式之一.工厂方法模式是一种结构简单的模式,其在我们平时开发中应用很广泛,也许你并不知道,但是你已经使用了无数次该模式了,如Android中的Activity里的各个生命周期方法,以onCreate方法为例,它就可以看作是一个工厂方法,我们在其中可以构造我们的View并通过setContentView返回给framework处理等,相关内

  • C++利用MySQL API连接和操作数据库实例详解

    1.C++连接和操作MySQL的方式 系列文章: MySQL 设计和命令行模式下建立详解 C++利用MySQL API连接和操作数据库实例详解 在Windows平台,我们可以使用ADO.ODBC或者MySQL API进行连接和操作.ADO (ActiveX Data Objects,ActiveX数据对象)是Microsoft提出的一个用于存取数据源的COM组件.它提供了程序语言和统一数据访问方式OLE DB的一个中间层,也就是Microsoft提出的应用程序接口(API)用以实现访问关系或非关

  • Android ListView中动态添加RaidoButton的实例详解

    Android ListView中动态添加RaidoButton的实例详解 这里讲解的内容是:从数据库中取得数据,将这些数据的value值赋值给Radiobutton的text属性,将这些数据的key值赋值给radiobutton的key值.同时实现点击一整行,更换radiobutton选择. XML代码:主要是添加一个ListView控件 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android&q

  • Android实现定时器的五种方法实例详解

    一.Timer Timer是Android直接启动定时器的类,TimerTask是一个子线程,方便处理一些比较复杂耗时的功能逻辑,经常与handler结合使用. 跟handler自身实现的定时器相比,Timer可以做一些复杂的处理,例如,需要对有大量对象的list进行排序,在TimerTask中执行不会阻塞子线程,常常与handler结合使用,在处理完复杂耗时的操作后,通过handler来更新UI界面. timer.schedule(task, delay,period); task: Time

  • PHP操作Redis常用命令的实例详解

    redis常用命令有: 1.连接操作命令: 2.持久化命令: 3.远程服务控制命令: 4.对value操作命令:5.string命令: 6.list命令: 7.set命令: 8.hash命令等等. Redis 常用命令 登录 redis-cli -p 5566 -a password 检查key是否存在 EXISTS key 搜索某关键字 KSYS *4 返回一个Key所影响的vsl的类型 TYPE key 下面通过代码看下PHP操作Redis命令,代码如下所示: //连接本地的 Redis 服

随机推荐