Android SQLite 的介绍和使用(二)

上一节简单介绍了一下SQLite,这一节我们开始SQLite在Android中的应用。

Android提供了一个数据库的帮助类 SQLiteOpenHelper,用于管理数据库的创建和版本管理。我们可以继承这个类,实现它的 onCreateonUpgrade方法。我们可以在这里设置数据库的版本,数据库名称,创建数据库表等。下面看代码:

public class DBHelper extends SQLiteOpenHelper {
    //数据库的版本号必须要大于1
    public final static int DB_VERSION = 1;
    //数据库的名称
    public final static String DB_NAME = "user.db";
    //数据库表名
    public final static String TABLE_NAME = "userInfo";

    public static DBHelper helper = null;

    public static DBHelper getHelper() {
        if (helper == null) {
            helper = new DBHelper(App.getContext());
        }
        return helper;
    }

    private DBHelper(Context context) {
        //调用父类方法创建数据库,CusorFactory 一般为空,使用默认的
        //CursorFactory对象,用来构造查询完毕时返回的Cursor的子类对象,为null时使用默认的CursorFactory构造。
        super(context, DB_NAME, null, DB_VERSION);
    }

    /**
     * 数据库第一次创建时调用,我们在这里执行一些数据库表的创建,初始化等操作
     */
    @Override
    public void onCreate(SQLiteDatabase db) {
        createTableUser(db);
    }

    /**
     * 当数据库更新时调用,我们可以在升级时执行数据库修改;比  如修改表,删除表,添加表等。
     */
    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        if (newVersion > oldVersion) {
            dropTableUser(db);
            createTableUser(db);
        }
    }

    private void createTableUser(SQLiteDatabase db) {
        String sql = "CREATE TABLE " + TABLE_NAME + "(_id integer primary key autoincrement ,NAME TEXT,AGE INT,ADDRESS TEXT);";
        db.execSQL(sql);
    }

    private void dropTableUser(SQLiteDatabase db) {
        String sql = "drop table if exists " + TABLE_NAME;
        db.execSQL(sql);
    }
}

当我们创建好我们数据库帮助类后,我们就可以通过它来进行数据库的操作了。当然我们也可以把一些数据库 增、删、改、查 的方法放到这个数据库帮助类里。

增 (insert):

往数据库表里插入数据一般有两种方式,一个是使用 SQL语句,一个是使用Android 提供的insert方法。

使用SQL 语句

使用SQL语句,我们首先需要组拼一下我们的SQL语句,我们使用StringBuilder:

StringBuilder sql = new StringBuilder();
sql.append("insert into " + DBHelper.TABLE_NAME + "(name,age,address) values(")
    .append(" ‘张三‘").append(",")
    .append("20").append(",")
    .append("‘火星" + i + "号‘")
    .append(" );")

然后 使用数据库的 execSQL 执行这个SQL语句。

mDatabase.execSQL(sql.toString());
Android 提供的insert方法

使用Android 提供的insert方法,需要用到另一个对象ContentValues,它类似于Map,以键值对的形式保存数据,键代表的是表的列名,值代表该列插入的值。具体使用如下。

    ContentValues values = new ContentValues();
    values.put("name", "张三");
    values.put("age", 20);
    values.put("address", "火星1号");

然后调用insert方法:

 mDatabase.insert(DBHelper.TABLE_NAME, null, values);

删(delete):

使用SQL:

组拼SQL:

    StringBuilder builder = new StringBuilder();
    builder.append(" delete from ").append(DBHelper.TABLE_NAME).append(" where _id = ?");

大家应该注意到 SQL 语句末尾的where语句的条件是’?’,这里的’?’起到的是占位符的作用,我们在下面需要使用 “String[]”来填入具体的值,比如这里我们可以:

String[] bindArgs = {"1"};

然后我们调用数据库的 execSQL方法来执行数据的删除:

mDatabase.execSQL(builder.toString(), bindArgs);

它执行的SQL 语句相当于:

delete from userInfo where _id = 1 ;

当然我们也可以自己把条件值直接组拼成String语句。

使用Android提供的delete方法:

Android 提供的delete方法需要提供表名,where子句,where子句的条件,并且这个方法返回的是delete影响到的行数。

    //where子句
    String whereClause = "_id = ?";
    //where字句里的里占位符的值
    String[] whereArgs = {"1"};
    int affectedRows = mDatabase.delete(DBHelper.TABLE_NAME, whereClause, whereArgs);

