Android开发SQLite轻量级数据库增删改查教程

至于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 whereClause, 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,没积分的评论区留邮箱

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值