您的位置:首页 > 移动开发 > Android开发

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实体类。

数据库初始化

新建一个继承于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,没积分的评论区留邮箱
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