Android数据库——SQLite

Android系统的基础架构中内置了sqlite库,使得Android原生就支持了数据库的操作。

数据库对象的获取

从面向对象出发,既然是数据库的操作,就要先拿到数据库的对象,Android中提供了如下几个方法供我们得到数据库对象:

  1. SQLiteDatabase的静态方法
    //openOrCreateDatabase 实际上调用的也是openDatabase
    SQLiteDatabase.openDatabase(String path,CursorFactory factory,int flags,DatabaseErrorHandler errorHandler)
    
  2. Context中直接打开
    context.openOrCreateDatabase(String name,int mode, CursorFactory factory,DatabaseErrorHandler errorHandler)
    
  3. SQLiteOpenHelper
    sqliteOpenHelper.getReadableDatabase()
    

后面两种都是实际上都是调用了第一种方法,只不过后面两种将路径限定为app的目录下。而SQLiteOpenHelper又对数据库的打开、关闭的一些条件判断进行了封装,并提供了数据库升级和降级的方法。因此第三种应是我们操作数据库的首选。

使用SQLiteOpenHelper

新建一个类(MySQLiteHelper)继承自SQLiteOpenHelper
该类要求实现onCreateonUpgrade,并重写构造函数。

public class ImageSQLiteHelper extends SQLiteOpenHelper {

    public ImageSQLiteHelper(Context context) {
        // 以下为super中4个参数的说明
        // Context
        // name:数据库
        // cursorFactory: 先传个null
        // version 数据库版本,判断升级使用
        super(context, "image.db", null, 1);
    }

    /**
     * 一般在这里创建所需要的表
     */
    @Override
    public void onCreate(SQLiteDatabase db) {
        String createSql = "create table image (_id Integer primary key, path varchar(20), md5 char(32))";
        db.execSQL(createSql);
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        if (oldVersion < newVersion) {
            switch (oldVersion) {
                //不要加break,这样的会执行对应case以下完全部代码,更新至最新版本
                case 1://TODO
                case 2://TODO
                case 3://TODO
            }
        }
    }
}

这样通过

new ImageSQLiteHelper(context).getReadableDatabase()

便可以拿到数据库对象了。

数据库的增删改查

  1. execSQL
    获取的数据库对象可以通过execSQL(sql语句)来执行一条我们拼接好的sql,但该sql不能是查询或者是返回数据的语句,这个语句的返回是void。也就是说这个方法可以执行增删改操作
  2. insert
    /**
     * @param table 表名
     * @param nullColumnHack 传null
     * @param values 要插入的字段和值
     */
    public long insert(String table, String nullColumnHack, ContentValues values)
    
    eg:
    ContentValues contentValues = new ContentValues();
    contentValues.put("path", path);
    contentValues.put("md5", md5);
    database.insert("image", null, contentValues);
    
  3. delete
    /**
     * @param table 表名
     * @param whereClause 删除条件,可以包含占位符?(sql语句中where后面的内容)
     * @param whereArgs 替换whereClause中的占位符
     */
    public int delete(String table, String whereClause, String[] whereArgs)
    
    eg1:
    /**
     * 删除t1表中的所有数据
     */
    delete("t1", null, null)
    
    eg2:
    // 删除accounts表中name为"strongCat"并且type为"1"的数据
    String name = "strongCat";
    String type = "1"
    db.delete("accounts", "name=? AND type=?",new String[] {name, type});
    
  4. update
    /**
     * @param table 表名
     * @param values 要更新的字段内容
     * @param whereClause 删除条件,可以包含占位符?(sql语句中where后面的内容)
     * @whereArgs 替换whereClause中的占位符
     */
    public int update(String table, ContentValues values, String whereClause, String[] whereArgs)
    
    eg:
    // 将accounts表中_id为1的name更改为strongCat
    ContentValues values = new ContentValues();
    values.put("name", "strongCat");
    String accountId = "1"
    db.update("accounts", values,  "_id=?", new String[]{ accountId });
    
  5. query和rawQuery
    这两个是专门用来查询的方法,query最终调用的也是rawQuery,如果需要排序、分组等建议选用query,只有一个where判断的话rawQuery传参会更简单些。
    query
    /**
     * @param distinct 查询结果去除重复
     * @param table 表名
     * @param columns 要返回的字段,为null时返回所有字段
     * @param selection 查询条件,可以包含占位符?(sql语句中where后面的内容)
     * @param selectionArgs 替换selection中的占位符
     * @param groupBy 分组,sql当中的groupBy
     * @param having 用来过滤由GROUP BY语句返回的数据,sql当中的having
     * @param orderBy 排序,sql当中的orderBy
     * @param limit 分页,sql当中的limit
     */
    public Cursor query(boolean distinct, String table, String[] columns,
                String selection, String[] selectionArgs, String groupBy,
                String having, String orderBy, String limit)
    
    eg:
    key = 1
    // 从sessions表中查询key=1的记录。返回key,class,model三个字段
    query(true, "sessions",
                new String[]{"key", "class", "model", "time"},
                 "key=?", key, null, null, null, null);
    
    rawQuery
    /**
     * @param sql sql语句,变量用?占位
     * @param selectionArgs 替换sql中的占位符
     */
    public Cursor rawQuery(String sql, String[] selectionArgs)
    
    eg:
    SESSION_TABLE = "session"
    // 查询session中的所有数据
    rawQuery("select * from ?;", new String[]{SESSION_TABLE});
    
发布了37 篇原创文章 · 获赞 3 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/github_34790294/article/details/103750949