Android中的SQLite数据库

关于Android中的SQLite数据库的使用

SQLite这种Android系统中自带的数据库软件虽然在项目中很少用到源生的,但是从我们学习的角度来说,还是非常有必要熟悉的。

1.创建OpenHelper类

public class BlackNumberOpenHelper extends SQLiteOpenHelper {

    //设置数据库的信息,创建数据库
    //name : 数据库的名称
    //factory : 游标工厂
    //version : 数据库的版本
    public BlackNumberOpenHelper(Context context) {
        super(context, BlackNumberConstants.DB_NAME, null, BlackNumberConstants.DB_VERSION);
    }
    //创建表结构
    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL(BlackNumberConstants.DB_SQL);
    }
    //更新数据库的时候调用的方法
    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

    }

}

这个类继承于SQLiteOpenHelper,用于获取SQliteDataBase,在这里数据库的名称,version,创建表的语句等都抽取到一个常量类中,用于后期方便更改

下面是抽取的代码

public interface BlackNumberConstants {

    /** 数据库的名称 **/
    public static final String DB_NAME = "blacknumber.db";

    /** 数据库的版本 **/
    public static final int DB_VERSION = 1;

    // 为了方便后期修改表的名称和字段的名称,把表名和字段名也抽取出来
    /** 表名 **/
    public static final String TABLE_NAME = "info";

    /** _id字段的名称 **/
    public static final String ID = "_id";
    /** 号码的字段的名称 **/
    public static final String BLACKNUMBER = "blacknumber";
    /** 类型的字段的名称 **/
    public static final String MODE = "mode";

    /** 创建表的sql语句 **/
    public static final String DB_SQL = "create table " + TABLE_NAME + "(" + ID
            + " integer primary key autoincrement," + BLACKNUMBER
            + " varchar(20)," + MODE + " varchar(2))";
}

2.数据库的增删查改,直接上代码

/**
 * 黑名单数据库的操作
 * 
 * 2017-10-23 上午9:30:39
 */
public class BlackNumberDao {

    private BlackNumberOpenHelper blackNumberOpenHelper;

    public BlackNumberDao(Context context) {
        blackNumberOpenHelper = new BlackNumberOpenHelper(context);
    }

    // 增删改查
    /**
     * 添加数据的操作
     * 
     * @param blacknumber
     *            : 号码
     * @param mode
     *            : 拦截类型 2017-10-23 上午9:30:45
     */
    public boolean add(String blacknumber, int mode) {
        SQLiteDatabase database = blackNumberOpenHelper.getWritableDatabase();
        ContentValues values = new ContentValues();
        // key:数据库表中的字段名
        // values:添加的数据
        values.put(BlackNumberConstants.BLACKNUMBER, blacknumber);
        values.put(BlackNumberConstants.MODE, mode);
        // 参数1:表名
        // 参数2:Sqlite数据库不能直接添加null操作,如果添加数据是null,sqlite数据库会在添加数据相应的列中设置为null
        // 参数3:添加的数据
        long insert = database.insert(BlackNumberConstants.TABLE_NAME, null,
                values);

        // 判断是否添加成功的操作
        return insert != -1;
    }

    /**
     * 根据号码删除表中对应的记录
     * 
     * @param blackNumber
     *           2017-10-23 上午9:32:24
     */
    public boolean delete(String blackNumber) {
        SQLiteDatabase database = blackNumberOpenHelper.getWritableDatabase();
        // whereClause : 查询条件
        // whereArgs : 查询条件的参数(具体的值)
        int delete = database.delete(BlackNumberConstants.TABLE_NAME,
                BlackNumberConstants.BLACKNUMBER + "=?",
                new String[] { blackNumber });

        System.out.println(delete);

        return delete != 0;
    }

    /**
     * 根据号码更新拦截类型
     * 
     * @param blacknumber
     *            : 号码
     * @param mode
     *            : 更新的拦截类型 2017-10-23 上午9:36:43
     */
    public boolean update(String blacknumber, int mode) {
        SQLiteDatabase database = blackNumberOpenHelper.getWritableDatabase();
        ContentValues values = new ContentValues();
        values.put(BlackNumberConstants.MODE, mode);
        // values : 要更新的数据
        // whereClause : 查询条件
        // whereArgs : 查询条件的参数(具体的值)
        int update = database.update(BlackNumberConstants.TABLE_NAME, values,
                BlackNumberConstants.BLACKNUMBER + "=?",
                new String[] { blacknumber });

        System.out.println(update);

        // 如果update是0标示更新失败
        return update != 0;
    }

