Sqlite数据库相关操作

简介: 1  数据库思路 (1)可把表中的字段用javabean来实现 (2)在数据库和ContentProvider结合使用时,不采用此处SQLiteDatabase的execSQL()和rawQuery()方法来实现数据的增删改查而是使用了SQLiteDatabase的自带的update(),delete(),query()等方法.

1  数据库思路
(1)可把表中的字段用javabean来实现
(2)在数据库和ContentProvider结合使用时,不采用此处SQLiteDatabase的execSQL()和rawQuery()方法来实现数据的增删改查而是使用了SQLiteDatabase的自带的update(),delete(),query()等方法.因为两者的参数基本一致,直接从ContentProvider传递给这些自带方法即可

2  SQLiteOpenHelper的引入
我们在编写数据库应用软件时,需要考虑这样的问题:因为软件可能会安装在很多用户的手机上.
如果应用使用到了SQLite数据库,我们必须在用户初次使用软件时创建出应用使用到的数据库表结构及添加一些初始化记录,另外在软件升级的时候,也需要对数据表结构进行更新。
那么,我们如何才能实现在用户初次使用或升级软件时自动在用户的手机上创建出应用需要的数据库表呢?总不能让我们在每个需要安装此软件的手机上通过手工方式创建数据库表吧?(这也是为什么它叫……OpenHelper的原因)
于是可以复写SQLiteOpenHelper的onCreate()和onUpgrade()方法以在创建数据库和数据库版本发生变化时自动调用。

3  DataBaseOpenHelper 的使用
DataBaseOpenHelper的实例dataBaseOpenHelper可以dataBaseOpenHelper.getWritableDatabase()和dataBaseOpenHelper.getWritableDatabase()的方式返回数据库SQLiteDatabase的实例db。这两种方式有什么区别呢?查看源代码可知:getReadableDatabase在不出错的时候其实际返回的是getWritableDatabase.那么什么时候会出错呢?
数据库的磁盘空间满了,数据库此时只可以读而不可以写,所以不可以用读写(可以进行读和写操作)方式打开数据库。这个时候就会报错;所以只可以用只读方式打开数据库。
因此在出错的时候,返回的是getReadableDatabase()!!!

4  数据库的增删改查操作
利用SQLiteDatabase的实例db进行数据库的增删改查操作.其中db.execSQL()来执行更改行为的语句;db.rawQuery()来执行查询语句
注意:
(1)在SQL语句中最好使用占位符,这样来提高SQL语句的安全性
(2)public void execSQL (String sql, Object[] bindArgs)第二个参数是Object数组
(3)public Cursor rawQuery (String sql, String[] selectionArgs)第二个参数是String数组

增加示例:
db.execSQL("insert into person (name,phone) values(?,?)",new Object[]{person.getName(),person.getPhone()});

更新示例:
public void update(Person person){
   SQLiteDatabase db=openHelper.getWritableDatabase();
   db.execSQL("update person set name=?,phone=? where personid=?",new Object[]{person.getName(),person.getPhone(),person.getId()});
 }


删除示例:
public void delete(int i){
        SQLiteDatabase db=openHelper.getWritableDatabase();
          db.execSQL("delete from person where personid=?",new Object[]{String.valueOf(i)});
 } 

查找示例:

public Person find(int personId){
		SQLiteDatabase db=openHelper.getWritableDatabase();
		Cursor cursor=db.rawQuery("select * from person where personid=?", new String[]{String.valueOf(i)});
		while(cursor.moveToFirst()){
			int personid=cursor.getInt(cursor.getColumnIndex("personid"));
			String name=cursor.getString(cursor.getColumnIndex("name"));
			String phone=cursor.getString(cursor.getColumnIndex("phone"));
			return new Person(personid, name, phone);
		}
		cursor.close();
		return null;
	}



注意:
(1)db.rawQuery()的结果是一个cursor结果集.其指针最开始时候执行指向结果集的上方,即第一条纪录的前面
(2)取值操作:cursor.get具体类型(参数为某列的名称的索引值)
(3)最后关闭cursor

统计示例:

public int count(){
		SQLiteDatabase db=openHelper.getReadableDatabase(); 
		Cursor cursor=db.rawQuery("select count(*) from person", null);
		int i=0;
		while(cursor.moveToFirst()){
		     i=cursor.getInt(0);
		     break;
		}
		return i;
	}

 

分页示例: 

public List<Person> page(int offset,int resuletNumber){
		SQLiteDatabase db=openHelper.getWritableDatabase();
		ArrayList<Person> persons=new ArrayList<Person>();	
		Person person;
		Cursor  cursor=db.rawQuery("select * from person limit ?,?",new String []{String.valueOf(offset),String.valueOf(resuletNumber)});
		while(cursor.moveToNext()){
			int personid=cursor.getInt(cursor.getColumnIndex("personid"));
			String name=cursor.getString(cursor.getColumnIndex("name"));
			String phone=cursor.getString(cursor.getColumnIndex("phone"));
			person=new Person(personid, name, phone);
			persons.add(person);
		}
		return persons;
	  }


5 数据库事务

public void payment(){
		SQLiteDatabase db = dbOpenHelper.getWritableDatabase();
		db.beginTransaction();
		try{
			db.execSQL("update person set amount=amount-10 where personid=1");
			db.execSQL("update person set amount=amount+10 where personid=2");
			db.setTransactionSuccessful();//设置事务的标志为成功
		}finally{
			db.endTransaction();//结束事务,默认情况下是回滚事务
		}
	}


结束事务有两种:提交事务和回滚事务。默认情况是回滚事务!!!
事务是否提交是由事务的标志来决定的,如果事务的标志位失败(false),那么就回滚事务,否则(true)提交事务。
所以默认情况下事务的标志为失败(false),事务回滚.
为什么要把结束事务放在finally里面?
若不这样当事务发生异常,便不会往下执行了,数据库要等到一个超时后才会结束事务而影响性能,所以在finally里将其结束

相关文章
|
JavaScript 关系型数据库 MySQL
❤Nodejs 第六章(操作本地数据库前置知识优化)
【4月更文挑战第6天】本文介绍了Node.js操作本地数据库的前置配置和优化,包括处理接口跨域的CORS中间件,以及解析请求数据的body-parser、cookie-parser和multer。还讲解了与MySQL数据库交互的两种方式:`createPool`(适用于高并发,通过连接池管理连接)和`createConnection`(适用于低负载)。
22 0
|
7天前
|
DataWorks 关系型数据库 调度
DataWorks操作报错合集之DataWorks 数据库同步任务中,如果遇到表情符报错的现象,怎么处理
DataWorks是阿里云提供的一站式大数据开发与治理平台,支持数据集成、数据开发、数据服务、数据质量管理、数据安全管理等全流程数据处理。在使用DataWorks过程中,可能会遇到各种操作报错。以下是一些常见的报错情况及其可能的原因和解决方法。
18 0
|
7天前
|
DataWorks Oracle 关系型数据库
DataWorks操作报错合集之尝试从Oracle数据库同步数据到TDSQL的PG版本,并遇到了与RAW字段相关的语法错误,该怎么处理
DataWorks是阿里云提供的一站式大数据开发与治理平台,支持数据集成、数据开发、数据服务、数据质量管理、数据安全管理等全流程数据处理。在使用DataWorks过程中,可能会遇到各种操作报错。以下是一些常见的报错情况及其可能的原因和解决方法。
26 0
|
1天前
|
SQL JSON 关系型数据库
[UE虚幻引擎插件DTPostgreSQL] PostgreSQL Connector 使用蓝图连接操作 PostgreSQL 数据库说明
本插件主要是支持在UE蓝图中连接和操作PostgreSQL 数据库。
|
5天前
|
Java 关系型数据库 数据库连接
【C 言专栏】C 语言与数据库的连接与操作
【5月更文挑战第2天】本文探讨了C语言如何连接和操作数据库,介绍了数据库连接的基本原理,如通过ODBC、JDBC或原生接口与数据库交互。文章详细阐述了使用ODBC连接的步骤,并列举了C语言在数据库操作中的常见任务,强调了错误处理、数据类型匹配和性能优化的重要性。通过实际案例,展示了在学生信息管理系统中应用C语言与数据库交互的过程。本文旨在帮助读者更好地理解和应用C语言进行数据库管理。
|
7天前
|
XML Java 数据库连接
Springboot整合mybatisPlus操作数据库
MyBatis-Plus是MyBatis的增强工具,简化开发、提高效率。它提供官网文档,便于集成到SpringBoot项目中。集成步骤包括添加mybatis-plus-boot-starter和数据库驱动依赖,配置数据源,扫描Mapper类包。Mapper接口继承BaseMapper即可使用基本的CRUD操作。示例代码展示了Service层的增删改查实现。MyBatisPlus还支持逻辑删除、自动填充等功能,同时可与Mybatis XML配合使用,通过调整配置指定XML映射文件位置。
|
7天前
|
关系型数据库 MySQL Go
数据库的事务操作
数据库的事务操作
|
7天前
|
关系型数据库 MySQL Go
数据库的事务操作 | 青训营
数据库的事务操作 | 青训营
|
7天前
|
SQL 分布式计算 DataWorks
DataWorks操作报错合集之在DataWorks数据集成中,但是预览ODPS源数据库为空,是什么导致的
DataWorks是阿里云提供的一站式大数据开发与治理平台,支持数据集成、数据开发、数据服务、数据质量管理、数据安全管理等全流程数据处理。在使用DataWorks过程中,可能会遇到各种操作报错。以下是一些常见的报错情况及其可能的原因和解决方法。
21 0
|
7天前
|
安全 关系型数据库 MySQL
【PHP开发专栏】PHP PDO与MySQLi操作数据库
【4月更文挑战第30天】PHP数据库交互的核心是PDO和MySQLi。PDO提供数据访问抽象层,支持多种数据库,强调安全和灵活性;MySQLi则专为MySQL设计,有面向对象和过程化接口。两者都支持预处理语句,防止SQL注入。选择取决于项目需求,如可移植性、特定功能和API偏好。了解其使用有助于编写安全高效的代码。