最近看了网上的关于Android SQLite数据库的视频教程,在这里做个笔记记录一下一些常用的操作,在文章最后会给出源码。
孙子兵法有言:知己知彼方能百战不殆,既然用sqlite,那我们首先先来了解一下什么是sqlite?
首先嵌入式数据库是不需要独立运行有专门的数据库引擎的,由程序直接调用相应的API实现对数据库的存取操作,它是程序驱动式的,不同于SQLServer、DB2、MySQL、Oracle这些引擎响应式的。sqlite就是一款开源的轻量级的可嵌入的关系型数据库,特点是系统开销小(通常只需要几百KB的内存就足够了)、检索效率高、应用范围广,sqlite不仅支持标准的SQL语法,还遵循了数据库的ACID事务,保证了数据的完整性,同时也提高了运行的速度。下面先来看一些基础知识:
1.sqlite数据库的数据类型:Integer、varchar(10)、float、double、char(10)、text
2.日常开发中较为常用的sql语句:
创建表:create table 表名(字段名称 数据类型 约束条件,字段名称 数据类型 约束条件......)
例如:create table person(_id Integer primary key,name varchar(10),age Integer not null)
删除表:drop table 表名
例如:drop table person
插入数据:insert into 表名[字段,字段] values(值1,值2......)
例如:insert into person(_id,age) values(1,20) 表名后面指定了要插入的字段名称,则values中根据字段名对应赋值即可
insert into person values(2,"archie",24) 表名后面没有指定具体要插入的字段名,则values中要根据表结构一一给出相应的值
修改表:update 表名 set 字段=新值 where 修改的条件
例如:update person set name="jarchie",age=23 where _id=2
删除数据:delete from 表名 where 删除的条件
例如:delete from person where _id=2
查询语句:select 字段 from 表名 where 查询条件 group by 分组的字段 having 筛选条件 order by 排序字段
例如:查询所有:select * from person
模糊查询:select * from person where name like "%小%" select * from person where name like "_小%"
排序:select * from person where age>18 order by _id
好了,了解了以上的知识点之后,我们一起来看一下sqlite数据库在android中具体该如何使用呢?
首先来看如何创建数据库?
Android底层为我们提供了一个SQLiteOpenHelper的帮助类,里面封装了创建和使用数据库的各种方法,我们只需要定义自己的类去继承SQLiteOpenHelper,实现里面的方法即可。
public class MySqliteHelper extends SQLiteOpenHelper其中,onCreate()方法是在数据库创建时回调的函数:
/** * 当数据库创建时回调的函数 * @param db 数据库对象 */ @Override public void onCreate(SQLiteDatabase db) { Log.e(TAG, "onCreate: " + "------onCreate-----" ); }
然后,我们在我们的活动页中首先需要拿到我们的MySqliteHelper对象,然后通过调用helper.getWriteableDatabase()方法就可以创建数据库了:
helper = DbManager.getInstance(this);
/** * getReadableDatabase()和getWritableDatabase()创建或者打开数据库 * 如果数据库不存在则创建数据库,如果数据库存在直接打开数据库 * 默认情况下两个函数都表示打开或者创建可读可写的数据库对象,如果磁盘已满或者数据库 * 本身权限等情况下getReadableDatabase()打开的是只读数据库 */ SQLiteDatabase db = helper.getWritableDatabase();接下来我们来看一下对数据库的一些常用操作,在本篇中先来看一下sqlite的增删改操作,对于这部分我们有两种实现方式,一种是直接通过执行sql语句进行相关的操作,另一种是通过android中的api进行操作,下面先来看一下第一种实现方式:
首先定义一个数据库的操作类,在该类中我们定义一个数据库的公共的执行方法,便于调用:
/** * 根据sql语句在数据库中执行语句 * @param db 数据库对象 * @param sql sql语句 */ public static void execSql(SQLiteDatabase db,String sql){ if (db != null){ if (!TextUtils.isEmpty(sql)){ db.execSQL(sql); } } }
然后在我们的页面中开始进行相关的操作,分别是插入数据,修改数据,删除数据等操作:
插入操作:
db = helper.getWritableDatabase(); String sql = "insert into "+ Constant.TABLE_NAME+" values(1,'Archie',24)"; DbManager.execSql(db,sql); String sql1 = "insert into "+ Constant.TABLE_NAME+" values(2,'Jackson',25)"; DbManager.execSql(db,sql1); db.close();
修改数据:
db = helper.getWritableDatabase(); String sql2 = "update "+Constant.TABLE_NAME+" set "+Constant.NAME +"='angel' where "+Constant._ID+"=1"; DbManager.execSql(db,sql2); db.close();
删除数据:
db = helper.getWritableDatabase(); String sql3 = "delete from "+Constant.TABLE_NAME+" where "+Constant._ID+"=2"; DbManager.execSql(db,sql3); db.close();通过这些操作我们就可以完成数据的增删改功能,但是这种方式有个前提条件是我们得熟练的去运用sql语句。所以,下面我们来看看使用第二种方式该如何实现?
插入数据:
db = helper.getWritableDatabase(); /** * insert(String table, String nullColumnHack, ContentValues values) * table:表名 nullColumnHack:一般指定为null values:键为String的HashMap集合 * return long 表示插入数据的列数 */ ContentValues values = new ContentValues(); values.put(Constant._ID,3); //put(字段名,字段值) values.put(Constant.NAME,"安奇"); values.put(Constant.AGE,24); long result = db.insert(Constant.TABLE_NAME, null, values); if (result > 0){ DbManager.toastMessage(this,"插入数据成功!"); }else { DbManager.toastMessage(this,"插入数据失败!"); } db.close();修改数据:
db = helper.getWritableDatabase(); /** * update(String table, ContentValues values, String whereClause, String[] whereArgs) * table:表名 values:键为String的HashMap集合 * whereClause:表示当前修改的条件 whereArgs:修改条件的占位符 * return int 修改的条数 */ ContentValues values1 = new ContentValues(); values1.put(Constant.NAME,"哈哈"); //put(需要修改的字段名,修改后的字段值) int count = db.update(Constant.TABLE_NAME, values1, Constant._ID + "=?", new String[]{"3"}); if (count > 0){ DbManager.toastMessage(this,"修改数据成功!"); }else { DbManager.toastMessage(this,"修改数据失败!"); } db.close();
删除数据:
db = helper.getWritableDatabase(); /** * delete(String table, String whereClause, String[] whereArgs) * table:删除的表名 whereClause:删除的条件 whereArgs:删除条件的占位符 * return int 删除条数 */ int size = db.delete(Constant.TABLE_NAME, Constant._ID + "=?", new String[]{"1"}); if (size > 0){ DbManager.toastMessage(this,"删除数据成功!"); }else { DbManager.toastMessage(this,"删除数据失败!"); } db.close();附项目源码如下:
activity_main.xml
Constant.java
package com.jarchie.sqliteproject.db;
/**
* Created by Jarchie on 17/1/7.
* 创建数据库参数的常量类
*/
public class Constant {
public static final String DATABASE_NAME = "info.db"; //数据库名称
public static final int DATABASE_VERSION = 1; //数据库的版本号
public static final String TABLE_NAME = "person"; //表名
public static final String _ID = "_id";
public static final String NAME = "name";
public static final String AGE = "age";
}
MySqliteHelper.java
package com.jarchie.sqliteproject.db;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;
/**
* Created by Jarchie on 17/1/7.
* 本类提供了创建数据库和更新数据库的方法
* 提供了获取数据库对象的函数
*/
public class MySqliteHelper extends SQLiteOpenHelper{
private static final String TAG = "MySqliteHelper";
/**
* 构造函数
* @param context 上下文对象
* @param name 表示创建的数据库的名称
* @param factory 游标工厂
* @param version 当前创建数据库的版本,要求>=1
*/
public MySqliteHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
super(context, name, factory, version);
}
public MySqliteHelper(Context context){
super(context,Constant.DATABASE_NAME,null,Constant.DATABASE_VERSION);
}
/**
* 当数据库创建时回调的函数
* @param db 数据库对象
*/
@Override
public void onCreate(SQLiteDatabase db) {
Log.e(TAG, "onCreate: " + "------onCreate-----" );
String sql = "create table "+Constant.TABLE_NAME+"("+
Constant._ID+" Integer primary key,"+Constant.NAME+
" varchar(10),"+Constant.AGE+" Integer)";
db.execSQL(sql); //执行sql语句
}
/**
* 当数据库版本更新时回调的函数
* @param db 数据库对象
* @param oldVersion 数据库旧版本
* @param newVersion 数据库新版本
*/
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
Log.e(TAG, "onUpgrade: " + "------onUpgrade-----" );
}
/**
* 当数据库打开时回调的函数
* @param db 数据库对象
*/
@Override
public void onOpen(SQLiteDatabase db) {
super.onOpen(db);
Log.e(TAG, "onOpen: " + "------onOpen-----" );
}
}
DbManager.java
package com.jarchie.sqliteproject.utils;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.text.TextUtils;
import android.widget.Toast;
import com.jarchie.sqliteproject.db.MySqliteHelper;
/**
* Created by Jarchie on 17/1/7.
* 对数据库操作的工具类,降低代码的耦合度
*/
public class DbManager {
/**
* 采用单例模式构建helper对象
*/
private static MySqliteHelper helper;
public static MySqliteHelper getInstance(Context context){
if (helper == null){
helper = new MySqliteHelper(context);
}
return helper;
}
/**
* 根据sql语句在数据库中执行语句
* @param db 数据库对象
* @param sql sql语句
*/
public static void execSql(SQLiteDatabase db,String sql){
if (db != null){
if (!TextUtils.isEmpty(sql)){
db.execSQL(sql);
}
}
}
/**
* 定义公共的吐司方法
* @param context 上下文对象
* @param message 吐司信息
*/
public static void toastMessage(Context context,String message){
Toast.makeText(context,message,Toast.LENGTH_SHORT).show();
}
}
MainActivity.java
package com.jarchie.sqliteproject;
import android.app.Activity;
import android.content.ContentValues;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import com.jarchie.sqliteproject.db.Constant;
import com.jarchie.sqliteproject.db.MySqliteHelper;
import com.jarchie.sqliteproject.utils.DbManager;
public class MainActivity extends Activity implements View.OnClickListener{
private Button createBtn,insertBtn,updateBtn,deleteBtn,apiinsertBtn,apiupdateBtn,apideleteBtn;
private MySqliteHelper helper;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
helper = DbManager.getInstance(this);
initView();
initWidgetListener();
}
/**
* 初始化控件
*/
private void initView(){
createBtn = (Button) findViewById(R.id.create_db);
insertBtn = (Button) findViewById(R.id.insert_db);
updateBtn = (Button) findViewById(R.id.update_db);
deleteBtn = (Button) findViewById(R.id.delete_db);
apiinsertBtn = (Button) findViewById(R.id.insertapi_db);
apiupdateBtn = (Button) findViewById(R.id.updateapi_db);
apideleteBtn = (Button) findViewById(R.id.deleteapi_db);
}
/**
* 初始化监听事件
*/
private void initWidgetListener(){
createBtn.setOnClickListener(this);
insertBtn.setOnClickListener(this);
updateBtn.setOnClickListener(this);
deleteBtn.setOnClickListener(this);
apiinsertBtn.setOnClickListener(this);
apiupdateBtn.setOnClickListener(this);
apideleteBtn.setOnClickListener(this);
}
@Override
public void onClick(View view) {
switch (view.getId()){
case R.id.create_db:
createDb();
break;
case R.id.insert_db:
insertData();
break;
case R.id.update_db:
updateData();
break;
case R.id.delete_db:
deleteData();
break;
case R.id.insertapi_db:
apiInsertData();
break;
case R.id.updateapi_db:
apiUpdateData();
break;
case R.id.deleteapi_db:
apiDeleteData();
break;
}
}
//创建数据库
private void createDb(){
/**
* getReadableDatabase()和getWritableDatabase()创建或者打开数据库
* 如果数据库不存在则创建数据库,如果数据库存在直接打开数据库
* 默认情况下两个函数都表示打开或者创建可读可写的数据库对象,如果磁盘已满或者数据库
* 本身权限等情况下getReadableDatabase()打开的是只读数据库
*/
SQLiteDatabase db = helper.getWritableDatabase();
}
//sql语句插入数据
private void insertData(){
SQLiteDatabase db = helper.getWritableDatabase();
String sql = "insert into "+ Constant.TABLE_NAME+" values(1,'Archie',24)";
DbManager.execSql(db,sql);
String sql1 = "insert into "+ Constant.TABLE_NAME+" values(2,'Jackson',25)";
DbManager.execSql(db,sql1);
db.close();
}
//sql语句修改数据
private void updateData(){
SQLiteDatabase db = helper.getWritableDatabase();
String sql2 = "update "+Constant.TABLE_NAME+" set "+Constant.NAME
+"='angel' where "+Constant._ID+"=1";
DbManager.execSql(db,sql2);
db.close();
}
//sql语句删除数据
private void deleteData(){
SQLiteDatabase db = helper.getWritableDatabase();
String sql3 = "delete from "+Constant.TABLE_NAME+" where "+Constant._ID+"=2";
DbManager.execSql(db,sql3);
db.close();
}
//api插入数据
private void apiInsertData(){
SQLiteDatabase db = helper.getWritableDatabase();
/**
* insert(String table, String nullColumnHack, ContentValues values)
* table:表名 nullColumnHack:一般指定为null values:键为String的HashMap集合
* return long 表示插入数据的列数
*/
ContentValues values = new ContentValues();
values.put(Constant._ID,3); //put(字段名,字段值)
values.put(Constant.NAME,"安奇");
values.put(Constant.AGE,24);
long result = db.insert(Constant.TABLE_NAME, null, values);
if (result > 0){
DbManager.toastMessage(this,"插入数据成功!");
}else {
DbManager.toastMessage(this,"插入数据失败!");
}
db.close();
}
//api修改数据
private void apiUpdateData(){
SQLiteDatabase db = helper.getWritableDatabase();
/**
* update(String table, ContentValues values, String whereClause, String[] whereArgs)
* table:表名 values:键为String的HashMap集合
* whereClause:表示当前修改的条件 whereArgs:修改条件的占位符
* return int 修改的条数
*/
ContentValues values1 = new ContentValues();
values1.put(Constant.NAME,"哈哈"); //put(需要修改的字段名,修改后的字段值)
// int count = db.update(Constant.TABLE_NAME, values1,
// Constant._ID + "=3", null);
int count = db.update(Constant.TABLE_NAME, values1, Constant._ID + "=?",
new String[]{"3"});
if (count > 0){
DbManager.toastMessage(this,"修改数据成功!");
}else {
DbManager.toastMessage(this,"修改数据失败!");
}
db.close();
}
//api删除数据
private void apiDeleteData(){
SQLiteDatabase db = helper.getWritableDatabase();
/**
* delete(String table, String whereClause, String[] whereArgs)
* table:删除的表名 whereClause:删除的条件 whereArgs:删除条件的占位符
* return int 删除条数
*/
int size = db.delete(Constant.TABLE_NAME, Constant._ID + "=?", new String[]{"1"});
if (size > 0){
DbManager.toastMessage(this,"删除数据成功!");
}else {
DbManager.toastMessage(this,"删除数据失败!");
}
db.close();
}
}
好了,本篇就先写到这里,未完待续哦!