改(update)

使用SQL 语句

首先我们组拼SQL语句:

    StringBuilder builder = new StringBuilder();
    builder.append("update ").append(DBHelper.TABLE_NAME).append(" set name=?,age=?,address=? where _id=?;");

然后定义数组来表示 set 子句中 ‘?’占位符的值:

Object[] bindArgs = {"赵六", 13, "水星1号", 5};

然后我们调用数据库的 execSQL方法来执行数据的更新:

mDatabase.execSQL(builder.toString(), bindArgs);
使用Android 自带的update方法

使用Android提供的update 方法,需要用到ContentValues对象,来确定需要更新的列和值。

    ContentValues values = new ContentValues();
    values.put("name", "钱八");
    values.put("age", 15);
    values.put("address", "水星2号");

然后我们需要准备好,where子句和where子句中占位的值:

    String whereClause = "_id=?";
    String[] whereArgs = {"4"};

然后调用数据库的update方法执行更新数据的操作:

  mDatabase.update(DBHelper.TABLE_NAME, values, whereClause, whereArgs);

查(select)

使用SQL语句:

Android 查询数据库的结果返回到一个Cursor 对象里。它会定位到第一行之前。所有的数据都是通过下标取得。

首先我需要组拼SQL语句:

 StringBuilder builder = new StringBuilder();
    builder.append(" select * from ").append(DBHelper.TABLE_NAME);

然后调用数据库的 rawQuery 方法来执行查询,它会返回一个Cursor:

Cursor cursor = mDatabase.rawQuery(builder.toString(), null);

由于Cursor获取数据都是通过下标来获取的,Cursor专门提供了一个通过列表获取下标的方法:

cursor.getColumnIndex(列名);

Cursor 定位是定在第一行之前的我们需要调用 moveToNext()定位到第一行,当然还有很多move开头方法,大家可以多研究一下。

这样我们就可以使用循环来获取我们需要的内容了,我们把数据表里的内容都保存到List里面。

    List<User> users = new ArrayList<>();
    while (cursor.moveToNext()) {
        String name = cursor.getString(cursor.getColumnIndex("name"));
        int age = cursor.getInt(cursor.getColumnIndex("age"));
        String address = cursor.getString(cursor.getColumnIndex("address"));
        User user = new User(name, age, address);
        users.add(user);
    }

最后 我们的Cursor对象需要 close 方法,把资源释放掉。

cursor.close();
使用Android提供的query方法:

我们需要提供需要查询的列名:

String[] columns = {"name", "age", "address"};

where条件:

String selection = "_id=?";

where 条件中 ‘?’的替代值:

String[] selectionArgs = {"1"};

我们调用query方法来执行查询:

Cursor cursor = mDatabase.query(DBHelper.TABLE_NAME, columns, selection, selectionArgs, null, null, null);

其中后面的三个数分别为 groupBy子句,having子句,orderBy子句,如果有这些需求可以自己定义。

然后我们再把数据从Cursor里取出来,放到List里。

    List<User> users = new ArrayList<>();
    while (cursor.moveToNext()) {
        String name = cursor.getString(cursor.getColumnIndex("name"));
        int age = cursor.getInt(cursor.getColumnIndex("age"));
        String address = cursor.getString(cursor.getColumnIndex("address"));
        User user = new User(name, age, address);
        users.add(user);
    }

最后关闭 Cursor,释放资源:

 cursor.close();

全部代码如下:

public class DBHelper extends SQLiteOpenHelper {
    //数据库的版本号必须要大于1
    public final static int DB_VERSION = 1;
    //数据库的名称
    public final static String DB_NAME = "user.db";
    //数据库表名
    public final static String TABLE_NAME = "userInfo";

    public static DBHelper helper = null;
    public SQLiteDatabase mDatabase;

    public static DBHelper getHelper() {
        if (helper == null) {
            helper = new DBHelper(App.getContext());
        }
        return helper;
    }

