Android SQLlite数据库简单总结

 SQLiteOpenHelper类 常用方法

/** 
  *  创建数据库
  */ 
 // 1. 创建 or 打开 可读/写的数据库(通过 返回的SQLiteDatabase对象 进行操作)
 getWritableDatabase()

 // 2. 创建 or 打开 可读的数据库(通过 返回的SQLiteDatabase对象 进行操作)
 getReadableDatabase()

 // 3. 数据库第1次创建时 则会调用,即 第1次调用 getWritableDatabase() / getReadableDatabase()时调用
 // 在继承SQLiteOpenHelper类的子类中复写
 onCreate(SQLiteDatabase db) 

 // 4. 数据库升级时自动调用
 // 在继承SQLiteOpenHelper类的子类中复写
 onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)

 // 5. 关闭数据库
 close()

 /** 
  *  数据库操作(增、删、减、查)
  */ 
 // 1. 查询数据
 (Cursor) query(String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy, String limit)  
 // 查询指定的数据表返回一个带游标的数据集。
 // 各参数说明: 
 // table:表名称 
 // colums:列名称数组 
 // selection:条件子句,相当于where 
 // selectionArgs:条件语句的参数数组 
 // groupBy:分组 
 // having:分组条件 
 // orderBy:排序类 
 // limit:分页查询的限制 
 // Cursor:返回值,相当于结果集ResultSet 

 (Cursor) rawQuery(String sql, String[] selectionArgs) 
 //运行一个预置的SQL语句,返回带游标的数据集(与上面的语句最大的区别 = 防止SQL注入)

 // 2. 删除数据行  
 (int) delete(String table,String whereClause,String[] whereArgs) 
 
 // 3. 添加数据行 
 (long) insert(String table,String nullColumnHack,ContentValues values) 
 
 // 4. 更新数据行 
(int) update(String table, ContentValues values, String whereClause, String[] whereArgs) 
 
 // 5. 执行一个SQL语句,可以是一个select or 其他sql语句 
 // 即 直接使用String类型传入sql语句 & 执行
 (void) execSQL(String sql) 

DataBaseHelper.java文件,继承SQLiteOpenHelper

package com.chy.sqlite.DataBase;

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import androidx.annotation.Nullable;
public class DataBaseHelper extends SQLiteOpenHelper {
    private static final int DATABASE_VERSION = 1; //数据库版本号

    /**
     * 构造函数
     * 在SQLiteOpenHelper的子类中,必须有该构造函数
     */
    public DataBaseHelper(@Nullable Context context, @Nullable String name, @Nullable SQLiteDatabase.CursorFactory factory,
                          int version) {
        // 参数说明
        // context:上下文对象
        // name:数据库名称
        // factory:一个可选的游标工厂(通常是 Null)
        // version:当前数据库的版本,值必须是整数并且是递增的状态

        // 必须通过super调用父类的构造函数
        super(context, name, factory, version);
    }

    /**
     * 自定义构造函数
     * */
    public DataBaseHelper(@Nullable Context context, @Nullable String name) {
        super(context, name+".db", null, DATABASE_VERSION);
    }


    /**
     * 复写onCreate()
     * 调用时刻:当数据库第1次创建时调用
     * 作用:创建数据库 表 & 初始化数据
     * SQLite数据库创建支持的数据类型: 整型数据、字符串类型、日期类型、二进制
     */
    @Override
    public void onCreate(SQLiteDatabase db) {
        // 创建数据库1张表
        // 通过execSQL()执行SQL语句(此处创建了1个名为person的表)
        String sql = "create table person(id integer primary key autoincrement,name varchar(64),address varchar(64))";
        db.execSQL(sql);

        // 注:数据库实际上是没被创建 / 打开的(因该方法还没调用)
        // 直到getWritableDatabase() / getReadableDatabase() 第一次被调用时才会进行创建 / 打开
    }

    /**
     * 复写onUpgrade()
     * 调用时刻:当数据库升级时则自动调用(即 数据库版本 发生变化时)
     * 作用:更新数据库表结构
     * 注:创建SQLiteOpenHelper子类对象时,必须传入一个version参数,
     * 该参数 = 当前数据库版本, 若该版本高于之前版本, 就调用onUpgrade()
     */
    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        // 参数说明:
        // db : 数据库
        // oldVersion : 旧版本数据库
        // newVersion : 新版本数据库
        // 使用 SQL的ALTER语句

        // 向person表中新增 sex 属性
        String sql = "alter table person add sex varchar(8)";
        db.execSQL(sql);
    }
}

DataBaseManager.java

package com.chy.sqlite.DataBase;

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

import java.util.ArrayList;
import java.util.HashMap;

public class DataBaseManager {

    DataBaseHelper dbHelper;
    SQLiteDatabase sqLiteDatabase;

    /**
     * Context 上下文
     * DBName 数据库名
     * */
    public DataBaseManager(Context context, String DBName){
        dbHelper = new DataBaseHelper(context, DBName);
        // 创建 or 打开 可读的数据库(通过 返回的SQLiteDatabase对象 进行操作)
        //sqLiteDatabase = dbHelper.getReadableDatabase();// 只有查找(读取)权限

        // 创建 or 打开 可读/写的数据库(通过 返回的SQLiteDatabase对象 进行操作)
        sqLiteDatabase = dbHelper.getWritableDatabase();// 增、删、改、查权限
    }


