安卓核心技术中级——SQLite数据库

SQLite数据库介绍

android使用开源的,与操作系统无关的SQL数据的。SQLite是一款轻量级数据库,它的设计目的是嵌入式,而且占用的资源非常少,在嵌入式设备中,可能只需要几百KB,这也是Android系统采用SQLite数据库的原因之一。
SQLite3数据类型:
支持NULL,INTERGER,REAL(浮点数字),TEXT(字符串文本)和BLOB(二进制对象)数据类型,虽然它支持的数据对象只有五种,但实际上也接受varchar,char,decimal(p,s)等数据类型,只不过在运输或保存时会转成对于的五种数据类型。SQLite最大的特点是你可以保存任何类型的数据到任何字段中,无论这列声明的数据类型是什么。

SQLite命令行操作

在命令行下创建数据库
1、启动模拟器后,打开命令行,执行adb shell
2、进入所在工程目录,如:cd data/data/com.vince.db
3、执行sqlite3 mydb创建数据库文件

这时如果使用.help可以区则求助,.quit则是离开
SQL指令都是以分号(;)结尾的。如果遇到两个减号(–)则代表注解

.databases;
在这里插入图片描述

定义数据库的元数据

包android.database.sqlite包含了使用SQLite数据库的所有API
SQL数据库主要概念之一就是Schema——一个关于如何组织数据库的定义
以下是一个为单表定义表名和列名的代码片段:

public final 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";
    }
}

使用SQLiteOpenHelper创建数据库

android系统中,数据库存储在private空间里,很安全,其他app无法访问。
SQLiteOpenHelper类里有很多有用的API,当你使用这个类获取数据库的引用的时候,只有当你需要的时候,系统才有可能进行耗时较长的操作,比如创建和更新数据库,你只要调用getWritableDatabase()和getReadableDatabase()方法就可以。调用时务必在后台调用方法。

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) {
        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);
    }
}

插入数据库

public void add(Dog dog){
        //获取操作数据库的工具类
        SQLiteDatabase db = dbHelper.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(name) values(null)
        db.insert(PetMetaData.DogTable.TABLE_NAME,PetMetaData.DogTable.NAME,values);
        db.close();
    }

查询数据库

//根据ID查询结果
    public Dog findById(int id){
        SQLiteDatabase db = dbHelper.getReadableDatabase();
        String[] columns = {PetMetaData.DogTable._ID,PetMetaData.DogTable.NAME,PetMetaData.DogTable.AGE};
        //是否去除重复记录,表名,要查询的列,查询条件,查询条件的值,分组条件,分组条件的值,排序,分离条件
        Cursor c = db.query(true,PetMetaData.DogTable.TABLE_NAME,columns,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 = dbHelper.getReadableDatabase();
        String[] columns = {PetMetaData.DogTable._ID,PetMetaData.DogTable.NAME,PetMetaData.DogTable.AGE};
        //是否去除重复记录,表名,要查询的列,查询条件,查询条件的值,分组条件,分组条件的值,排序,分离条件
        Cursor c = db.query(true,PetMetaData.DogTable.TABLE_NAME,columns,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;
    }

删除数据库

//删除
    public void delete(int id){
        SQLiteDatabase db = dbHelper.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 = dbHelper.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);
        db.close();
    }

在这里插入图片描述

使用原生SQL语句

public void rawAdd(Dog dog){
        String sql = "insert into dog(name,age) values (?,?)";
        Object[] args = {dog.getName(),dog.getAge()};
        SQLiteDatabase db = dbHelper.getWritableDatabase();
        db.execSQL(sql,args);
        db.close();
    }
    public void rawDelete(int id){
        SQLiteDatabase db = dbHelper.getWritableDatabase();
        String sql = "delete from dog where _id = ?";
        Object[] args = {id};
        db.execSQL(sql,args);
        db.close();
    }
    public void rawUpdate(Dog dog){
        SQLiteDatabase db = dbHelper.getWritableDatabase();
        String sql = "update dog set name = ?,age = ? where _id = ?";
        Object[] args = {dog.getName(),dog.getAge(),dog.getId()};
        db.execSQL(sql,args);
        db.close();
    }
    public Dog rawFindById(int id){
        SQLiteDatabase db = dbHelper.getReadableDatabase();
        String sql = "select _id,name,age 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 = dbHelper.getReadableDatabase();
        String sql = "select _id,name,age 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 transaction(){
        SQLiteDatabase db = dbHelper.getWritableDatabase();
        db.beginTransaction();//开始事务
        try {
            db.execSQL("insert into dog(name,age)values('duang',4)");
            db.execSQL("insert into dog(name,age)values('guang',3)");
            db.setTransactionSuccessful();//设置事务的成功标记
        }finally {
            db.endTransaction();//结束事务,如果判断事务标记是否为true,true就提交事务,false就回滚
        }
    }

sqlite游戏玩家管理案例

功能实现
1、定义元数据类:GameMetaData和表结构数据内部类 GamePlayer
2、定义数据库操作类 DatabaseAdaptec和DatabaseHelper
3、MainActivity和GamePlayerFragment用于界面显示(列表)
4、AddFragment中使用Dialog来添加玩家
5、UpdateFragment显示一个玩家数据并可以修改

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值