Android开发SQLite轻量级数据库增删改查教程
2017-08-31 17:41
537 查看
至于SQLite本身的介绍,就不啰嗦了,可以看看百度百科的介绍(https://baike.baidu.com/item/SQLite/375020?fr=aladdin),网上也有一大堆,直接进入实例讲解吧
先看一下demo的文件结构,分成了三个包,分别是UI、interface接口、db,UI那个包就不多说了,主要是调用db里的操作类,interface接口的那个包里包含了增删改查四种操作的接口回调(其中DBOperationExecute.java是增删改共同的接口),db包里分别有用于初始化创建数据库的DbHepler类(继承于SQLiteOpenHelper)、用于数据库业务操作的DBOperation操作类以及一个UserInfo实体类。
该类包含了同类名的构造函数、onCreate()函数、onUpgrade()函数,构造函数定义了数据库的名称和版本号;onCreate()函数是在首次创建数据库时的初始化方法,可以在该函数中创建数据表,但该函数只在首次创建时执行一次,数据库创建完成之后不再执行,所以,应用升级需要改变数据库结构的话,就需要在构造函数中提高版本号以执行onUpgrade()函数
UserInfo实体类
DBOperationExecute.java
声明一个抽象方法,用来传递数据库相关操作是否成功的结果
DBOperationQuery.java
声明一个抽象方法,用来返回查询到的数据集
数据库操作常用函数:
实例代码解释:
添加操作
从view层将要添加到数据表的数据(先封装成
查询操作
删除和修改方法类似,只是在方法里加入了筛选条件
源码地址:http://download.csdn.net/download/qq_23931287/9960301,没积分的评论区留邮箱
实例介绍
先看一下demo的文件结构,分成了三个包,分别是UI、interface接口、db,UI那个包就不多说了,主要是调用db里的操作类,interface接口的那个包里包含了增删改查四种操作的接口回调(其中DBOperationExecute.java是增删改共同的接口),db包里分别有用于初始化创建数据库的DbHepler类(继承于SQLiteOpenHelper)、用于数据库业务操作的DBOperation操作类以及一个UserInfo实体类。
数据库初始化
新建一个继承于SQLiteOpenHelper的DbHepler.java文件import android.content.Context; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; public class DbHelper extends SQLiteOpenHelper { private static String DbName = "DbDemo"; public static String tableName = "UserInfo"; public DbHelper(Context context,int version) { super(context, DbName, null, version); } @Override public void onCreate(SQLiteDatabase db) { String sql = "create table " + tableName + "(_id integer primary key autoincrement,uName varchar(20),uSex varchar(5))"; db.execSQL(sql); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { //为原表添加新列 String sql = "ALTER table " + tableName + " ADD COLUMN uAge"; db.execSQL(sql);//执行SQL语句 //修改表名 sql="ALTER TABLE "+tableName+" RENAME TO Teachers"; db.execSQL(sql); tableName="Teachers"; } }
该类包含了同类名的构造函数、onCreate()函数、onUpgrade()函数,构造函数定义了数据库的名称和版本号;onCreate()函数是在首次创建数据库时的初始化方法,可以在该函数中创建数据表,但该函数只在首次创建时执行一次,数据库创建完成之后不再执行,所以,应用升级需要改变数据库结构的话,就需要在构造函数中提高版本号以执行onUpgrade()函数
创建实体类
数据表确定了,就根据数据表及表字段创建相应的实体类,以便于操作数据UserInfo实体类
public class UserInfo { private int id; private String uName; private String uSex; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getuName() { return uName; } public void setuName(String uName) { this.uName = uName; } public String getuSex() { return uSex; } public void setuSex(String uSex) { this.uSex = uSex; } }
interface接口
编程讲究高内聚低耦合,也是为了提高程序的可扩展性、可移植性以及易读性等,接口的使用展现了面向对象的多态性,小项目可能感受不到使用接口所带来的好处和便利,一旦编写一个较大的工程或者团队合作,接口的优点就会凸显,也使得项目更便于维护。DBOperationExecute.java
//用于增删改 public interface DBOperationExecute { void onExecuteResult(boolean isSuccess); }
声明一个抽象方法,用来传递数据库相关操作是否成功的结果
DBOperationQuery.java
import java.util.List; import com.sqlitedemo.db.UserInfo; //用于查询 public interface DBOperationQuery { void onQueryResult(List<UserInfo> uInfos); }
声明一个抽象方法,用来返回查询到的数据集
DBOperation操作类
该操作类集聚了数据库操作的增删改查,可以把它理解为三层架构中的业务层,负责view层和数据层之间的通信数据库操作常用函数:
db.insert(String table, String nullColumnHack, ContentValues values); db.update(String table, Contentvalues values, String whe 4000 reClause, String whereArgs); db.delete(String table, String whereClause, String whereArgs); db.rawQuery(String sql, String[] selectionArgs); db.query(String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy); db.query(String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy, String limit); db.query(String distinct, String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy, String limit);
实例代码解释:
添加操作
// 添加操作 public void operDBInsert(List<UserInfo> infos, DBOperationExecute dboInterface) { if (infos == null || infos.size() == 0) { dboInterface.onExecuteResult(true); return; } SQLiteDatabase db = dbHepler.getWritableDatabase();//得到一个可写的SQLiteDatabase对象 ContentValues cv = null; db.beginTransaction(); for (int i = 0; i < infos.size(); i++) { cv = new ContentValues();//实例化一个ContentValues对象 cv.put("uName", infos.get(i).getuName()); cv.put("uSex", infos.get(i).getuSex()); if (db.insert(dbHepler.tableName, null, cv) == -1) { db.endTransaction();//回滚 db.close(); dboInterface.onExecuteResult(false); return; } } db.setTransactionSuccessful();//将事务设置为成功状态 db.endTransaction();//提交事务 db.close(); dboInterface.onExecuteResult(true); }
从view层将要添加到数据表的数据(先封装成
List<UserInfo>数据集)传递到该函数中,然后实现DBOperationExecute接口,在该方法中,由于遍历添加n条记录,为保证数据的完整性,在添加之前开启了事务(
db.beginTransaction();),任何一条添加失败则回滚撤销,在事务提交之前,所有的数据添加都不算最终完成,只有成功执行所有的操作之后,将事务设置为成功状态,在结束事务时(
endTransaction();)才算成功提交事务,若没有
setTransactionSuccessful();,则视为事务内的操作执行失败,那么
endTransaction();就不会执行提交,而是回滚至原状态,最终向接口传递执行结果(
dboInterface.onExecuteResult(true);)
查询操作
// 查询操作 public void operDBQuery(DBOperationQuery dboInterface) { List<UserInfo> infos = new ArrayList<UserInfo>(); SQLiteDatabase db = dbHepler.getReadableDatabase();//得到一个可读的SQLiteDatabase对象 Cursor cursor = db.query(dbHepler.tableName, null, null, null, null, null, null);//查询到tableName的所有数据赋给游标Cursor对象 UserInfo info = null; while (cursor.moveToNext()) {//逐次将游标移动到下一行以遍历所有数据装载到List<UserInfo>数据集中 info = new UserInfo(); info.setId(cursor.getInt(cursor.getColumnIndex("_id"))); info.setuName(cursor.getString(cursor.getColumnIndex("uName"))); info.setuSex(cursor.getString(cursor.getColumnIndex("uSex"))); infos.add(info); } db.close(); dboInterface.onQueryResult(infos); }
删除和修改方法类似,只是在方法里加入了筛选条件
// 删除操作 public void operDBDelete(int id, DBOperationExecute dboInterface) { if (id < 1) { dboInterface.onExecuteResult(false); return; } SQLiteDatabase db = dbHepler.getWritableDatabase(); //删除该id的整行数据 if (db.delete(dbHepler.tableName, "_id=?", new String[] { String.valueOf(id)}) > 0) { db.close(); dboInterface.onExecuteResult(true); return; } db.close(); dboInterface.onExecuteResult(false); } // 修改操作 public void operDBUpdate(int id, UserInfo info, DBOperationExecute dboInterface) { if (id < 1 || info == null) { dboInterface.onExecuteResult(false); return; } ContentValues cv = new ContentValues(); cv.put("uName", info.getuName()); cv.put("uSex", info.getuSex()); SQLiteDatabase db = dbHepler.getWritableDatabase(); if (db.update(DbHelper.tableName, cv, "_id=?", new String[] { String.valueOf(id) }) > 0) { db.close(); dboInterface.onExecuteResult(true); return; } db.close(); dboInterface.onExecuteResult(false); }
UI层 MainActivity
准备好的函数和接口,UI层就简单了,简单调用就OK了,直接代码吧,有注释的import java.util.ArrayList; import java.util.List; import com.example.sqlitedemo.R; import com.sqlitedemo.db.DBOperation; import com.sqlitedemo.db.UserInfo; import com.sqlitedemo.interfaces.DBOperationExecute; import com.sqlitedemo.interfaces.DBOperationQuery; import android.app.Activity; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; public class MainActivity extends Activity { List<UserInfo> infos = new ArrayList<UserInfo>(); DBOperation dbo; int i = 0; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); dbo = new DBOperation(this); findViewById(R.id.btnInsert).setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub if (infos.size() > 0) infos.clear(); UserInfo info = new UserInfo(); info.setuName("张明"); info.setuSex("男"); infos.add(info); info = new UserInfo(); info.setuName("刘艳"); info.setuSex("女"); infos.add(info); dbo.operDBInsert(infos, new DBOperationExecute() { @Override public void onExecuteResult(boolean isSuccess) { // TODO Auto-generated method stub System.out.println("插入结果:" + isSuccess); } }); } }); findViewById(R.id.btnQuery).setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub dbo.operDBQuery(new DBOperationQuery() { @Override public void onQueryResult(List<UserInfo> uInfos) { // TODO Auto-generated method stub for (int i = 0; i < uInfos.size(); i++) { System.out.println("查询结果>>>----编号:" + uInfos.get(i).getId() + "----姓名:" + uInfos.get(i).getuName() + "----性别:" + uInfos.get(i).getuSex()); } } }); } }); findViewById(R.id.btnDel).setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // 为了方便测试,在执行删除之前先执行一遍查询得到第一条数据的id dbo.operDBQuery(new DBOperationQuery() { @Override public void onQueryResult(List<UserInfo> uInfos) { if (uInfos.size() > 0) { int id = uInfos.get(0).getId();// 得到第一条数据的id System.out.println("即将删除的记录id:" + id); dbo.operDBDelete(id, new DBOperationExecute() { @Override public void onExecuteResult(boolean isSuccess) { System.out.println("删除结果:" + isSuccess); } }); } else { System.out.println("没有数据"); } } }); } }); findViewById(R.id.btnUpdate).setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // 为了方便测试,在执行修改之前先执行一遍查询得到第i+1条数据的id dbo.operDBQuery(new DBOperationQuery() { @Override public void onQueryResult(List<UserInfo> uInfos) { if (uInfos.size() == 0) { System.out.println("没有数据"); return; } if (uInfos.size() <= (i )) { System.out.println("计数器归零"); i = 0; } int id = uInfos.get(i ).getId();// 得到第i条数据的id System.out.println("即将修改的记录id:" + id); UserInfo info = new UserInfo(); info.setuName("已修改--" + uInfos.get(i ).getuName()); info.setuSex("已修改--" + uInfos.get(i).getuSex()); dbo.operDBUpdate(id, info, new DBOperationExecute() { @Override public void onExecuteResult(boolean isSuccess) { // TODO Auto-generated method stub System.out.println("修改结果:" + isSuccess); i=i+1; } }); } }); } }); } }
源码地址:http://download.csdn.net/download/qq_23931287/9960301,没积分的评论区留邮箱
相关文章推荐
- Android开发-SQLite从资源文件中数据库复制到SD到增删改查-AndroidStudio
- android开发轻量级数据库SQLite
- 利用反射实现对sqlite3数据库的crud(增删改查)操作的一个baseAndroidDao封装,安卓开发中
- Android 开发中使用 SQLite 数据库
- Android游戏开发之数据库SQLite 详细介绍(八)
- 【Android游戏开发十三】(保存游戏数据 [下文])详解SQLite存储方式,并把SQLite的数据库文件存储在SD卡中!!!
- Android开发中使用SQLite 数据库
- 【Android游戏开发十三】(保存游戏数据 [下文])详解SQLite存储方式,并把SQLite的数据库文件存储在SD卡中!!!
- Android 开发中使用 SQLite 数据库
- Android 开发中使用 SQLite 数据库
- asp.net下SQLite(轻量级最佳数据库) 原理分析和开发应用
- Android[高级教程] Android数据库SQLite表内设置外键
- Android 高手进阶教程(十三)之----Android 数据库SQLiteDatabase的使用!!
- Android游戏开发之数据库SQLite 详细介绍(十七) .
- 【Android游戏开发十三】(保存游戏数据 [下文])详解SQLite存储方式,并把SQLite的数据库文件存储在SD卡中!!!
- Android 开发中使用 SQLite 数据库
- 【Android游戏开发十三】(保存游戏数据 [下文])详解SQLite存储方式,并把SQLite的数据库文件存储在SD卡中!!!
- SQLite(轻量级最佳数据库) 原理分析和开发应用zz
- Android 开发中使用 SQLite 数据库
- Android 开发中使用 SQLite 数据库