前言:

本来没有打算整理有关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的介绍及使用的更多相关文章

  1. Android数据存储:SQLite

    Android数据存储之SQLite SQLite:Android提供的一个标准的数据库,支持SQL语句.用来处理数据量较大的数据.△ SQLite特征:1.轻量性2.独立性3.隔离性4.跨平台性5. ...

  2. Android数据存储之SQLite数据库

    Android数据存储 之SQLite数据库简介 SQLite的相关知识,并结合Java实现对SQLite数据库的操作. SQLite是D.Richard Hipp用C语言编写的开源嵌入式数据库引擎. ...

  3. 【转载】Android数据存储之SQLite

    SQLite是D.Richard Hipp用C语言编写的开源嵌入式数据库引擎.它支持大多数的SQL92标准,并且可以在所有主要的操作系统上运行. 在Android中创建的SQLite数据库存储在:/d ...

  4. Android数据存储之SQLite使用

    SQLite是D.Richard Hipp用C语言编写的开源嵌入式数据库引擎.它支持大多数的SQL92标准,并且可以在所有主要的操作系统上运行. 在Android中创建的SQLite数据库存储在:/d ...

  5. android数据存储之Sqlite(二)

    SQLite学习笔记 前言:上一章我们介绍了sqlite的一些基本知识以及在dos命令下对sqlite进行的增删改查的操作,这一章我们将在android项目中实际来操作sqlite. 1. SQLit ...

  6. Android数据存储之SQLite的操作

    Android作为一个应用在移动设备上的操作系统,自然也就少不了数据的存储.然而SQLite作为一个轻型的关系型数据库,基于其轻量.跨平台.多语言接口及安全性等诸多因数考虑,因而Android较大的数 ...

  7. Android数据存储之SQLite 数据库学习

    Android提供了五种存取数据的方式 (1)SharedPreference,存放较少的五种类型的数据,只能在同一个包内使用,生成XML的格式存放在设备中 (2) SQLite数据库,存放各种数据, ...

  8. 【Android 应用开发】Android 数据存储 之 SQLite数据库详解

    . 作者 :万境绝尘 转载请注明出处 : http://blog.csdn.net/shulianghan/article/details/19028665 . SQLiteDataBase示例程序下 ...

  9. Android 数据存储 之 SQLite数据库详解

    . 作者 :万境绝尘 转载请注明出处 : http://blog.csdn.net/shulianghan/article/details/19028665 . SQLiteDataBase示例程序下 ...

随机推荐

  1. VS2015 调试时 编辑并继续不可用

    最近在项目中遇到一次调试时 编辑并继续不可用.结合网上说的工具->设置->调试->常规下的一些操作,到后来还是不可用,最后把项目的解决方案平台改成Mixed Platform ,之后 ...

  2. ATL封装IE内核启示:使用Win32/ATL建立窗口

    开发大型GUI界面程序MFC当仁不让,但如果是开发图形应用程序,并不需要大规模界面控件,没有必要链接庞大的MFC库,直接使用platform sdk会很麻烦,这时ATL中的关于Windows的封装就是 ...

  3. Tomcat7 配置 ssl

    运行一个配置了ssl的项目时tomcat总是启动不成功,报错:“requires the APR/native library which is not available”,后来发现是找不到apr的 ...

  4. android studio/Intellij idea之proguard实践

    默认情况下,build->Gene Signed APK 反编译后发现,没有混淆... 多次爬stackoverflow才搞定这个问题: 首先 build variants这里由debug设置为 ...

  5. java反射技术详解

    反射: 其实就是动态的从内存加载一个指定的类,并获取该类中的所有的内容. 反射的好处:大大的增强了程序的扩展性. 反射的基本步骤: 1. 获得Class对象,就是获取到指定的名称的字节码文件对象. 2 ...

  6. xss其他标签下的js用法总结大全

    前段时间我遇到一个问题,就是说普通的平台获取cookie的语句为↓           Default <script src=js地址></script> 1 <scr ...

  7. WPF计算

    设计思路: 用WPF窗体设计,在第一个数和第二个数的文本框中输入数值,单击录题按钮,数值保存在n1,n2文档中,把要做的题都保存完后,单击开始按钮,开始做题,每做完一道题,按Enter键,进入下一题, ...

  8. 发现meta有个刷新页面的办法。

    meta是html中不可缺少的一个标签,它的应用以方便浏览器搜索并分类当前网页的内容. meta总是放在head标签的第一个位置.今天我在复习前端知识的时候,在网上发现了用meta刷新网页的好办法. ...

  9. 解读ASP.NET 5 & MVC6系列(6):Middleware详解

    在第1章项目结构分析中,我们提到Startup.cs作为整个程序的入口点,等同于传统的Global.asax文件,即:用于初始化系统级的信息(例如,MVC中的路由配置).本章我们就来一一分析,在这里如 ...

  10. 剑指Offer面试题:14.链表的倒数第k个节点

    PS:这是一道出境率极高的题目,记得去年参加校园招聘时我看到了3次,但是每次写的都不完善. 一.题目:链表的倒数第k个节点 题目:输入一个链表,输出该链表中倒数第k个结点.为了符合大多数人的习惯,本题 ...