欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

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

程序员文章站 2023-12-20 18:26:28
本文实例分析了android编程操作嵌入式关系型sqlite数据库的方法。分享给大家供大家参考,具体如下: sqlite特点 1.android平台中嵌入了一个关系型数...

本文实例分析了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程序设计有所帮助。

上一篇:

下一篇: