Android数据库SQLite

SQLite简介

在Android平台上,集成了一个嵌入式关系型数据库—SQLite,SQLite3支持 NULL、INTEGER、REAL(浮点数字)、TEXT(字符串文本)和BLOB(二进制对象)数据类型,也接受varchar(n)、char(n)、decimal(p,s) 等数据类型, SQLite最大的特点是你可以把各种类型的数据保存到任何字段中,而不用关心字段声明的数据类型是什么。例如:可以在Integer类型的字段中存放字符串,或者在布尔型字段中存放浮点数,或者在字符型字段中存放日期型值。 但有一种情况例外:定义为INTEGER PRIMARY KEY的字段只能存储64位整数, 当向这种字段保存除整数以外的数据时,将会产生错误。 另外,在编写CREATE TABLE 语句时,你可以省略跟在字段名称后面的数据类型信息,如下面语句你可以省略 name字段的类型信息:
CREATE TABLE person (personid integer primary key autoincrement, name varchar(20))
SQLite可以解析大部分标准SQL语句,如:
查询语句:select * from 表名 where 条件子句 group by 分组字句 having ... order by 排序子句
如:select * from person
       select * from person order by id desc
       select name from person group by name having count(*)>1
分页SQL与mysql类似,下面SQL语句获取5条记录,跳过前面3条记录
select * from Account limit 5 offset 3 或者 select * from Account limit 3,5
插入语句:insert into 表名(字段列表) values(值列表)。如: insert into person(name, age) values(‘传智’,3)
更新语句:update 表名 set 字段名=值 where 条件子句。如:update person set name=‘传智‘ where id=10
删除语句:delete from 表名 where 条件子句。如:delete from person  where id=10

获取添加记录后自增长的ID值:SELECT last_insert_rowid()

SQLite使用


SQLiteOpenHelper:管理数据库管理类

数据库创建

    在android应用程序中使用数据库的步骤:
    1、写一个自己的类DBHelper,继承SQLiteOpenHelper,重新写父类的构造方法、onCreate、onUpGrade:
//创建数据库

   onCreate是在数据库创建的时候调用的,主要用来初始化数据表结构和插入数据初始化的记录
   
onUpGrade是在数据库版本升级的时候调用的,主要用来改变表结构
   

    2、自定义一个dao类,自定义方法使用步骤1中的数据库进行增删改查

DBHelper helper = new DBHelper(this, "account.db", null, 1);

调用db = helper.getWritableDatabase(),得到数据对象

    3、生成自定义的dao类对象,调用相应方法即可

代码示例:

package com.itheima.db;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.database.sqlite.SQLiteOpenHelper;


public class MyOpenHelper extends SQLiteOpenHelper {

	public MyOpenHelper(Context context) {
		/**
		 * context 上下文
		 * name 数据库的名字
		 * factory    默认null 
		 * version 版本从1 开始  
		 */
		
		super(context, "person.db", null, 3);
		
	}

	/**
	 * 当数据库第一次创建的时候调用 
	 * 
	 * 适合做 表结构的初始化 
	 */
	@Override
	public void onCreate(SQLiteDatabase db) {

		System.out.println("onCreate");
		
		db.execSQL("create table info(_id integer primary key autoincrement,name varchar(20),phone varchar(20))");
		
		
	}

	/**
	 * 当数据库版本升级的时候调用
	 * 
	 * 适合做 表结构的更新操作 
	 */
	@Override
	public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

		System.out.println("onUpgrade");
		
	}

}


package com.itheima.db.dao;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;

import com.itheima.db.MyOpenHelper;

public class PersonDao {

	
	private SQLiteDatabase db; //数据库的对象 

	public PersonDao(Context context){
		//1想要往数据库里面插入一条数据  要拿到SQLiteDatabase 该对象里面有执行sql语句的方法 
				MyOpenHelper myOpenHelper = new MyOpenHelper(context);
				db = myOpenHelper.getWritableDatabase();
		
	}
	
	/**
	 * 数据库的增加方法
	 */
	public void add(String name,String phone){
		
		db.execSQL("insert into info(name,phone) values(?,?)", new Object[]{name,phone});
		
		
	}
	
	/**
	 * 数据库的删除方法  根据姓名去删除
	 */
	public void del(String name){
		// 根据name的值 进行删除  
		db.execSQL("delete from info where name=?", new Object[]{name});
		
		
	}
	
	
	/**
	 * 数据库的更新方法  
	 * 根据 姓名 去更新 新的电话号
	 */
	public void update(String newPhone,String name){
		//根据姓名进行更新 
		db.execSQL("update info set phone=?where name=?", new Object[]{newPhone,name});
		
	}
	
	/**
	 * 数据库查找方法方法
	 */
	public void find(){
		//注意  查找的时候 有返回值 所以我们 用rawQuery
		Cursor cursor = db.rawQuery("select * from info", null);
		//先判断一下 cursor 
		if (cursor!=null && cursor.getCount()>0) {
			//循环遍历 取出所有的数据 
			while(cursor.moveToNext()){
				String name = cursor.getString(cursor.getColumnIndex("name"));   //取出name  参数--columnName列名
				String phone = cursor.getString(cursor.getColumnIndex("phone"));  //取出 phone
				
				System.out.println("name"+name +"phone---"+phone); 
				
			}
			
		}
		//不要忘记 做 擦屁股的工作 
		cursor.close();
		db.close();//数据库关闭的话,再次访问会报异常,根据自己的需要选择关闭的时机
		
	}
	
	
	
}


