SQLite数据库
一.SQLite数据库介绍
1.Android 系统中集成的轻量级的数据库
2.特点:
轻量级 只用一个动态的库, 是以单个文件的形式进行存取
跨平台 支持多个操作系统
零配置 无需安装, 直接使用
嵌入式 内嵌到手机中
3.在程序的内部可以通过数据库的名称访问, 其他应用不能访问
4.路径: data/data/应用程序包名/database/ ****.db
5.存放的类型:
NULL 空值
INTEGER 整型(不用int)
VARCHAR 可变长度的字符数据
TEXT 文本字符串
BOOLEAN 布尔
DATE
TIME
二.数据库核心类
1.SQLiteOpenHelper 数据库的帮助类, “用于数据库的创建和版本更新”
(1)定义一个类, 继承SQLiteOpenHelper
(2)重写构造方法 :提供数据库的基本信息 : 上下文对象,数据库名称,Null,数据库的版本号
(3)重写父类的方法:
onCreate():第一次创建数据库时调用, 只会执行一次 – “初始化表,初始化数据”
onUpgrade()
2.SQLiteDatabase 数据库的操作类, “操作数据库: 执行sql语句/增/删/改/查”
(0)获取SQLiteDatabase对象
(1)执行sql 语句
void execSQL(String sql,String[] bindArgs); 执行增删改
Cusor rawQuery(String sql,String[] selectionArgs); 执行查询
(2)执行方法 – 封装好的方法 (适用于菜鸟级别的程序员)
insert() 插入数据
update() 修改数据
delete() 删除数据
query() 查询数据
三.SQL语句复习:
1.创建表:
create table student(_id integer primary key autoincrement,name varchar(30),age integer,address varchar(30));
2.添加数据:insert into student values(null,‘要甜雪’,18,‘北京市海淀区’);
3.修改数据:update student set age=13,address=‘河北省沧州市’ where name=‘要甜雪’;
4. 查询数据:
select * from student where 字段 = ‘值’
模糊查询: select * from 表名 where name like ‘%小%’
select * from student order by age desc 降序查询
sum(列名) 求和
max(列名) 最大值
min(列名) 最小值
avg(列名) 求平均值
count(列名) 统计记录数
5.删除数据:delete from student where id=12;
数据库代码
package com.example.day9;
import android.content.ContentValues;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;
import android.widget.Toast;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
public class MainActivity extends AppCompatActivity {
private TextView textView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textView=findViewById(R.id.textview);
}
public void click(View view) {
switch (view.getId()){
case R.id.one:
break;
//增1
case R.id.two:
//第一次进创建数据库,第二次进检查版本号
MyDataBaseHelp myDataBaseHelp = new MyDataBaseHelp(this, "day9", null, 1);
//database:安卓提供的操作类
SQLiteDatabase db = myDataBaseHelp.getWritableDatabase();
//专用的数据格式
ContentValues values = new ContentValues();
values.put("name","aaa");
values.put("age",12);
db.insert("user",null,values);
textView.setText(db+"");
break;
//增2
case R.id.three:
MyDataBaseHelp myDataBaseHelp1 = new MyDataBaseHelp(MainActivity.this, "day9", null, 2);
SQLiteDatabase db2 = myDataBaseHelp1.getWritableDatabase();
db2.execSQL("insert into user(name,age,sex) values ('Asuna','女',110)");
break;
//改1
case R.id.four:
MyDataBaseHelp myDataBaseHelp2 = new MyDataBaseHelp(this, "day9", null, 2);
SQLiteDatabase db3 = myDataBaseHelp2.getWritableDatabase();
db3.execSQL("update user set age =10 where name=?",new String[]{"Amlv"});
break;
//改2
case R.id.five:
MyDataBaseHelp myDataBaseHelp3 = new MyDataBaseHelp(this, "day9", null, 2);
SQLiteDatabase db4 = myDataBaseHelp3.getWritableDatabase();
ContentValues values1 = new ContentValues();
values1.put("age",12);
int update = db4.update("user", values1, "name=?", new String[]{"Amlv"});
break;
//删1
case R.id.six:
MyDataBaseHelp myDataBaseHelp4 = new MyDataBaseHelp(this, "day9", null, 2);
SQLiteDatabase db5 = myDataBaseHelp4.getWritableDatabase();
db5.execSQL("delete from user where name=?",new String[]{"Amlv"});
break;
//删2
case R.id.seven:
MyDataBaseHelp myDataBaseHelp5 = new MyDataBaseHelp(this, "day9", null, 2);
SQLiteDatabase db6 = myDataBaseHelp5.getWritableDatabase();
int delete = db6.delete("user","name=?",new String[]{"Asuna"});
break;
//查
case R.id.eight:
MyDataBaseHelp myDataBaseHelp6 = new MyDataBaseHelp(this, "day9", null, 2);
SQLiteDatabase db7 = myDataBaseHelp6.getWritableDatabase();
//创建集合
ArrayList<Map<String,Object>> list = new ArrayList<>();
//通过列查询
Cursor cursor = db7.rawQuery("select * from user", null);
//通过属性名查询
/**
* table:表名
* columns:要查询出来的列名
* selection:查询条件子句
* selectionArgs:对应于selection语句中占位符的值
* groupBy:相当于select语句group by关键字后面的部分
* having:相当于select语句having关键字后面的部分
* orderBy:相当于select语句order by关键字后面的部分
* limit:指定偏移量和获取的记录数,相当于select语句limit关键字后面的部分
*/
Cursor user = db7.query("user", null, null, null, null, null, null);
//遍历游标
while (cursor.moveToNext()) {
// //通过列名,获取所在列的编号
// int name = cursor.getColumnIndex("name");
// //通过列的编号,得到该列的数据
// String message = cursor.getString(name);
//
String name = user.getString(user.getColumnIndex("name"));
Map<String, Object> map = new HashMap<>();
map.put("name",name);
list.add(map);
//log打印
}
break;
//多条增加-多条删除,防止数据出现意外 出现问题回滚,
case R.id.nine:
MyDataBaseHelp myDataBaseHelp7 = new MyDataBaseHelp(this, "day9", null, 2);
SQLiteDatabase db8 = myDataBaseHelp7.getWritableDatabase();
db8.beginTransaction();//开启事务
for (int i = 0; i < 100; i++) {
db8.execSQL("insert into user(name,age,sex) values ('"+i+"aaa','男',10)");
}
db8.setTransactionSuccessful();//成功
db8.endTransaction();//结束事务
db8.close();//关闭
break;
}
}
}
自定义类:
package com.example.day9;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.support.annotation.Nullable;
public class MyDataBaseHelp extends SQLiteOpenHelper {
private Context context;
private String name;//数据库名字
private SQLiteDatabase.CursorFactory factory;//工厂类
int version; //数据库版本号
public MyDataBaseHelp( Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
super(context, name, factory, version);
this.name=name;
this.factory=factory;
this.version=version;
}
//没有数据库执行这个方法,创建库、表
@Override
public void onCreate(SQLiteDatabase sqLiteDatabase) {
String sql="create table user(id integer primary key autoincrement,name varchar(10),age integer)";
sqLiteDatabase.execSQL(sql);
}
//更新数据库 - 比原来的大,调用这个方法,版本更新。版本号一样,直接打开。
@Override
public void onUpgrade(SQLiteDatabase sqLiteDatabase, int oldVersion, int newVerson) {
String sql="alter table user add sex varchar(10)" ;
sqLiteDatabase.execSQL(sql);
}
}
事务
1.什么是事务?
就是把多件事情当做一件事情来处理。也就是大家同在一条船上,要活一起活,要over一起over !
在Android应用程序开发中,经常会遇到需要进行数据库操作的时候,有关数据库事务处理对Android应用程序的稳定性和效率提升非常重要。
2…事务的好处?
1.首先Android数据库操作,特别是进行写操作的时候非常慢,将所有操作打包成一个事务能大大提高处理速度。
2.保证数据的一致性,让一个事务中的所有操作都成功执行,或者失败,或者所有操作回滚。
例如:应用程序初始化时需要批量插入大量数据,单独的使用for循环方法导致应用响应缓慢,因为 sqlite插入数据的时候默认一条语句就是一个事务,有多少条数据就有多少次磁盘操作。我的应用初始5000条记录也就是要5000次读写磁盘操作。
而且不能保证所有数据都能同时插入。(有可能部分插入成功,另外一部分失败,后续还得删除。太麻烦)