前言:

本来没有打算整理有关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. 经典排序算法 – 插入排序Insertion sort

    经典排序算法 – 插入排序Insertion sort  插入排序就是每一步都将一个待排数据按其大小插入到已经排序的数据中的适当位置,直到全部插入完毕. 插入排序方法分直接插入排序和折半插入排序两种, ...

  2. Nonblocking I/O and select()

    This sample program illustrates a server application that uses nonblocking and the select() API. Soc ...

  3. Python3.5 day4作业:对员工信息文件,实现增删改查操作。

    需求: 1.可进行模糊查询,语法至少支持下面3种: 1.select name,age from staff_table where age > 22 2.select  * from staf ...

  4. 关于Linux系统下错误“浮点数异常(核心已转储)”的分析

    1.问题发现 有这样一段代码: #include <stdio.h> int main() { int a, b, num1, num2, temp; printf("pleas ...

  5. Mybatis添加到Spring

    一.准备工作: 1.1 添加相应的jar包依赖: 这里用到了两个jar包,一个是mybatis的,另一个是mybatis-spring的,代码如下: 1 2 3 4 5 6 7 8 9 10 < ...

  6. [译]Modern Core Graphics with Swift系列

    第一篇 想象一下你已经完成了你的app并且运行的很好,但是界面看上去太土,你可以在PS里面画好多不同尺寸的自定义控件,Apple并没有4x的retina屏幕. 或者你已经未雨绸缪,在代码中使用Core ...

  7. DES算法

    好久没写过博客啦,最近在gao搞Qt,做出漂亮的UI确实挺难的,做美工也不简单啊,好啦,言归正传,下面是实现DES的python源码,是借鉴了开源中国一个大师的源码写出来的,直接贴啦. 加密部分: # ...

  8. 如何在select下拉列表中添加复选框?

    近来在给一个公司做考试系统的项目,遇到的问题不少,但其中的几个让我对表单的使用颇为感兴趣,前端程序员都知道,下拉列表有select标签,复选框有checkbox,但是两者合在一起却少有人去研究,当时接 ...

  9. [LeetCode] All solution

    比较全的leetcode答案集合: kamyu104/LeetCode grandyang

  10. WebClient 数据传输

    数据提交 post  ,get public string WebClientPost(string PostData, string PostUrl, string Type) { string p ...