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示例程序下 ...
随机推荐
- VS2015 调试时 编辑并继续不可用
最近在项目中遇到一次调试时 编辑并继续不可用.结合网上说的工具->设置->调试->常规下的一些操作,到后来还是不可用,最后把项目的解决方案平台改成Mixed Platform ,之后 ...
- ATL封装IE内核启示:使用Win32/ATL建立窗口
开发大型GUI界面程序MFC当仁不让,但如果是开发图形应用程序,并不需要大规模界面控件,没有必要链接庞大的MFC库,直接使用platform sdk会很麻烦,这时ATL中的关于Windows的封装就是 ...
- Tomcat7 配置 ssl
运行一个配置了ssl的项目时tomcat总是启动不成功,报错:“requires the APR/native library which is not available”,后来发现是找不到apr的 ...
- android studio/Intellij idea之proguard实践
默认情况下,build->Gene Signed APK 反编译后发现,没有混淆... 多次爬stackoverflow才搞定这个问题: 首先 build variants这里由debug设置为 ...
- java反射技术详解
反射: 其实就是动态的从内存加载一个指定的类,并获取该类中的所有的内容. 反射的好处:大大的增强了程序的扩展性. 反射的基本步骤: 1. 获得Class对象,就是获取到指定的名称的字节码文件对象. 2 ...
- xss其他标签下的js用法总结大全
前段时间我遇到一个问题,就是说普通的平台获取cookie的语句为↓ Default <script src=js地址></script> 1 <scr ...
- WPF计算
设计思路: 用WPF窗体设计,在第一个数和第二个数的文本框中输入数值,单击录题按钮,数值保存在n1,n2文档中,把要做的题都保存完后,单击开始按钮,开始做题,每做完一道题,按Enter键,进入下一题, ...
- 发现meta有个刷新页面的办法。
meta是html中不可缺少的一个标签,它的应用以方便浏览器搜索并分类当前网页的内容. meta总是放在head标签的第一个位置.今天我在复习前端知识的时候,在网上发现了用meta刷新网页的好办法. ...
- 解读ASP.NET 5 & MVC6系列(6):Middleware详解
在第1章项目结构分析中,我们提到Startup.cs作为整个程序的入口点,等同于传统的Global.asax文件,即:用于初始化系统级的信息(例如,MVC中的路由配置).本章我们就来一一分析,在这里如 ...
- 剑指Offer面试题:14.链表的倒数第k个节点
PS:这是一道出境率极高的题目,记得去年参加校园招聘时我看到了3次,但是每次写的都不完善. 一.题目:链表的倒数第k个节点 题目:输入一个链表,输出该链表中倒数第k个结点.为了符合大多数人的习惯,本题 ...