Android数据存储之Sqlite的介绍及使用
前言:
本来没有打算整理有关Sqlite数据库文章的,最近一直在研究ContentProvider的使用,所有觉得还是先对Sqlite进行一个简单的回顾,也方便研究学习ContentProvider。
Sqlite简介:
Sqlite数据库是一种轻量级数据库,它具备跨平台,多语言操作等优点,它广泛用于包括浏览器、IOS,Android以及一些便携需求的小型web应用系统。它具备占用资源低,处理速度快等优点。
接下来具体介绍一下如何 使用?
如何创建一个数据库?
public class DBHelper extends SQLiteOpenHelper {
private static final String TAG = "DatabaseHelper";
private static final String DB_NAME = "test_db";//数据库名字
public static String TABLE_NAME = "person";// 表名
public static String FIELD_ID = "id";// 列名
public static String FIELD_NAME= "name";// 列名
private static final int DB_VERSION = 1; // 数据库版本 public DBHelper(Context context) {
super(context, DB_NAME, null, DB_VERSION);
} /**
* 创建数据库
* @param db
*/
@Override
public void onCreate(SQLiteDatabase db) {
//创建表
String sql = "CREATE TABLE " + TABLE_NAME + "(" + FIELD_ID + " integer primary key autoincrement , " + FIELD_NAME + " text not null);";
try {
db.execSQL(sql);
} catch (SQLException e) {
Log.e(TAG, "onCreate " + TABLE_NAME + "Error" + e.toString());
return;
}
} /**
* 数据库升级
* @param db
* @param oldVersion
* @param newVersion
*/
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
} }
SQLiteOpenHelper是SQLiteDatabase的一个帮助类,主要用于操作数据库和数据库升级,一般需要自定义个DBHelper类来继承SQLiteOpenHelper,具体实现参考上面的代码。 如何创建和打开一个可以操作的数据库?
//获取可写数据库
SQLiteDatabase db = dbHelper.getWritableDatabase(); //获取可读数据库
SQLiteDatabase db = dbHelper.getReadableDatabase();
如何添加一个数据?
//获取写数据库
SQLiteDatabase db = dbHelper.getWritableDatabase();
//生成要修改或者插入的键值
ContentValues cv = new ContentValues();
cv.put(DBHelper.FIELD_NAME, name);
// insert 操作
db.insert(DBHelper.TABLE_NAME, null, cv);
//关闭数据库
db.close();
如何删除一条数据?
//生成条件语句
StringBuffer whereBuffer = new StringBuffer();
whereBuffer.append(DBHelper.FIELD_NAME).append(" = ").append("'").append(name).append("'");
//获取写数据库
SQLiteDatabase db = dbHelper.getWritableDatabase();
// delete 操作
db.delete(DBHelper.TABLE_NAME, whereBuffer.toString(), null);
//关闭数据库
db.close();
如何更新一条数据?
//生成条件语句
StringBuffer whereBuffer = new StringBuffer();
whereBuffer.append(DBHelper.FIELD_NAME).append(" = ").append("'").append(name).append("'");
//生成要修改或者插入的键值
ContentValues cv = new ContentValues();
cv.put(DBHelper.FIELD_NAME, name+name);
//获取写数据库
SQLiteDatabase db = dbHelper.getWritableDatabase();
// update 操作
db.update(DBHelper.TABLE_NAME, cv, whereBuffer.toString(), null);
//关闭数据库
db.close();
除了以上操作SQLiteDatabase 还提供了直接执行sql语句的函数
//获取写数据库
SQLiteDatabase db = dbHelper.getWritableDatabase();
//直接执行sql语句
db.execSQL(sql);//或者
//关闭数据库
db.close();
如何查询数据呢?
//生成条件语句
StringBuffer whereBuffer = new StringBuffer();
whereBuffer.append(DBHelper.FIELD_NAME).append(" = ").append("'").append(name).append("'");
//指定要查询的是哪几列数据
String[] columns = {DBHelper.FIELD_NAME};
//获取可读数据库
SQLiteDatabase db = dbHelper.getReadableDatabase();
//查询数据库
Cursor cursor = null;
try {
cursor = db.query(DBHelper.TABLE_NAME, columns, whereBuffer.toString(), null, null, null, null);
if (cursor != null && cursor.getCount() > 0) {
int count = cursor.getColumnCount();
String columName = cursor.getColumnName(0);
String tname = cursor.getString(0);
Log.e(TAG, "count = " + count + " columName = " + columName + " name = " +tname);
cursor.moveToFirst();
}
if (cursor != null) {
cursor.close();
}
} catch (SQLException e) {
Log.e(TAG, "queryDatas" + e.toString());
}
//关闭数据库
db.close();
参数解说:
- table:表名称
- colums:列名称数组
- selection:条件子句,相当于where
- selectionArgs:条件语句的参数数组
- groupBy:分组
- having:分组条件
- orderBy:排序类
- limit:分页查询的限制
- Cursor:返回值,相当于结果集ResultSet
如何开启事务?
//获取写数据库
SQLiteDatabase db = dbHelper.getWritableDatabase();
db.beginTransaction(); //手动设置开始事务
try{
//在此处理批量操作
for(int i =0;i<testCount;i++ ){
//生成要修改或者插入的键值
ContentValues cv = new ContentValues();
cv.put(DBHelper.FIELD_NAME, String.valueOf(i));
// insert 操作
db.insert(DBHelper.TABLE_NAME, null, cv);
}
db.setTransactionSuccessful(); //设置事务处理成功,不设置会自动回滚不提交
}catch(Exception e){ }finally{
db.endTransaction(); //处理完成
//关闭数据库
db.close();
}
知识扩展:
1.) 数据库数据安全问题探讨?数据库默认存放位置data/data/pakage/database目录下,以明文存储,获取root权限之后可以任意访问。所以后续要研究一下数据库加密。
总结的文章链接:http://www.cnblogs.com/whoislcj/p/5511522.html
2.)数据操作之后忘记关闭数据库或者查询数据时Cursor忘记关闭引起的内存溢出。
文章最后附上自己写的一个数据库管理类:
/**
* 数据库管理者 - 提供数据库封装
*
*/
public class DBManager {
private static final String TAG = "DatabaseManager";
// 静态引用
private volatile static DBManager mInstance;
// DatabaseHelper
private DBHelper dbHelper; private DBManager(Context context) {
dbHelper = new DBHelper(context.getApplicationContext());
} /**
* 获取单例引用
*
* @param context
* @return
*/
public static DBManager getInstance(Context context) {
DBManager inst = mInstance;
if (inst == null) {
synchronized (DBManager.class) {
inst = mInstance;
if (inst == null) {
inst = new DBManager(context);
mInstance = inst;
}
}
}
return inst;
} /**
* 插入数据
*/
public void insertData(String name) {
//获取写数据库
SQLiteDatabase db = dbHelper.getWritableDatabase();
//生成要修改或者插入的键值
ContentValues cv = new ContentValues();
cv.put(DBHelper.FIELD_NAME, name);
// insert 操作
db.insert(DBHelper.TABLE_NAME, null, cv);
//关闭数据库
db.close();
} /**
* 未开启事务批量插入
* @param testCount
*/
public void insertDatasByNomarl(int testCount){
//获取写数据库
SQLiteDatabase db = dbHelper.getWritableDatabase();
for(int i =0;i<testCount;i++ ){
//生成要修改或者插入的键值
ContentValues cv = new ContentValues();
cv.put(DBHelper.FIELD_NAME, String.valueOf(i));
// insert 操作
db.insert(DBHelper.TABLE_NAME, null, cv);
Log.e(TAG, "insertDatasByNomarl");
}
//关闭数据库
db.close();
} /**
* 测试开启事务批量插入
* @param testCount
*/
public void insertDatasByTransaction(int testCount){
//获取写数据库
SQLiteDatabase db = dbHelper.getWritableDatabase();
db.beginTransaction(); //手动设置开始事务
try{
//批量处理操作
for(int i =0;i<testCount;i++ ){
//生成要修改或者插入的键值
ContentValues cv = new ContentValues();
cv.put(DBHelper.FIELD_NAME, String.valueOf(i));
// insert 操作
db.insert(DBHelper.TABLE_NAME, null, cv);
Log.e(TAG, "insertDatasByTransaction");
}
db.setTransactionSuccessful(); //设置事务处理成功,不设置会自动回滚不提交
}catch(Exception e){ }finally{
db.endTransaction(); //处理完成
//关闭数据库
db.close();
}
} /**
* 删除数据
*/
public void deleteData(String name) {
//生成条件语句
StringBuffer whereBuffer = new StringBuffer();
whereBuffer.append(DBHelper.FIELD_NAME).append(" = ").append("'").append(name).append("'");
//获取写数据库
SQLiteDatabase db = dbHelper.getWritableDatabase();
// delete 操作
db.delete(DBHelper.TABLE_NAME, whereBuffer.toString(), null);
//关闭数据库
db.close();
} /**
* 删除所有数据
*/
public void deleteDatas()
{
String sql="delete from "+ DBHelper.TABLE_NAME;
execSQL(sql);
} /**
* 更新数据
*/
public void updateData(String name) {
//生成条件语句
StringBuffer whereBuffer = new StringBuffer();
whereBuffer.append(DBHelper.FIELD_NAME).append(" = ").append("'").append(name).append("'");
//生成要修改或者插入的键值
ContentValues cv = new ContentValues();
cv.put(DBHelper.FIELD_NAME, name+name);
//获取写数据库
SQLiteDatabase db = dbHelper.getWritableDatabase();
// update 操作
db.update(DBHelper.TABLE_NAME, cv, whereBuffer.toString(), null);
//关闭数据库
db.close();
} /**
* 指定条件查询数据
*/
public void queryDatas(String name){
//生成条件语句
StringBuffer whereBuffer = new StringBuffer();
whereBuffer.append(DBHelper.FIELD_NAME).append(" = ").append("'").append(name).append("'");
//指定要查询的是哪几列数据
String[] columns = {DBHelper.FIELD_NAME};
//获取可读数据库
SQLiteDatabase db = dbHelper.getReadableDatabase();
//查询数据库
Cursor cursor = null;
try {
cursor = db.query(DBHelper.TABLE_NAME, columns, whereBuffer.toString(), null, null, null, null);
while (cursor.moveToNext()) {
int count = cursor.getColumnCount();
String columName = cursor.getColumnName(0);
String tname = cursor.getString(0);
Log.e(TAG, "count = " + count + " columName = " + columName + " name = " +tname);
}
if (cursor != null) {
cursor.close();
}
} catch (SQLException e) {
Log.e(TAG, "queryDatas" + e.toString());
}
//关闭数据库
db.close();
} /**
* 查询全部数据
*/
public void queryDatas(){
//指定要查询的是哪几列数据
String[] columns = {DBHelper.FIELD_NAME};
//获取可读数据库
SQLiteDatabase db = dbHelper.getReadableDatabase();
//查询数据库
Cursor cursor = null;
try {
cursor = db.query(DBHelper.TABLE_NAME, columns, null, null, null, null, null);//获取数据游标
while (cursor.moveToNext()) {
int count = cursor.getColumnCount();
String columeName = cursor.getColumnName(0);//获取表结构列名
String name = cursor.getString(0);//获取表结构列数据
Log.e(TAG, "count = " + count + " columName = " + columeName + " name = " +name);
}
//关闭游标防止内存泄漏
if (cursor != null) {
cursor.close();
}
} catch (SQLException e) {
Log.e(TAG, "queryDatas" + e.toString());
}
//关闭数据库
db.close();
} /**
* 执行sql语句
*/
private void execSQL(String sql){
//获取写数据库
SQLiteDatabase db = dbHelper.getWritableDatabase();
//直接执行sql语句
db.execSQL(sql);//或者
//关闭数据库
db.close();
} }
Android数据存储之Sqlite的介绍及使用的更多相关文章
- Android数据存储:SQLite
Android数据存储之SQLite SQLite:Android提供的一个标准的数据库,支持SQL语句.用来处理数据量较大的数据.△ SQLite特征:1.轻量性2.独立性3.隔离性4.跨平台性5. ...
- Android数据存储之SQLite数据库
Android数据存储 之SQLite数据库简介 SQLite的相关知识,并结合Java实现对SQLite数据库的操作. SQLite是D.Richard Hipp用C语言编写的开源嵌入式数据库引擎. ...
- 【转载】Android数据存储之SQLite
SQLite是D.Richard Hipp用C语言编写的开源嵌入式数据库引擎.它支持大多数的SQL92标准,并且可以在所有主要的操作系统上运行. 在Android中创建的SQLite数据库存储在:/d ...
- Android数据存储之SQLite使用
SQLite是D.Richard Hipp用C语言编写的开源嵌入式数据库引擎.它支持大多数的SQL92标准,并且可以在所有主要的操作系统上运行. 在Android中创建的SQLite数据库存储在:/d ...
- android数据存储之Sqlite(二)
SQLite学习笔记 前言:上一章我们介绍了sqlite的一些基本知识以及在dos命令下对sqlite进行的增删改查的操作,这一章我们将在android项目中实际来操作sqlite. 1. SQLit ...
- Android数据存储之SQLite的操作
Android作为一个应用在移动设备上的操作系统,自然也就少不了数据的存储.然而SQLite作为一个轻型的关系型数据库,基于其轻量.跨平台.多语言接口及安全性等诸多因数考虑,因而Android较大的数 ...
- Android数据存储之SQLite 数据库学习
Android提供了五种存取数据的方式 (1)SharedPreference,存放较少的五种类型的数据,只能在同一个包内使用,生成XML的格式存放在设备中 (2) SQLite数据库,存放各种数据, ...
- 【Android 应用开发】Android 数据存储 之 SQLite数据库详解
. 作者 :万境绝尘 转载请注明出处 : http://blog.csdn.net/shulianghan/article/details/19028665 . SQLiteDataBase示例程序下 ...
- Android 数据存储 之 SQLite数据库详解
. 作者 :万境绝尘 转载请注明出处 : http://blog.csdn.net/shulianghan/article/details/19028665 . SQLiteDataBase示例程序下 ...
随机推荐
- Shader实例:序列帧动画
效果: 序列帧图片网上随便找的,质量不是很好,重点不是它,不要在意. 思路: 1.之前都是在一张面片上直接映射一张纹理,IN.uv的范围是0~1 现在要映射一张纹理上的一小块区域,就要用这块区域的uv ...
- django _meta方法
models.Book._meta.'concrete_model': <class 'books.models.Book'> models.Book._meta.'related_fke ...
- / fluxChatDemo / 系列 ——fluxDemoChat 组件编写
还是用各部分来表示过程吧,没文采,就先这样记着吧 嘻嘻 梳理问题: 编写es6风格的组件时,需要引入import React from ‘react’ 然后页面就华丽丽的展示出了我写的1.2两个字 在 ...
- 网络问卷调查js实现代码
昨天一个同行妹纸写了一个网络问卷调查的效果,但是有bug,于是就来问我该如何解决这个bug.经过我的分析,bug主要还是出在复选框的那部分,经过修改,bug问题解决,现在贴出如下代码,仅供大家参考: ...
- 移动前端不得不了解的html5 head 头标签
本文主要内容来自一丝的常用的 HTML 头部标签和百度FEX的HTML head 头标签. 移动端的工作已经越来越成为前端工作的重要内容,除了平常的项目开发,HTML 头部标签功能,特别是meta标签 ...
- aspnet webapi 跨域请求 405错误
跨域,请求按要求配置完毕之后,options预请求老是报错.原因是webapi 默认的web.config有配置 <handlers> <remove name="Exte ...
- 【转载】在 2016 年做 PHP 开发是一种什么样的体验?(一)
转自:https://www.v2ex.com/t/312651 在 2016 年做 PHP 开发是一种什么样的体验?(一) 嘿,我最近接到一个网站开发的项目,不过老实说,我这两年没怎么接触编程,听说 ...
- 【转】POJ题目分类推荐 (很好很有层次感)
OJ上的一些水题(可用来练手和增加自信) (poj3299,poj2159,poj2739,poj1083,poj2262,poj1503,poj3006,poj2255,poj3094)初期: 一. ...
- 在SQLSERVER里,怎么让别人只能输入一个字母的约束该怎么写?就是26个字母中的任意一个?
alter table 表名 add constraint ck_char check(自段名 like '[a-z]' or 自段名 like '[A-Z]')
- 【JSOI2007】【Bzoj1029】建筑抢修
贪心... 按照T2来进行排序,用堆来进行维护.循环一遍,如果循环时间加上已用时间不超过截止时间,那就ANS++.否则,将它与堆顶判断,如果小于堆顶就把堆顶踢出,把它加入. #include<c ...