    /**
     * 【插入数据】
     * */
        public void insertDataToDB(){
            // 创建ContentValues对象
            ContentValues values = new ContentValues();

            /** 向该对象中插入键值对
            * 其中,key = 列名,value = 插入的值
            * 注:CContentValues 和HashTable类似都是一种存储的机制
             * 但是两者最大的区别就在于,
             * contenvalues只能存储基本类型的数据,
             * 像string,int之类的,不能存储对象这种东西,而HashTable却可以存储对象*/
            values.put("name", "测试");
            values.put("address", "长春");

            // 参数1:要操作的表名称
            // 参数2:SQl不允许一个空列,若ContentValues是空,那么这一列被明确的指明为NULL值
            // 参数3:ContentValues对象
           // sqLiteDatabase.insert("person", null, values);

            // 注:也可采用SQL语句插入
            String sql = "insert into person (name,address) values ('test','cc')";
            sqLiteDatabase.execSQL(sql);
        }


        /**
         * 【删除数据】
         *
         * */
        public void deleateToDB(){
            // 参数1:表名(String)
            // 参数2:WHERE表达式(String),需删除数据的行; 若该参数为 null, 就会删除所有行;?号是占位符
            // 参数3:WHERE选择语句的参数(String[]), 逐个替换 WHERE表达式中 的“?”占位符;
            // 删除 id = 1的数据
           // sqLiteDatabase.delete("person", "id=?", new String[]{"1"});


            // 注:也可采用SQL语句修改
            String sql = "delete from person where id='4'";
            sqLiteDatabase.execSQL(sql);
        }

        /**
         * 【更新数据】
         * */
        public void updataToDB(){
            // 创建一个ContentValues对象
            ContentValues values = new ContentValues();
            values.put("name", "lisi");

            // 参数1:表名(String)
            // 参数2:需修改的ContentValues对象
            // 参数3:WHERE表达式(String),需数据更新的行; 若该参数为 null, 就会修改所有行;?号是占位符
            // 参数4:WHERE选择语句的参数(String[]), 逐个替换 WHERE表达式中 的“?”占位符;
            //调用update方法修改数据库:将id=1 修改成 name = zhangsan
           // sqLiteDatabase.update("person", values, "id=?", new String[] { "2" });

            // 注:也可采用SQL语句修改
            String sql = "update person set name = 'lisi' where id='5'";
            sqLiteDatabase.execSQL(sql);
        }


    /**
     * 【查询数据】
     * */
        public void queryDataFromDB(){
            ArrayList<HashMap<String ,String>> list = new ArrayList<>();
            // 参数1:(String)表名
            // 参数2:(String[])要查询的列名
            // 参数3:(String)查询条件
            // 参数4:(String[])查询条件的参数
            // 参数5:(String)对查询的结果进行分组
            // 参数6:(String)对分组的结果进行限制
            // 参数7:(String)对查询的结果进行排序
            Cursor cursor = sqLiteDatabase.query("person", new String[] {"id", "name", "address"} , "id = ?", new String[]{"2"}, null, null, null);
            int cur_len = cursor.getColumnCount();//获取数据所有列数

            while (cursor.moveToNext()){
                HashMap<String , String> map = new HashMap<>();
                for (int i=0; i<cur_len; i++){
                    String clos_name = cursor.getColumnName(i);//从给定的索引i返回列名
                    String clos_value = cursor.getString(cursor.getColumnIndex(clos_name));//返回指定的名称,没有就返回-1
                    if(clos_value==null){
                        clos_value = "";
                    }
                    Log.i("TAG:","while循环下面的for循环拿到的数据clos_value为:"
                            + cursor.getString(cursor.getColumnIndex(clos_name)));
                    map.put(clos_name , clos_value);
                }
                list.add(map);
            }
        }

        /**
         * 【关闭数据库】
         * */
        public void closeDB(){
            /**注:完成数据库操作后,记得调用close()关闭数据库,从而释放数据库的连接*/
            sqLiteDatabase.close();
        }

        /**
         * 【自增列清零】
         * */
        private void clearSqlite_sequenceFromDB(){
            // 将自增id列清零,重新计算
            String sql = "update sqlite_sequence set seq=0 where name = 'person'";
            sqLiteDatabase.execSQL(sql);
        }
}

使用方法:

package com.chy.sqlite;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.view.View;
import android.widget.Button;

import com.chy.sqlite.DataBase.DataBaseManager;

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    private Button addBtn;
    private Button delBtn;
    private Button updataBtn;
    private Button queryBtn;

    private DataBaseManager dataBaseManager;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        // 新增数据
        addBtn = findViewById(R.id.addBtn);
        addBtn.setOnClickListener(this);
        // 删除数据
        delBtn = findViewById(R.id.delBtn);
        delBtn.setOnClickListener(this);
        // 更新数据
        updataBtn = findViewById(R.id.updataBtn);
        updataBtn.setOnClickListener(this);
        // 查找数据
        queryBtn = findViewById(R.id.queryBtn);
        queryBtn.setOnClickListener(this);

        dataBaseManager = new DataBaseManager(this, "test");
    }


    @Override
    public void onClick(View v) {
        switch (v.getId()){
            case R.id.addBtn:
                    dataBaseManager.insertDataToDB();
                break;
            case R.id.delBtn:
                    dataBaseManager.deleateToDB();
                break;
            case R.id.updataBtn:
                    dataBaseManager.updataToDB();
                break;
            case R.id.queryBtn:
                    dataBaseManager.queryDataFromDB();
                break;
        }
    }
}

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章