Android学习——SQLite数据库

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()方法。

扫描二维码关注公众号,回复: 5893730 查看本文章

要使用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();
    }

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/UUUUUltraman/article/details/89176556