    /**
     * 通过SQLiteOpenerHelper创建数据库表,
     * <p/>
     * getWritableDatabase 与 getReadableDatabase 的区别
     * <p/>
     * getWritableDatabase取得的实例不是仅仅具有写的功能,而是同时具有读和写的功能
     * 同样的,getReadableDatabase 取得的实例也是具对数据库进行读和写的功能
     * 两者的区别在于
     * getWritableDatabase取得的实例是以读写的方式打开数据库,如果打开的数据库磁盘满了,此时只能读不能写,此时调用了getWritableDatabase的实例,那么将会发生错误(异常)
     * getReadableDatabase取得的实例是先调用getWritableDatabase以读写的方式打开数据库,如果数据库的磁盘满了,此时返回打开失败,继而用getReadableDatabase的实例以只读的方式去打开数据库
     */
    private DBHelper(Context context) {
        //调用父类方法创建数据库,CusorFactory 一般为空,使用默认的
        //CursorFactory对象,用来构造查询完毕时返回的Cursor的子类对象,为null时使用默认的CursorFactory构造。
        super(context, DB_NAME, null, DB_VERSION);
        //获取数据库对象。
        mDatabase = getReadableDatabase();
//        mDatabase = getWritableDatabase();
    }

    /**
     * 数据库第一次创建时调用,我们在这里执行一些数据库表的创建,初始化等操作
     */
    @Override
    public void onCreate(SQLiteDatabase db) {
        createTableUser(db);
    }

