SQLite数据库
1.SQLite数据库介绍
Android使用开源的、与操作系统无关的SQL数据库一大 名鼎鼎的SQLite。SQLite是一款轻量级数据库,它的设计目的是嵌入式,而且它占用的资源非常少,在嵌入式设备中,可能只需要几百KB,这也是Android系统采用SQLite数据库的原因之一。
SQLite3数据类型:
SQLite3支持NULL、 INTEGER、 REAL(浮点数字)、TEXT(字符串文本)和BLOB(二进制对象)数据类型,虽然它支持的类型只有五种,但实际,上sqlite3也接受varchar(n)、char(n)、 decimal(p,s) 等数据类型,只不过在运算或保存时会转成对应的五种数据类型。SQLite最大的特点是你可以保存任何类型的数据到任何字段中,无论这列声明的数据类型是什么。例如:可以在Integer类型的字段中存放字符串或者在布尔型字段中存放浮点数,或者在字符型字段中存放日期型值。但有一种情况例外:定义为INTEGER PRIMARY KEY的字段只能存储64位整数,当向这种字段中保存除整数以外的数据时,将会产生错误。
2.SQLite命令行操作
在命令行下创建数据库
1.启动模拟器后,打开命令行,执行adb shell
2.进入所在工程目录
3.执行sqlite3 创建数据库文件
这时如果使用.help可以取得求助.quit则是离开
可视化工具下载地址https://sqlitestudio.pl/index.rvt?act=download
打开可视化工具,点击左上角Database/Add a database,就可以创建数据库
3.定义数据库的元数据
包android.database.sqlite包含了使用SQLite数据库的所有API
SQL数据库主要概念之一就是Schema——一个关于如何组织数据库的定义
创建一个数据库类定义数据库元数据
package com.example.sqlite;
import android.provider.BaseColumns;
/*
* 数据库元数据的定义
* */
public class PetMetaData {
private PetMetaData(){}
//Dog表的定义
public static abstract class DogTable implements BaseColumns{
public static final String TABLE_NAME="dog";
public static final String NAME="name";
public static final String AGE="age";
}
}
4.使用SQLiteOpenHelper创建数据库
创建助手类SQLiteOpenHelper
package com.example.sqlite;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
public class DatabaseHelper extends SQLiteOpenHelper {
private static final String DB_NAME="pet.db";
private static final int VERSION=1;
private static final String CREATE_TABLE_DOG="create table dog(_id integer primary key autoincrement,"+
"name text,age integer)";
private static final String DROP_TABLE_DOG="DROP TABLE IF EXISTS dog";
public DatabaseHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
super(context, DB_NAME, null, VERSION);
}
//如果数据库表不存在,那么会调用该方法
@Override
public void onCreate(SQLiteDatabase db) {
//SQLiteDatabase 用于操作数据库的工具类
db.execSQL(CREATE_TABLE_DOG);
}
//升级更新数据库
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL(DROP_TABLE_DOG);
db.execSQL(CREATE_TABLE_DOG);
}
}
android系统里,数据库存储在private空间里,很安全,其他app无法访问。
SQLiteOpenHelper类里有很多有用的API,当你使用这 个类获取数据库的引用的时候,只有当你需要的时候,系统才有可能行耗时较长的操作,比如创建和更新数据库。你只要调用getWritableDatabase()和getReadableDatabase()方法就可以。
注意,因为有些操作可能会long running,所以务必在后台进程调用getWritableDatabase()和getReadableDatabase()方法。
要使用SQLiteOpenHelper类(抽象类),就需要创建一个子类,并且覆写onCreate(),onUpgrade()和onOpen0这几个回调方法,同时,也最好实现onDowngrade()方法。
5.代码实现增删查改操作
创建一个实体类
package com.example.sqlite;
public class Dog {
private int id;
private String name;
private int age;
public Dog(int id, String name, int age) {
this.id = id;
this.name = name;
this.age = age;
}
public Dog( String name, int age) {
this.name = name;
this.age = age;
}
public Dog() {
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Dog{"+
"id="+id+
",name='"+name+"\'"+
",age='"+age+"\'"+
"}";
}
}
创建适配器,实现增删改查操作
package com.example.sqlite;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import java.util.ArrayList;
public class DatabaseAdaper {
private DatabaseHelper databaseHelper;
public DatabaseAdaper(Context context){
databaseHelper=new DatabaseHelper(context);
}
//添加操作
public void add(Dog dog){
SQLiteDatabase db=databaseHelper.getWritableDatabase();
ContentValues values=new ContentValues();
values.put(PetMetaData.DogTable.NAME,dog.getName());
values.put(PetMetaData.DogTable.AGE,dog.getAge());
//参数(表名,可以为null的列名,更新字段的集合ContentValues)
//合法:insert into dog(name,age) values('xx',2)
//不合法:insert into dog() values()
db.insert(PetMetaData.DogTable.TABLE_NAME,null,values);
db.close();
}
//删除操作
public void delete(int id){
SQLiteDatabase db=databaseHelper.getWritableDatabase();
String whereClause=PetMetaData.DogTable._ID+"=?";
String[] whereArgs= {String.valueOf(id)};
//表名,删除条件,条件的值
db.delete(PetMetaData.DogTable.TABLE_NAME,whereClause,whereArgs);
db.close();
}
//更新操作
public void update(Dog dog){
SQLiteDatabase db=databaseHelper.getWritableDatabase();
ContentValues values=new ContentValues();
values.put(PetMetaData.DogTable.NAME,dog.getName());
values.put(PetMetaData.DogTable.AGE,dog.getAge());
String whereClause=PetMetaData.DogTable._ID+"=?";
String[] whereArgs= {String.valueOf(dog.getId())};
//表名,更新字段的集合ContentValues,条件,条件的值
db.update(PetMetaData.DogTable.TABLE_NAME,values,whereClause,whereArgs);
}
//凭id查询
public Dog findById(int id){
SQLiteDatabase db=databaseHelper.getReadableDatabase();
String[] colums={PetMetaData.DogTable._ID,PetMetaData.DogTable.NAME,PetMetaData.DogTable.AGE};
//是否去除重复记录,参数(表名,要查询的列,查询条件,查询条件的值,分组条件,分组条件的值,排序,分页)
Cursor c=db.query(true,PetMetaData.DogTable.TABLE_NAME,colums,PetMetaData.DogTable._ID+"=?",new String[]{String.valueOf(id)},null,null,null,null);
Dog dog=null;
if (c.moveToNext()){
dog=new Dog();
dog.setId(c.getInt(c.getColumnIndexOrThrow(PetMetaData.DogTable._ID)));
dog.setName(c.getString(c.getColumnIndexOrThrow(PetMetaData.DogTable.NAME)));
dog.setAge(c.getInt(c.getColumnIndexOrThrow(PetMetaData.DogTable.AGE)));
}
c.close();
db.close();
return dog;
}
//查询所有
public ArrayList<Dog> findAll(){
SQLiteDatabase db=databaseHelper.getReadableDatabase();
String[] colums={PetMetaData.DogTable._ID,PetMetaData.DogTable.NAME,PetMetaData.DogTable.AGE};
//是否去除重复记录,参数(表名,要查询的列,查询条件,查询条件的值,分组条件,分组条件的值,排序,分页)
Cursor c=db.query(true,PetMetaData.DogTable.TABLE_NAME,colums,null,null,null,null,null,null);
ArrayList<Dog> dogs=new ArrayList<>();
Dog dog=null;
while (c.moveToNext()){
dog=new Dog();
dog.setId(c.getInt(c.getColumnIndexOrThrow(PetMetaData.DogTable._ID)));
dog.setName(c.getString(c.getColumnIndexOrThrow(PetMetaData.DogTable.NAME)));
dog.setAge(c.getInt(c.getColumnIndexOrThrow(PetMetaData.DogTable.AGE)));
dogs.add(dog);
}
c.close();
db.close();
return dogs;
}
}
添加按钮点击事件
package com.example.sqlite;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import java.util.ArrayList;
public class MainActivity extends AppCompatActivity {
private DatabaseAdaper databaseAdaper;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
databaseAdaper=new DatabaseAdaper(this);
}
public void addClick(View view){
Dog dog=new Dog("white",2);
databaseAdaper.add(dog);
}
public void deleteClick(View view){
databaseAdaper.delete(1);
}
public void updateClick(View view){
Dog dog=new Dog(1,"black",2);
databaseAdaper.update(dog);
}
public void findByIdClick(View view){
Dog dog=databaseAdaper.findById(1);
System.out.println(dog);
}
public void findAllClick(View view){
ArrayList<Dog> dogs=databaseAdaper.findAll();
int size=dogs.size();
for (int i = 0; i <size ; i++) {
System.out.println(dogs.get(i));
}
}
}
6.使用原生sql语句
通过databaseHelper.getWritableDatabase()和databaseHelper.getReadableDatabase()获取SQLiteDatabase对象后;
插入数据:
//原生添加操作
public void rawAdd(Dog dog){
SQLiteDatabase db=databaseHelper.getWritableDatabase();
String sql="insert into dog(name,age) values(?,?)";
Object[] args={dog.getName(),dog.getAge()};
db.execSQL(sql,args);
db.close();
}
查询数据:
//原生条件查询操作
public Dog rawFindById(int id){
SQLiteDatabase db=databaseHelper.getReadableDatabase();
String sql="select * from dog where _id=?";
Cursor c=db.rawQuery(sql,new String[]{String.valueOf(id)});
Dog dog=null;
if (c.moveToNext()){
dog=new Dog();
dog.setId(c.getInt(c.getColumnIndexOrThrow(PetMetaData.DogTable._ID)));
dog.setName(c.getString(c.getColumnIndexOrThrow(PetMetaData.DogTable.NAME)));
dog.setAge(c.getInt(c.getColumnIndexOrThrow(PetMetaData.DogTable.AGE)));
}
c.close();
db.close();
return dog;
}
//原生查询所有操作
public ArrayList<Dog> rawFindAll(){
SQLiteDatabase db=databaseHelper.getReadableDatabase();
String sql="select * from dog";
Cursor c=db.rawQuery(sql,null);
ArrayList<Dog> dogs=new ArrayList<>();
Dog dog=null;
while (c.moveToNext()){
dog=new Dog();
dog.setId(c.getInt(c.getColumnIndexOrThrow(PetMetaData.DogTable._ID)));
dog.setName(c.getString(c.getColumnIndexOrThrow(PetMetaData.DogTable.NAME)));
dog.setAge(c.getInt(c.getColumnIndexOrThrow(PetMetaData.DogTable.AGE)));
dogs.add(dog);
}
c.close();
db.close();
return dogs;
}
删除数据:
//原生删除
public void rawDelete(int id){
SQLiteDatabase db=databaseHelper.getWritableDatabase();
String sql="delete from dog where _id=?";
Object[] args={id};
db.execSQL(sql,args);
db.close();
}
修改数据:
//原生修改操作
public void rawUpdate(Dog dog){
SQLiteDatabase db=databaseHelper.getWritableDatabase();
String sql="update dog set name=?,age=? where _id=?";
Object[] args={dog.getName(),dog.getAge(),dog.getId()};
db.execSQL(sql,args);
db.close();
}
7.使用事务
使用事务实现多个操作
//事务处理
public void transaction(){
SQLiteDatabase db=databaseHelper.getWritableDatabase();
db.beginTransaction();//开始事务
try{
db.execSQL("insert into dog(name,age) values('wangwang','3')");
db.execSQL("insert into dog(name,age) values('wolf','4')");
db.setTransactionSuccessful();//设置事务成功的标志(true)
}finally {
db.endTransaction();//结束事务,判断事务标记是否为true,如果为true那么提交事务,否则回滚
}
db.close();
}
添加单击事件
public void transactionClick(View view){
databaseAdaper.transaction();
}