Android SQLite数据库

SQLite介绍

SQLite是一款轻量级的关系型数据库,它的运算速度非常快,占用资源很少,通常只需要几百K的内存就足够了,因而特别适合在移动设备上使用。SQLite采用的是动态数据类型,会根据存入值自动判断,具有以下五种常用的数据类型:
NULL 值是一个 NULL 值。
INTEGER 值是一个带符号的整数,根据值的大小存储在 1、2、3、4、6 或 8 字节中。
REAL 值是一个浮点值,存储为 8 字节的 IEEE 浮点数字。
TEXT 值是一个文本字符串,使用数据库编码(UTF-8、UTF-16BE 或 UTF-16LE)存储。
BLOB 值是一个 blob 数据,完全根据它的输入存储。

SQLiteOpenHelper类

是 Android平台提供给我们一个数据库辅助类来创建或打开数据库,一般先继承这个类的实现相应的方法。再用该类的对象获取Database执行增删查改的操作。默认打开/data/data/package/databases/应用里的内部数据库执行管理。

  • onCreate(SQLiteDatabase db) : 当数据库被首次创建时执行该方法,一般将创建表等初始化操作在该方法中执行。
  • onUpgrade(SQLiteDatabse dv, int oldVersion,int new Version):当打开数据库时传入的版本号与当前的版本号不同时会调用该方法。
public class JsonDbHelper extends SQLiteOpenHelper {
    private static final String TAG = "JsonDbHelper";
    private static final String DB_NAME = "json_db";//数据库名字
    public static String TABLE_NAME = "json";// 表名
    public static String FIELD_ID = "id";//
    public static String FIELD_NAME = "name";// 接口名
    public static String FIELD_TIME = "time";// 加载时间
    public static String FIELD_CONTENT = "content";// 接口内容
    private static final int DB_VERSION = 1;   // 数据库版本
    private static JsonDbHelper instance;

    public static JsonDbHelper getHelper(Context context) {
        if (instance == null)
            instance = new JsonDbHelper(context);
        return instance;
    }

    private JsonDbHelper(@Nullable Context context) {
        super(context, DB_NAME, null, DB_VERSION);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        //创建表 SQL语句
        //CREATE TABLE IF NOT EXISTS `runoob_tbl`(
        //   `runoob_id` INT UNSIGNED AUTO_INCREMENT,
        //   `runoob_title` VARCHAR(100) NOT NULL,
        //   `runoob_author` VARCHAR(40) NOT NULL,
        //   `submission_date` DATE,
        //   PRIMARY KEY ( `runoob_id` )
        //)ENGINE=InnoDB DEFAULT CHARSET=utf8;

        //SQLite采用的是动态数据类型,会根据存入值自动判断,具有以下五种常用的数据类型
        //NULL  值是一个 NULL 值。
        //INTEGER   值是一个带符号的整数,根据值的大小存储在 1、2、3、4、6 或 8 字节中。
        //REAL  值是一个浮点值,存储为 8 字节的 IEEE 浮点数字。
        //TEXT  值是一个文本字符串,使用数据库编码(UTF-8、UTF-16BE 或 UTF-16LE)存储。
        //BLOB 值是一个 blob 数据,完全根据它的输入存储。
        String sql = "CREATE TABLE IF NOT EXISTS " + TABLE_NAME + "("
                + FIELD_ID + " INTEGER PRIMARY KEY AUTOINCREMENT , "
                + FIELD_NAME + " TEXT NOT NULL , "
                + FIELD_TIME + " INTEGER NOT NULL , "
                + FIELD_CONTENT + " TEXT NOT NULL);";
        try {
            db.execSQL(sql);
        } catch (SQLException e) {
            Log.e(TAG, "onCreate " + TABLE_NAME + "Error" + e.toString());
        }
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        //链接:https://juejin.im/post/59e7e5856fb9a0451542fb19
        //构建删除表的SQL
        String sql = "DROP TABLE IF EXISTS " + DB_NAME;
        // 将原来的表和数据直接删除,然后再创建新的表,这是一种比较暴力而简单
        db.execSQL(sql);
        onCreate(db);

        // 逐步升级的方案 较慢
//        if (newVersion > 1) {
//
//        }
//        if (newVersion > 2) {
//
//        }
    }
}

SQLiteDatabase类

SQLiteOpenHelper的实现类的对象调用 getWritableDatabase(),getReadableDatabase()返回的实例就是这个类的实例。也可以通过SQLiteDatabase的静态方法返回实例:
db=SQLiteDatabase.openOrCreateDatabase("/data/data/com.lingdududu.db/databases/stu.db",null);