    /**
     * 当数据库更新时调用,我们可以在升级时执行数据库修改;比如修改表,删除表,添加表等。
     */
    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        if (newVersion > oldVersion) {
            dropTableUser(db);
            createTableUser(db);
        }
    }

    public void createTableUser(SQLiteDatabase db) {
        String sql = "CREATE TABLE " + TABLE_NAME + "(_id integer primary key autoincrement ,NAME TEXT,AGE INT,ADDRESS TEXT);";
        db.execSQL(sql);
    }

    public void dropTableUser(SQLiteDatabase db) {
        String sql = "drop table if exists " + TABLE_NAME;
        db.execSQL(sql);
    }

    /**
     * 查看是否存在某个数据库表
     * <p/>
     * sqlite_master: SQLite数据库都有一个叫 SQLITE_MASTER 的表, 它定义数据库的模式,这个表是只读的
     *
     * @param tableName
     * @return
     */
    public boolean isTableExist(String tableName) {
        String sql = "SELECT COUNT(*) AS c FROM sqlite_master WHERE type=‘table‘ AND name=‘" + tableName + "‘";
        Cursor cursor = mDatabase.rawQuery(sql, null);
        if (cursor.moveToNext()) {
            int count = cursor.getInt(0);
            if (count > 0) {
                return true;
            }
        }
        return false;
    }

    /**
     * 使用SQL 实现插入
     */
    public void insertWithSQL() {
        SQLiteDatabase db = mDatabase;
        db.beginTransaction();
        try {
            for (int i = 0; i < 10; i++) {
                StringBuilder sql = new StringBuilder();
                sql.append("insert into " + DBHelper.TABLE_NAME + "(name,age,address) values(")
                        .append(" ‘张三‘").append(",")
                        .append("20").append(",")
                        .append("‘火星" + i + "号‘")
                        .append(" );");
                db.execSQL(sql.toString());
            }

            db.setTransactionSuccessful();
        } finally {
            db.endTransaction();
        }
    }

    /**
     * 使用 ContentValues 实现插入数据
     */
    public void insert() {
        ContentValues values = new ContentValues();
        values.put("name", "张三");
        values.put("age", 20);
        values.put("address", "火星1号");
        mDatabase.insert(DBHelper.TABLE_NAME, null, values);
    }

    /**
     * 使用SQL 语句删除数据
     */
    public void deleteBySQL() {
        StringBuilder builder = new StringBuilder();
        builder.append(" delete from ").append(DBHelper.TABLE_NAME).append(" where _id = ?");
        String[] bindArgs = {"1"};
        mDatabase.execSQL(builder.toString(), bindArgs);
    }

    /**
     * 使用Android 提供的delete 方法
     *
     * @return
     */
    public int delete() {
        //where子句
        String whereClause = "_id = ?";
        //where字句里的里占位符的值
        String[] whereArgs = {"1"};
        int affectedRows = mDatabase.delete(DBHelper.TABLE_NAME, whereClause, whereArgs);
        return affectedRows;
    }

    /**
     * 使用SQL修改数据
     */
    public void updateBySQL() {
        StringBuilder builder = new StringBuilder();
        builder.append("update ").append(DBHelper.TABLE_NAME).append(" set name=?,age=?,address=? where _id=?;");
        Object[] bindArgs = {"赵六", 13, "水星1号", 5};
        mDatabase.execSQL(builder.toString(), bindArgs);
    }

    /**
     * 使用Android 提供的update方法修改数据
     */
    public void update() {
        ContentValues values = new ContentValues();
        values.put("name", "钱八");
        values.put("age", 15);
        values.put("address", "水星2号");
        String whereClause = "_id=?";
        String[] whereArgs = {"4"};
        mDatabase.update(DBHelper.TABLE_NAME, values, whereClause, whereArgs);
    }

    /**
     * 使用 SQL 实现查询所有数据
     */
    public void queryDataBySql() {
        StringBuilder builder = new StringBuilder();
        builder.append(" select * from ").append(DBHelper.TABLE_NAME);
        Cursor cursor = mDatabase.rawQuery(builder.toString(), null);

        List<User> users = new ArrayList<>();
        while (cursor.moveToNext()) {
            String name = cursor.getString(cursor.getColumnIndex("name"));
            int age = cursor.getInt(cursor.getColumnIndex("age"));
            String address = cursor.getString(cursor.getColumnIndex("address"));
            User user = new User(name, age, address);
            users.add(user);
        }

        LogUtils.e(users + "");
        cursor.close();
    }

    /**
     * 使用 SQL 实现查询某条数据
     */
    public void queryDataBySql1() {
        StringBuilder builder = new StringBuilder();
        builder.append(" select name,age,address from ").append(DBHelper.TABLE_NAME).append(" where _id = ?");
        String[] selectArgs = {"1"};
        Cursor cursor = mDatabase.rawQuery(builder.toString(), selectArgs);

        List<User> users = new ArrayList<>();
        while (cursor.moveToNext()) {
            String name = cursor.getString(cursor.getColumnIndex("name"));
            int age = cursor.getInt(cursor.getColumnIndex("age"));
            String address = cursor.getString(cursor.getColumnIndex("address"));
            User user = new User(name, age, address);
            users.add(user);
        }

        LogUtils.e(users + "");
        cursor.close();
    }

    /**
     * 使用Android提供的 query 方法 ,实现查询所有数据
     */
    public void queryAll() {
        Cursor cursor = mDatabase.query(DBHelper.TABLE_NAME, null, null, null, null, null, null);
        List<User> users = new ArrayList<>();
        while (cursor.moveToNext()) {
            String name = cursor.getString(cursor.getColumnIndex("NAME"));
            int age = cursor.getInt(cursor.getColumnIndex("AGE"));
            String address = cursor.getString(cursor.getColumnIndex("ADDRESS"));
            User user = new User(name, age, address);
            users.add(user);
        }

        LogUtils.e(users + "");
        cursor.close();
    }

    /**
     * 使用Android提供的 query 方法 ,实现查询某条数据
     */
    public void query() {

        //想要查询的那些列
        String[] columns = {"name", "age", "address"};
        //where条件
        String selection = "_id=?";
        //where 条件中 ‘?‘的替代值
        String[] selectionArgs = {"1"};
        Cursor cursor = mDatabase.query(DBHelper.TABLE_NAME, columns, selection, selectionArgs, null, null, null);

        List<User> users = new ArrayList<>();
        while (cursor.moveToNext()) {
            String name = cursor.getString(cursor.getColumnIndex("name"));
            int age = cursor.getInt(cursor.getColumnIndex("age"));
            String address = cursor.getString(cursor.getColumnIndex("address"));
            User user = new User(name, age, address);
            users.add(user);
        }

        LogUtils.e(users + "");
        cursor.close();
    }

}
时间: 2024-10-20 23:15:52

Android SQLite 的介绍和使用(二)的相关文章

Android的SQLite使用介绍

Android的SQLite使用介绍 一.SQLite的简介 Android当中内置SQLite数据库,那个SQLite有什么特点呢? SQLite 是一个开源的嵌入式关系数据库,实现自包容.零配置.支持事务的SQL数据库引擎. 其特点是高度便携.使用方便.结构紧凑.高效.可靠. 与其他数据库管理系统不同,SQLite 的安装和运行非常简单,在大多数情况下 - 只要确保SQLite的二进制文件存在即可开始创建.连接和使用数据库.在于个人使用SQLite的体验中,SQLite最大的优点就是高度便携

Android的学习之路(二)项目中原生文件的使用场景和文件介绍