数据库sql语句的增删改查

 创建表结构:create table person (id integer primary key autoincrement,name varchar(20));
 插入:insert into person (name)values("lisi");
 查询:select * from person;
 更新:update person set name='wangwu' where id=1
 删除:delete from person where id=1

sql语句方式增删改查

    在android应用程序中使用db.execSQL("sql",bindArgs)操作增删改查语句;
1、创建表结构
  public void create(View v){
db.execSQL("create table person (id integer primary key autoincrement,name varchar(20))");
Toast.makeText(this, "创建表结构成功", 0).show();
}

2、插入
public void insert(View v){
db.execSQL("insert into person (name)values(?)", new String[]{"lisi"});
Toast.makeText(this, "插入数据成功", 0).show();
}
3、查询:db.rawQuery,cursor类似于一个指针,当cursor指向一条记录时,就把当前记录的数据封装到cursor中,直接从cursor取数据
public void query(View v){
 Cursor cursor = db.rawQuery("select * from person",null);
 //移动游标,返回值为true表示没有移动到数据集的最后(还有数据),如果为false已经数据集的最后(没有数据了)
 while(cursor.moveToNext()){
int id = cursor.getInt(0);
String name = cursor.getString(1);
System.out.println("id="+id+"; name="+name);
 }
 Toast.makeText(this, "查询数据成功", 0).show();
}
4、更新
 public void update(View v){
db.execSQL("update person set name='wangwu' where id=?", new Object[]{1});
Toast.makeText(this, "更新数据成功", 0).show();
}
4、删除
 public void delete(View v){
db.execSQL("delete from person where id=?", new Object[]{1});
Toast.makeText(this, "删除数据成功", 0).show();
}

函数方式增删改查

  使用google提供的另外一种方式操作数据库表:
1、插入数据
public void add(String name, String phone){
ContentValues values = new ContentValues();
values.put("name", name);
values.put("phone", phone);
long r = db.insert("person", null,values);
if(r == -1)
{
Toast.makeText(Thiscontext, "插入失败", 1).show();
}
//db.execSQL("insert into person(name, phone) values(?,?);", new Object[]{name,phone});
}
  
  2、查询数据
public void query(View v){
  /**
  * table 表名
  * columns 查询的列
  * selection 查询条件"id=1"
  * selectionArgs 查询条件的值
  * String groupBy
  * String having
       * String orderBy
  * 
  */
 Cursor cursor = db.query("person", new String[]{"id","name" }, null, null, null, null, null);
 while(cursor.moveToNext()){
int id = cursor.getInt(0);
String name = cursor.getString(1);
System.out.println("id="+id+"; name="+name);
 }
 Toast.makeText(this, "查询数据成功", 0).show();
}
3 修改数据
  public void update(View v){
// db.execSQL("update person set name='wangwu' where id=?", new Object[]{1});
//用来封装要修改的列名和值
 ContentValues values = new ContentValues();
 values.put("name", "wangwu");
 db.update("person", values, "id=?", new String[]{"1"});
 Toast.makeText(this, "更新数据成功", 0).show();
}
  4 删除数据
  public void delete(View v){
// db.execSQL("delete from person where id=?", new Object[]{1});
   db.delete("person", "id=?", new String[]{"2"});
Toast.makeText(this, "删除数据成功", 0).show();
}

命令行查看数据库

 使用adb shell进入模拟器或者手机的控制台;
      使用cd切换到数据库文件所在的目录;
      使用sqlite3 数据库文件的名称打开数据;
      使用增删改查语句操作数据库。 

数据库的事务

    什么是事务:同一组操作要么同时成功,要么同时失败;
   zhangsan -> lisi 100yuan
   1、zhangsan - 100
   2、lisi + 100

* 在android应用程序中使用SQLite数据库事务的步骤:

使用SQLiteDatabase的beginTransaction()方法可以开启一个事务,程序执行到endTransaction() 方法时会检查事务的标志是否为成功,如果程序执行到endTransaction()之前调用了setTransactionSuccessful() 方法设置事务的标志为成功,则所有从beginTransaction()开始的操作都会被提交,如果没有调用setTransactionSuccessful() 方法则回滚事务。

代码:


try{
//1、在业务逻辑开始的时候开启事务:
db.beginTransaction();
//张三转出100
ContentValues values = new ContentValues();
values.put("money", "1900");
db.update("account", values, "id=?", new String[]{"1"});


//李四收到100
ContentValues values02 = new ContentValues();
values02.put("money", "102");
db.update("account", values02, "id=?", new String[]{"2"});

//2、 在业务逻辑结束的时候告诉系统数据库提交成功
db.setTransactionSuccessful();
} finally{
//3、告诉系统数据库结束
db.endTransaction();
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Barry__

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值