    // 查询单个数据
    /**
     * 根据黑名单号码查询拦截类型
     * 
     * @param blackNumber
     * @return 2017-10-23 上午9:41:39
     */     // 因为是根据黑名单号码查询拦截类型,一个黑名单号码对应的是一个拦截类型
    public int queryMode(String blackNumber) {

        int mode = -1;// 设置初始的默认值

        SQLiteDatabase database = blackNumberOpenHelper.getReadableDatabase();
        // columns :设置查询哪一列的数据
        // selection : 查询条件
        // selectionArgs : 查询条件的参数
        // groupBy : 分组
        // having : 去重
        // orderBy : 排序
        Cursor cursor = database.query(BlackNumberConstants.TABLE_NAME,
                new String[] { BlackNumberConstants.MODE },
                BlackNumberConstants.BLACKNUMBER + "=?",
                new String[] { blackNumber }, null, null, null);

        if (cursor.moveToNext()) {
            mode = cursor.getInt(0);
        }
        // 关闭
        cursor.close();
        database.close();
        return mode;
    }

    // 查询全部数据

    /**
     * 查询全部数据的操作
     * 
     * 2017-10-23 上午9:45:17
     */
    public List<BlackNumberInfo> queryAll() {

        SystemClock.sleep(2000);

        List<BlackNumberInfo> list = new ArrayList<BlackNumberInfo>();

        SQLiteDatabase database = blackNumberOpenHelper.getReadableDatabase();
        Cursor cursor = database.query(BlackNumberConstants.TABLE_NAME,
                new String[] { BlackNumberConstants.BLACKNUMBER,
                        BlackNumberConstants.MODE }, null, null, null, null,
                "_id desc");// desc倒序查询,asc/默认不写:正序查询
        while (cursor.moveToNext()) {
            String blacknumber = cursor.getString(0);
            int mode = cursor.getInt(1);

            // 将黑名单号码和拦截类型保存到bean类中,方便后面使用
            BlackNumberInfo blackNumberInfo = new BlackNumberInfo(blacknumber,
                    mode);

            // 将bean类存放到集合中,方便listview显示
            list.add(blackNumberInfo);
        }
        // 关闭数据库
        cursor.close();
        database.close();
        return list;
    }

    /**
     * 查询部分数据的操作
     * 
     * 2017-10-23 上午9:50:27
     */
    public List<BlackNumberInfo> queryPartAll(int maxNum, int startIndex) {

        SystemClock.sleep(2000);

        List<BlackNumberInfo> list = new ArrayList<BlackNumberInfo>();

        SQLiteDatabase database = blackNumberOpenHelper.getReadableDatabase();

        // 参数1:执行的sql语句
        // 参数2:sql语句所需的参数
        Cursor cursor = database
                .rawQuery(
                        "select blacknumber,mode from info order by _id desc limit ? offset ?",
                        new String[] { maxNum + "", startIndex + "" });

        while (cursor.moveToNext()) {
            String blacknumber = cursor.getString(0);
            int mode = cursor.getInt(1);

            // 将黑名单号码和拦截类型保存到bean类中,方便后面使用
            BlackNumberInfo blackNumberInfo = new BlackNumberInfo(blacknumber,
                    mode);

            // 将bean类存放到集合中,方便listview显示
            list.add(blackNumberInfo);
        }
        // 关闭数据库
        cursor.close();
        database.close();
        return list;
    }

}

关于上面代码,大家可能会有疑惑,什么时候需要database,什么时候不需要,后面本人上午查询了下,得到的答案是,如果是频繁打开关闭数据库会报错,所以在上面插入,删除什么的就没有关闭database,但是后面的查询所有,这种方法被调用的频率不会很高,间隔至少>1s,所以就关闭了database,最后那个方法是直接执行sql语句,其写法稍微与前面的不同。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值