【Android数据存储】- SQLite Database

【Android数据存储】- SQLite Database,第1张

概述个人学习整理,如有不足之处,请不吝指教。转载请注明:@CSU-Max SQLite Database 简介:         SQLite,是一款轻量级的关系型数据库。由于它占用的资源非常少,所以在很多嵌入式设备都是用SQLite来存储数据。并且它目前支持Windows/Linux/Unix等等主流的 *** 作系统,兼容性还不错。我们也可以用多种开发语言如C#、Java、PHP等来通过ODBC接口 *** 作S

个人学习整理,如有不足之处,请不吝指教。转载请注明:@CSU-Max


sqlite Database 简介: sqlite,是一款轻量级的关系型数据库。由于它占用的资源非常少,所以在很多嵌入式设备都是用sqlite来存储数据。并且它目前支持windows/linux/Unix等等主流的 *** 作系统,兼容性还不错。我们也可以用多种开发语言如C#、Java、PHP等来通过ODBC接口 *** 作sqlite,十分方便。 由于 sqlite 数据库占用资源小,使用简单,故在 AndroID 上存储数据,使用 sqlite 是一种很好的选择。 sqlite 支持的常用的 sql 语句: 创建表: createtableifnotexistsuser(_IDintegerprimarykeyautoincrement,nametext) 删除表: droptableifexistsuser 查询数据: select*fromuser; select*fromuserwhere_ID=2; selectnamefromuser groupbycityhavingcount(*)>1 分页查询: 跳过前面的15跳记录,查询接下来的5跳记录: select*fromuserlimit15,5; select*fromuserlimit5offset15; 插入数据: insertintouser(name)values('CSUMax'); 删除数据: deletefromuserwhere_ID=2; 更新数据: updateusersetname='Cindy'where_ID=3; 基本数据库 *** 作: 1、 *** 作 sqlite 的一般步骤: (1) 获取sqliteDatabase 对象,相当于获取数据库连接; 在 AndroID 中进行数据库 *** 作时,首先使用我们自定义的 sqliteOpenHelper 的子类(如下例中的 DBOpenHelper)的getReadableDatabase()getWritableDatabase() 获取只读或可写的数据库对象sqliteDatabase(如数据库不存在则创建数据库)。 (2)调用sqliteDatabase 的方法来执行SQL语句; sqliteDatabase 中封装了一系列增删改查的方法,当然,也可以使用 execsql 方法执行 sql 语句。 (3) *** 作 SQL语句执行的结果; 对于查询结果,我们可以使用 HashMap,也可以使用 AndorID 为我们提供的 ContentValues 来保存。当使用ListVIEw 等空间来显示多条记录的时候,可以使用我们常用的 List(使用SampleAdapter适配器),也可以直接返回 Cursor(使用 SampleAdapter 适配器)。 (4)关闭 sqliteDatabase 。 完成数据库相关 *** 作之后,要及时释放资源。 2、使用 sqlite 进行简单的增删改查 *** 作: (1)查询数据 db.query(table,columns,selection,selectionArgs,groupBy,having,orderBy) 各参数含义: table :要查询表的表名; columns :查询的列数组 selection :查询条件,中间可以含 “?”; selectionArgs :表示查询条件中参数的数组; groupBy :分组,对应sql中的 group by ; having :对应sql中的 having 语句; orderBy :对应sql中的 order by 语句 ; 查询所有数据: 主要代码:
 /**	 * 查询所有的记录	 * @return	 */	public List<User> queryAll() {		List<User> List = new ArrayList<User>();		sqliteDatabase db = null;		Cursor cursor = null;		try {			//获取只读数据库实例			db = dbOpenHelper.getReadableDatabase();			cursor = db.query("user",null,"_ID desc");			//遍历 Cursor			for (cursor.movetoFirst(); !cursor.isAfterLast(); cursor					.movetoNext()) {				User user = new User();				user.setID(cursor.getInt(cursor.getColumnIndex("_ID")));				user.setname(cursor.getString(cursor.getColumnIndex("name")));				List.add(user);			}		} catch (Exception e) {			e.printstacktrace();		} finally {			if (cursor != null) {				cursor.close();			}			if (db != null) {				db.close();			}		}		return List;	}


根据 ID 查询一条数据: 主要代码:
 /**	 * 根据 ID 查询记录	 * @param ID	 * @return	 */	public User queryUserByID(int ID) {		User user = new User();		sqliteDatabase db = null;		Cursor cursor = null;		try {			//获取只读数据库			db = dbOpenHelper.getReadableDatabase();			cursor = db.query("user","_ID = ?",new String[] { String.valueOf(ID) },null);			if (cursor.movetoFirst()) {				user.setID(cursor.getInt(cursor.getColumnIndex("_ID")));				user.setname(cursor.getString(cursor.getColumnIndex("name")));			}		} catch (Exception e) {			e.printstacktrace();		} finally {			if (cursor != null) {				cursor.close();			}			if (db != null) {				db.close();			}		}		return user;	}
模糊查询:

主要代码:

@H_735_403@ /** * 根据某一字段的部分值进行模糊查询 * * @param word * @return */ public List<User> queryByWord(String word) { List<User> List = new ArrayList<User>(); sqliteDatabase db = null; Cursor cursor = null; try { // 获取只读数据库 db = dbOpenHelper.getReadableDatabase(); cursor = db.query("user","name like ?",new String[] { word + "%" },null); // 遍历 Cursor for (cursor.movetoFirst(); !cursor.isAfterLast(); cursor .movetoNext()) { User user = new User(); user.setID(cursor.getInt(cursor.getColumnIndex("_ID"))); user.setname(cursor.getString(cursor.getColumnIndex("name"))); List.add(user); } } catch (Exception e) { e.printstacktrace(); } finally { if (cursor != null) { cursor.close(); } if (db != null) { db.close(); } } return List; }


(2)插入数据 db.insert(table,nullColumnHack,values) 各参数含义: table :要插入数据的表名; nullColumnHack : 表示当 ContentValues为空时,那一列赋 null 值; values : 表示要插入的列和值。 返回插入成功的行数。 主要代码:
 /**     * 向 user 表中 插入一个 user,将 user 的 name 属性插入到 user 表中的 name 列     * @param user     * @return     */    public long insert(User user) {        sqliteDatabase db = null;        long ID = -1;        try {            db = dbOpenHelper.getWritableDatabase();            ContentValues values = new ContentValues();            values.put("name",user.getname());            ID = db.insert("user",values);        } catch (Exception e) {            e.printstacktrace();        } finally {            if (db != null) {                db.close();            }        }        return ID;    }

(3)删除数据 db.delete(table,whereClause,whereArgs) 各参数含义: table :要删除数据的表名; whereClause : 删除条件,即普通 sql 语句 where 后面的部分,可以带 “?”; whereArgs:参数值数组。 主要代码:
 /**     * 删除指定 ID 的数据     * @param ID     */    public voID delete(int ID) {        sqliteDatabase db = null;        try {            db = dbOpenHelper.getWritableDatabase();            db.delete("user",new String[] { String.valueOf(ID) });        } catch (Exception e) {            e.printstacktrace();        } finally {            if (db != null) {                db.close();            }        }    }

(4)更新数据 db.update(table,values,whereArgs) 各参数含义: table :要更新数据的表名; values :修改的列名和修改后的值; whereClause : 修改条件,即普通 sql 语句 where 后面的部分,可以带 “?”; whereArgs:参数值数组。 返回更新成功的行数。 主要代码:
   /**     * 更新数据 *** 作     * @param user     * @return     */    public long update(User user) {        sqliteDatabase db = null;        long ID = -1;        try {            db = dbOpenHelper.getWritableDatabase();            ContentValues values = new ContentValues();            values.put("name",user.getname());            ID = db.update("user",new String[] { String.valueOf(user.getID()) });        } catch (Exception e) {            e.printstacktrace();        } finally {            if (db != null) {                db.close();            }        }        return ID;    }

2、使用 sqlite 进行数据分页: (1)创建一个分页的类 Page类
public class Page {    // 每页显示的记录数    private int pageSize = 3;    // 当前打的页数    private int pageNum = 1;    // 总的记录数    private int totalCount = 0;    // 总的页数    private int totalNum = 0;    /**     * 是否有下一页     * @return     */    public boolean isHasNext() {        if (pageNum < totalNum) {            return true;        } else {            return false;        }    }    /**     * s是否有上一页     * @return     */    public boolean isHasPre() {        if (pageNum > 1) {            return true;        } else {            return false;        }    }    public int getPageSize() {        return pageSize;    }    public voID setPageSize(int pageSize) {        this.pageSize = pageSize;    }    public int getPageNum() {        return pageNum;    }    public voID setPageNum(int pageNum) {        this.pageNum = pageNum;    }    public int getTotalCount() {        return totalCount;    }    public voID setTotalCount(int totalCount) {        this.totalCount = totalCount;    }    public int getTotalNum() {        return totalNum;    }    public voID setTotalNum(int totalNum) {        this.totalNum = totalNum;    }}

(2)获取某一页的数据

/**     * 获取某一页的数据     *      * @param pageSize     *            每页显示记录数     * @param pageNum     *            当前的页码     * @return     */    public List<User> getPageUser(int pageSize,int pageNum) {        List<User> List = new ArrayList<User>();        sqliteDatabase db = null;        Cursor cursor = null;        try {            // 获取只读数据库实例            db = dbOpenHelper.getReadableDatabase();            // 使用 limit ? offset ? 来进行分页            cursor = db.query("user","_ID asc limit " + String.valueOf(pageSize) + " offset "                            + String.valueOf((pageNum - 1) * pageSize));            // 遍历 Cursor            for (cursor.movetoFirst(); !cursor.isAfterLast(); cursor                    .movetoNext()) {                User user = new User();                user.setID(cursor.getInt(cursor.getColumnIndex("_ID")));                user.setname(cursor.getString(cursor.getColumnIndex("name")));                List.add(user);            }        } catch (Exception e) {            e.printstacktrace();        } finally {            if (cursor != null) {                cursor.close();            }            if (db != null) {                db.close();            }        }        return List;    }

通过以上的代码,我们就完成了初步的分页 *** 作,下面我们对此进行完善一下,获得总页数,增加上一页和下一页功能。 (3)获取总页数 先获取总的记录数,在根据 pageSize 来计算得出总页数:
 /**     * 获取表中总的记录数     *      * @return     */    public int getTotalCount() {        sqliteDatabase db = null;        Cursor cursor = null;        int totalCount = 0;        try {            // 获取只读数据库实例            db = dbOpenHelper.getReadableDatabase();            cursor = db.query("user",null);            // 获取记录数            totalCount = cursor.getCount();        } catch (Exception e) {            e.printstacktrace();        } finally {            if (cursor != null) {                cursor.close();            }            if (db != null) {                db.close();            }        }        return totalCount;    }    /**     * 得到中的页数     *      * @param pageSize     * @return     */    public int getTotalNum(int pageSize) {        int totalNum = 0;        totalNum = getTotalCount() / pageSize + 1;        return totalNum;    }

(4)上下翻页功能
 /**     * 显示下一页的数据     *      * @param pageSize     *            每页显示记录数     * @param pageNum     *            当前的页码     * @return     */    public List<User> getNextPage(int pageSize,int pageNum) {        List<User> List = new ArrayList<User>();        //设置Page对象的属性        Page page = new Page();        page.setPageSize(pageSize);        page.setPageNum(pageNum);        page.setTotalCount(getTotalCount());        page.setTotalNum(getTotalNum(pageSize));        // 判断是否有下一页,有下一页则显示下一页的数据        if (page.isHasNext()) {            List = getPageUser(pageSize,pageNum + 1);        }        return List;    }    /**     * 显示上一页的数据     *      * @param pageSize     *            每页显示记录数     * @param pageNum     *            当前的页码     * @return     */    public List<User> getPrePage(int pageSize,int pageNum) {        List<User> List = new ArrayList<User>();        Page page = new Page();        page.setPageSize(pageSize);        page.setPageNum(pageNum);        page.setTotalCount(getTotalCount());        // 判断是否有上一页,有上一页则显示上一页的数据        if (page.isHasNext()) {            List = getPageUser(pageSize,pageNum - 1);        }        return List;    }

sqlite中的事务管理: sqlite 中同样支持事务。 当我们要向数据库中插入很多的数据时,若使用 for 遍历 insert插入的话,会很消耗资源,影响效率,也不能保证插入的稳定性。因为 sqlite插入数据的时候,默认一条插入语句就是一个事务,这样在进行多条数据插入的时候就会进行多次的磁盘 *** 作,而且不能保证所有的数据都插入正确,这时候使用事务就很方便了。 1、sqlite中事务 *** 作的常用方法: beginTransaction() : 开启事务; endTransaction() : 关闭事务; setTransactionSuccessful() : 设置事务标志位的为成功,当标志位为成功时,endTransaction()就会提交事务, 否则 endTransaction() 会回滚事务。 2、sqlite中事务 *** 作的实例代码:
 public long insert() {        sqliteDatabase db = null;        long ID = 0;        try {            db = dbOpenHelper.getWritableDatabase();            // 开启事务            db.beginTransaction();            ContentValues values = new ContentValues();            for (int i = 0; i < 5; i++) {                values.put("name","姓名" + 1);                ID = db.insert("user",values) + ID;            }            // 设置事务标志位为成功            db.setTransactionSuccessful();        } catch (Exception e) {            e.printstacktrace();        } finally {            if (db != null) {                // 结束事务,根据标志位来决定是提交还是回滚                db.endTransaction();                db.close();            }        }        return ID;    }

关于sqlite的简单使用方法就介绍到这里,下一节将总结 AndroID 中的文件存储数据。

个人学习整理,如有不足之处,请不吝指教。转载请注明:@CSU-Max

总结

以上是内存溢出为你收集整理的【Android数据存储】- SQLite Database全部内容,希望文章能够帮你解决【Android数据存储】- SQLite Database所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/1172847.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-02
下一篇 2022-06-02

发表评论

登录后才能评论

评论列表(0条)

保存