1.src文件:java源代码存放目录 2.gen 文件:自动生成所有由android开发工具自动生成的文件,目录中最重要的就是R.java文件,这个文件由android开 发工具自动产生的.android开发工具会自动根据你存放res目录的资源,同步更新修稿R.java文件,正因为 R.java文件是由开发工具自动生成的,所以我们应避免手工修改R.java.R.java文件在应用中起到了字典的作 用,它包含了各种资源的ID,通过R.java,应用可以很方便的找到对应资源, 2.1R.java 

Android+Sqlite 实现古诗阅读应用(二)

传送门:Android+Sqlite 实现古诗阅读应用(一):http://www.cnblogs.com/lfk-dsk/p/4492974.html Hi,又回来了,最近接到很多热情洋溢的小伙伴们的来信,吼开心哈,我会继续努力的=-=! 上回的东西我们做到了有个textview能随机选择诗来进行显示,这也是我做这个东西的初衷,我想找我到底有哪些古诗没有读过,更想感受一下风吹哪页看哪页的闲适(扯远了=-=!),所以功能现在差不多算是结束了, 不过一个古诗应用这么丑可不行,还有就是,我找到了我要

Android SQLite总结(一)

前言 对于Android平台来说,系统内置了丰富的API来供开发人员操作SQLite,我们可以轻松的完成对数据的存取.下面就向大家介绍一下SQLite常用的操作方法.本篇文章主要用到SQLiteDatabase的一些函数.废话少说,直接贴代码!由于数据库中操作的对象时Student类,因此我们看一下Student.java代码: [java]   view plain copy <EMBED id=ZeroClipboardMovie_1 name=ZeroClipboardMovie_1 ty

Android SQLite总结(一) (转)

Android SQLite总结(一)  郑海波 2012-08-21 转载请声明:http://blog.csdn.net/nuptboyzhb/article/details/7891887 前言 对于Android平台来说,系统内置了丰富的API来供开发人员操作SQLite,我们可以轻松的完成对数据的存取.下面就向大家介绍一下SQLite常用的操作方法.本篇文章主要用到SQLiteDatabase的一些函数.废话少说,直接贴代码!由于数据库中操作的对象时Student类,因此我们看一下St

android SQLite使用SQLiteOpenHelper类对数据库进行操作

链接地址:http://byandby.iteye.com/blog/835580 一. SQLite介绍 SQLite是android内置的一个很小的关系型数据库. SQLite的官网是http://www.sqlite.org/,可以去下载一些文档或相关信息. 博客中有一篇有稍微详细一点的介绍,大家可以去看一下. 二. SQLiteOpenHelper的使用方法 SQLiteOpenHelper是一个辅助类来管理数据库的创建和版本. 可以通过继承这个类,实现它的一些方法来对数据库进行一些操作

(转)Android 之 StrictMode 介绍

最新的Android平台中(Android 2.3起),新增加了一个新的类,叫StrictMode(android.os.StrictMode).这个类可以用来帮助开发者改进他们编写的应用,并且提供了各种的策略,这些策略能随时检查和报告开发者开发应用中存在的问题,比如可以监视那些本不应该在主线程中完成的工作或者其他的一些不规范和不好的代码. StrictMode有多种不同的策略,每一种策略又有不同的规则,当开发者违背某个规则时,每个策略都有不同的方法去显示提醒用户.在本文中,将举例子说明如何使用

Android发展简单介绍

Android一词的本义指“机器人”,同一时候也是Google于2007年11月5日宣布的基于Linux平台的开源手机操作系统的名称,该平台由操作系统.中间件.用户界面和应用软件组成,号称是首个为移动终端打造的真正开放和完整的移动软件.眼下最好的是Android2.0的摩托罗拉Droid Android公司介绍 国家:美国 业务:手机软件,操作系统 成立于:2003年 创办人:Andy Rubin,Andy McFadden.Richard Miner Chris White 中文名:安卓 眼下

Android多媒体开发介绍(转)

Android多媒体开发介绍 转自:http://blog.csdn.net/reiliu/article/details/9060557 一.       多媒体架构 基于第三方PacketVideo公司的OpenCORE来实现,支持所有通用的音频/视频/静态图像格式,包括:MPEG4.H.264.MP3.AAC.AMR.JPG.PNG.GIF等.从功能上分为两部分,一是音/视频的回放(PlayBack),二是音视频的纪录(Recorder). CODEC(编解码器)使用OpenMAX 1L