插入数据

  • SQLiteDatabase的insert(String table,String nullColumnHack,ContentValues values)方法
    参数1 表名称,
    参数2 空列的默认值
    参数3 ContentValues类型的一个封装了列名称和列值的Map;
private void insert(SQLiteDatabase db)
{   
    // 实例化常量值   
    ContentValues cValue = new ContentValues();   
    // 添加用户名   
    cValue.put("sname","xiaoming");   
    // 添加密码   
    cValue.put("snumber","01005");   
    // 调用insert()方法插入数据   
    db.insert("stu_table",null,cValue);   
   }
  • 编写插入数据的SQL语句,直接调用SQLiteDatabase的execSQL()方法来执行
private void insert(SQLiteDatabase db)
{   
    //插入数据SQL语句
    String stu_sql="insert into stu_table(sname,snumber) values('xiaoming','01005')"; 
    //执行SQL语句
    db.execSQL(sql);
   }

删除数据

  • 调用SQLiteDatabase的delete(String table,String whereClause,String[] whereArgs)方法
    参数1 表名称
    参数2 删除条件
    参数3 删除条件值数组
private void delete(SQLiteDatabase db) 
{   
    // 删除条件
    String whereClause = "id=?";
    // 删除条件参数
    String[] whereArgs = {String.valueOf(2)};
    // 执行删除
    db.delete("stu_table",whereClause,whereArgs); 
   }
  • 编写删除SQL语句,调用SQLiteDatabase的execSQL()方法来执行删除
private void delete(SQLiteDatabase db) 
{   
    // 删除SQL语句
    String sql = "delete from stu_table where _id = 6";
    // 执行SQL语句
    db.execSQL(sql);
   }

修改数据

  • 调用SQLiteDatabase的update(String table,ContentValues values,String whereClause, String[] whereArgs)方法
    参数1 表名称
    参数2 跟行列ContentValues类型的键值对Key-Value
    参数3 更新条件(where字句)
    参数4 更新条件数组
private void update(SQLiteDatabase db) 
{   
    // 实例化内容值 
    ContentValues values = new ContentValues();   
    // 在values中添加内容   
    values.put("snumber","101003");   
    // 修改条件   
    String whereClause = "id=?";   
    // 修改添加参数   
    String[] whereArgs={String.valuesOf(1)};   
    // 修改   
    db.update("usertable",values,whereClause,whereArgs);   
   }
  • 编写更新的SQL语句,调用SQLiteDatabase的execSQL执行更新
private void update(SQLiteDatabase db)
{   
    // 修改SQL语句
    String sql = "update stu_table set snumber = 654321 where id = 1";
    // 执行SQL
    db.execSQL(sql); 
   }

查询数据

  • 在Android中查询数据是通过Cursor类来实现的,当我们使用SQLiteDatabase.query()方法时,会得到一个Cursor对象,Cursor指向的就是每一条数据。它提供了很多有关查询的方法,具体方法如下:
public Cursor query(String table,String[] columns,String selection,String[] selectionArgs,String groupBy,String having,String orderBy,String limit);

各个参数的意义说明:
参数table:表名称
参数columns:列名称数组
参数selection:条件字句,相当于where
参数selectionArgs:条件字句,参数数组
参数groupBy:分组列
参数having:分组条件
参数orderBy:排序列
参数limit:分页查询限制

  • 编写查询的SQL语句,获取Cursor 对象
 Cursor cursor = database.rawQuery("SELECT * FROM " + JsonDbHelper.TABLE_NAME + " WHERE " + JsonDbHelper.FIELD_NAME + "=?"
                , new String[]{name});
Cursor:返回值,相当于结果集ResultSet

Cursor是一个游标接口,提供了遍历查询结果的方法,如移动指针方法move(),获得列值方法getString()等.
Cursor游标常用方法
getCount() 获得总的数据项数
isFirst() 判断是否第一条记录
isLast() 判断是否最后一条记录
moveToFirst() 移动到第一条记录
moveToLast() 移动到最后一条记录
move(int offset) 移动到指定记录
moveToNext() 移动到下一条记录
moveToPrevious() 移动到上一条记录
getColumnIndexOrThrow(String columnName) 根据列名称获得列索引
getInt(int columnIndex) 获得指定列索引的int类型值
getString(int columnIndex) 获得指定列缩影的String类型值
示例:查询数据

private void query(SQLiteDatabase db) 
{   
    // 查询获得游标   
    Cursor cursor = db.query ("usertable",null,null,null,null,null,null);   
    // 判断游标是否为空   
    if(cursor.moveToFirst() 
    {   
        // 遍历游标   
        for(int i=0;i

参考

Android黄金篇-SQLite数据库

你可能感兴趣的:(Android SQLite数据库)