Android 封装AsyncTask操作SQLite数据库

一.简单封装AsyncTask操作Sqlite数据库

 

 

SQLiteOpenHelper实现类

package com.wjn.androiddbdemo.utils.db;

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

/**
 * Sqlite SQLiteOpenHelper实现类
 * */

public class DBSQLiteOpenHelper extends SQLiteOpenHelper {

    /**
     * 构造方法
     * */

    public DBSQLiteOpenHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
        super(context, name, factory, version);
    }

    /**
     * onCreate方法
     * 首次使用软件时生成数据库表
     * */

    @Override
    public void onCreate(SQLiteDatabase db) {
        String sql="CREATE TABLE mytable( id INTEGER, name VARCHAR(10), describe TEXT)";
        db.execSQL(sql);
    }

    /**
     * onUpgrade方法
     * 在数据库的版本发生变化时会被调用, 一般在软件升级时才需改变版本号
     * 删除原来的表,重新执行onCreate方法
     * */

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        String sql="DROP TABLE IF EXISTS mytable";
        db.execSQL(sql);
        onCreate(db);
    }

}

 

 

 

Activity代码

package com.wjn.androiddbdemo.activity;

import android.content.ContentValues;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.TextView;

import com.wjn.androiddbdemo.R;
import com.wjn.androiddbdemo.bean.Person;
import com.wjn.androiddbdemo.utils.db.DBCheckAsyncTask;
import com.wjn.androiddbdemo.utils.db.DBSQLiteOpenHelper;
import com.wjn.androiddbdemo.utils.db.SQLiteHelp;
import com.wjn.androiddbdemo.utils.ui.StatusBarUtil;

public class AsyncTaskSQLiteActivity extends AppCompatActivity implements View.OnClickListener {

    private TextView textView1;
    private TextView textView2;
    private TextView textView3;
    private TextView textView4;
    private TextView textView;
    private DBSQLiteOpenHelper dbsqLiteOpenHelper;
    private SQLiteDatabase db;
    private int id=100;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_asynctasksqlite);
        initView();
    }

    /**
     * 初始化各种View
     */

    private void initView() {
        //根据状态栏颜色来决定 状态栏背景 用黑色还是白色 true:是否修改状态栏字体颜色
        StatusBarUtil.setStatusBarMode(this, false, false, R.color.colorPrimary);
        textView1 = findViewById(R.id.activity_asynctasksqlite_textview1);
        textView2 = findViewById(R.id.activity_asynctasksqlite_textview2);
        textView3 = findViewById(R.id.activity_asynctasksqlite_textview3);
        textView4 = findViewById(R.id.activity_asynctasksqlite_textview4);
        textView = findViewById(R.id.activity_asynctasksqlite_textview);
        textView1.setOnClickListener(this);
        textView2.setOnClickListener(this);
        textView3.setOnClickListener(this);
        textView4.setOnClickListener(this);
        dbsqLiteOpenHelper=new DBSQLiteOpenHelper(this,"wjn.db",null,1);
    }

    /**
     * 各种点击事件的方法
     */

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.activity_asynctasksqlite_textview1://增
                insertbtnMethod();
                break;
            case R.id.activity_asynctasksqlite_textview2://删
                delbtnMethod("100");
                break;
            case R.id.activity_asynctasksqlite_textview3://改
                updatebtnMethod();
                break;
            case R.id.activity_asynctasksqlite_textview4://查
                findbtnMethod();
                break;
            default:
                break;
        }
    }

    /**
     * API语句 增
     */

    public void insertbtnMethod() {
        //打开数据库
        db=dbsqLiteOpenHelper.getReadableDatabase();
        //初始化对象
        Person person=new Person();
        person.setId(String.valueOf(id));
        person.setName("张三");
        person.setDescribe("本章节讲述getWritableDatabase()和getReadableDatabase()区别");
        //插入语句
        db.execSQL("INSERT INTO mytable(id,name,describe) values(?,?,?)",
                new String[]{person.getId(), person.getName(),person.getDescribe()});
        //关闭数据库
        db.close();
    }

    /**
     * API语句 删  
     */

    public void delbtnMethod(String id) {
        //打开数据库
        db=dbsqLiteOpenHelper.getReadableDatabase();
        //删除语句
        db.execSQL("DELETE FROM mytable WHERE id = ?",
                new String[]{id});
        //关闭数据库
        db.close();
    }

    /**
     * API语句 改  
     */

    public void updatebtnMethod() {
        //打开数据库
        db=dbsqLiteOpenHelper.getReadableDatabase();
        //初始化对象
        Person person = new Person();
        person.setId("100");
        person.setName("修改后的姓名");
        person.setDescribe("修改后的描述");
        //修改语句
        db.execSQL("UPDATE mytable SET name = ?,describe = ? WHERE id = ?",
                new String[]{person.getName(), person.getDescribe(), person.getId()});
        //关闭数据库
        db.close();
    }

    /**
     * API语句 查
     */

    public void findbtnMethod() {
        //打开数据库
        db=dbsqLiteOpenHelper.getReadableDatabase();
        db=dbsqLiteOpenHelper.getReadableDatabase();
        new DBCheckAsyncTask(textView,db).execute("select * from mytable");
    }

}

 

 

AsyncTask实现类

package com.wjn.androiddbdemo.utils.db;

import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.AsyncTask;
import android.widget.TextView;

public class DBCheckAsyncTask extends AsyncTask<String, Integer, String> {

    /**
     * 构造方法
     * */

    private TextView textView;
    private SQLiteDatabase db;
    public DBCheckAsyncTask(TextView textView,SQLiteDatabase db){
        this.textView=textView;
        this.db=db;
    }

    /**
     *onPreExecute方法 执行前准备工作  UI线程
     * */

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        textView.setText("数据加载中...");
    }

    /**
     * onPostExecute 返回结果 UI线程
     * */

    @Override
    protected void onPostExecute(String s) {
        super.onPostExecute(s);
        textView.setText(s);
    }

    /**
     * onProgressUpdate 更新进度 UI线程
     * */

    @Override
    protected void onProgressUpdate(Integer... values) {
        super.onProgressUpdate(values);
        textView.setText("数据加载中..."+values[0]);
    }

    /**
     * doInBackground 后台操作 非UI线程
     * */

    @Override
    protected String doInBackground(String... strings) {
        String sql=strings[0];
        Cursor cursor=db.rawQuery(sql, null);
        cursor.moveToFirst();
        StringBuilder sbBuilder=new StringBuilder();
        while(!cursor.isAfterLast()){
            int id=cursor.getInt(cursor.getColumnIndex("id"));
            sbBuilder.append("ID:"+id+"\n");
            String name=cursor.getString(cursor.getColumnIndex("name"));
            sbBuilder.append("姓名:"+name+"\n");
            String describe=cursor.getString(cursor.getColumnIndex("describe"));
            sbBuilder.append("描述:"+describe+"\n\n\n");
            cursor.moveToNext();
        }
        cursor.close();
        db.close();
        return sbBuilder.toString();
    }
}

 

结果

 

增——>查

 

改——>查

 

 

删——>查

 

 

AsyncTask操作Sqlite数据库主要在于可以在子线程中操作数据库的查询,在UI线程中更新。

 

 

 

 

 

 

二.项目实战(AsyncTask+EventBus)

 

下面是项目实战中的代码

 

SQLiteOpenHelper实现类

/**
 * Created by wujna on 2017/12/21.
 * Android SQLite数据库帮助类
 */

public class DBSQLiteOpenHelper extends SQLiteOpenHelper{

    public static String dbname="CDSP_Clinicians.db";//数据库名称
    public static int version=1;//数据库版本号

    /**
     * 数据表1
     * */

    public static String index_data_dbtablename="index_data";
    public static String index_create_sql="CREATE TABLE "+index_data_dbtablename
            +"( Id INTEGER PRIMARY KEY AUTOINCREMENT, userID TEXT,dataKey TEXT, dataValue TEXT)";
    public static String index_del_sql="DROP TABLE IF EXISTS "+index_data_dbtablename;


    /**
     * 数据表2
     * */

    public static String people_data_dbtablename="people_data";
    public static String people_create_sql="CREATE TABLE "+people_data_dbtablename
            +"( Id INTEGER PRIMARY KEY AUTOINCREMENT, userID TEXT,dataKey TEXT, dataValue TEXT)";
    public static String people_del_sql="DROP TABLE IF EXISTS "+people_data_dbtablename;


    /**
     * 数据表3
     * */

    public static String attachment_data_dbtablename="attachment_data";
    public static String attachment_create_sql="CREATE TABLE "+attachment_data_dbtablename
            +"( Id INTEGER PRIMARY KEY AUTOINCREMENT, userID TEXT,dataKey TEXT, dataValue TEXT)";
    public static String attachment_del_sql="DROP TABLE IF EXISTS "+attachment_data_dbtablename;

    /**
     * 数据表4
     * */

    public static String message_data_dbtablename="message_data";
    public static String message_create_sql="CREATE TABLE "+message_data_dbtablename
            +"( Id INTEGER PRIMARY KEY AUTOINCREMENT, userID TEXT,dataKey TEXT, dataValue TEXT)";
    public static String message_del_sql="DROP TABLE IF EXISTS "+message_data_dbtablename;

    /**
     * 数据表5
     * */

    public static String followup_data_dbtablename="followup_data";
    public static String followup_create_sql="CREATE TABLE "+followup_data_dbtablename
            +"( Id INTEGER PRIMARY KEY AUTOINCREMENT, userID TEXT,dataKey TEXT, dataValue TEXT)";
    public static String followup_del_sql="DROP TABLE IF EXISTS "+followup_data_dbtablename;

    /**
     * 数据表6
     * */

    public static String peoplewarning_data_dbtablename="peoplewarning_data";
    public static String peoplewarning_create_sql="CREATE TABLE "+peoplewarning_data_dbtablename
            +"( Id INTEGER PRIMARY KEY AUTOINCREMENT, userID TEXT,dataKey TEXT, dataValue TEXT)";
    public static String peoplewarning_del_sql="DROP TABLE IF EXISTS "+peoplewarning_data_dbtablename;

    /**
     * 数据表7
     * */

    public static String peopleapply_data_dbtablename="peopleapply_data";
    public static String peopleapply_create_sql="CREATE TABLE "+peopleapply_data_dbtablename
            +"( Id INTEGER PRIMARY KEY AUTOINCREMENT, userID TEXT,dataKey TEXT, dataValue TEXT)";
    public static String peopleapply_del_sql="DROP TABLE IF EXISTS "+peopleapply_data_dbtablename;


    /**
     * 构造方法
     * */

    public DBSQLiteOpenHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
        super(context, name, factory, version);
    }

    /**
     * onCreate方法
     * 首次使用软件时生成数据库表
     * */

    @Override
    public void onCreate(SQLiteDatabase sqLiteDatabase) {
        sqLiteDatabase.execSQL(index_create_sql);
        sqLiteDatabase.execSQL(people_create_sql);
        sqLiteDatabase.execSQL(attachment_create_sql);
        sqLiteDatabase.execSQL(message_create_sql);
        sqLiteDatabase.execSQL(followup_create_sql);
        sqLiteDatabase.execSQL(peoplewarning_create_sql);
        sqLiteDatabase.execSQL(peopleapply_create_sql);
    }

    /**
     * onUpgrade方法
     * 在数据库的版本发生变化时会被调用, 一般在软件升级时才需改变版本号
     * */

    @Override
    public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {
        sqLiteDatabase.execSQL(index_del_sql);
        sqLiteDatabase.execSQL(people_del_sql);
        sqLiteDatabase.execSQL(attachment_del_sql);
        sqLiteDatabase.execSQL(message_del_sql);
        sqLiteDatabase.execSQL(followup_del_sql);
        sqLiteDatabase.execSQL(peoplewarning_del_sql);
        sqLiteDatabase.execSQL(peopleapply_del_sql);
        onCreate(sqLiteDatabase);
    }

}

 

初始化数据库帮助类

dbsqLiteOpenHelper=new DBSQLiteOpenHelper(this,DBSQLiteOpenHelper.dbname,null,DBSQLiteOpenHelper.version);

 

插入语句(OKHttp onNext方法)

@Override
public void onNext(String s) {
     parseIndexNumber(s);
     DBUtils.insertMessageListData(dbsqLiteOpenHelper,s,userID);
}

 

 

查询语句

 String message_select_listdata_sql="SELECT dataValue FROM "+DBSQLiteOpenHelper.message_data_dbtablename
                    +" WHERE dataKey="+ "'"+DataConstant.message_listdataKey+"'"
                    +"and userID="+"'"+userID+"'";
            

DBUtils.getMessageListData(dbsqLiteOpenHelper,"MessageActivity_List",message_select_listdata_sql);

 

 

DBUtils工具类

/**
 * 本地数据库工具类
 */

public class DBUtils {


/**
     * 消息列表插入数据方法
     */

    public static void insertMessageListData(DBSQLiteOpenHelper dbsqLiteOpenHelper, String context, String userID) {
        if (null == dbsqLiteOpenHelper || null == context || null == userID) {
            return;
        }

        new InsertDataAsyncTask(dbsqLiteOpenHelper, context, "MessageListData", userID).execute("");
    }



/**
     * 消息列表获取数据方法
     */

    public static void getMessageListData(DBSQLiteOpenHelper dbsqLiteOpenHelper, String whichActivity, String sql) {
        if (null == dbsqLiteOpenHelper || null == whichActivity || null == sql) {
            return;
        }
        new GetStringDataAsyncTask(dbsqLiteOpenHelper, whichActivity).execute(sql);
    }


}

 

 

AsyncTask实现类

插入

/**
 * 向本地数据库插入数据AsyncTask实现类
 * Key-Value
 * */

public class InsertDataAsyncTask extends AsyncTask<String, Integer, String> {

    /**
     * 构造方法

     * */

    private DBSQLiteOpenHelper dbsqLiteOpenHelper;
    private String context;
    private String type;
    private String userID;
    public InsertDataAsyncTask(DBSQLiteOpenHelper dbsqLiteOpenHelper, String context,String type,String userID){
        this.dbsqLiteOpenHelper=dbsqLiteOpenHelper;
        this.context=context;
        this.type=type;
        this.userID=userID;
    }

    /**
     *onPreExecute方法 执行前准备工作  UI线程
     * */

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
    }

    /**
     * onPostExecute 返回结果 UI线程
     * */

    @Override
    protected void onPostExecute(String s) {
        super.onPostExecute(s);
    }

    /**
     * onProgressUpdate 更新进度 UI线程
     * */

    @Override
    protected void onProgressUpdate(Integer... values) {
        super.onProgressUpdate(values);
    }

    /**
     * doInBackground 后台操作 非UI线程
     * */

    @Override
    protected String doInBackground(String... strings) {
        
        SQLiteDatabase db = dbsqLiteOpenHelper.getReadableDatabase();
            if(null!=db){
                db.execSQL("DELETE FROM "+DBSQLiteOpenHelper.message_data_dbtablename +" WHERE dataKey = ?", new String[]{DataConstant.message_listdataKey});
                db.execSQL("INSERT INTO " + DBSQLiteOpenHelper.message_data_dbtablename + "(userID,dataKey,dataValue) values(?,?,?)",
                        new String[]{userID,DataConstant.message_listdataKey, context});
                db.close();

        return "";
    }
}

 

获取

/**
 * 获取本地数据库字符串AsyncTask
 * */

public class GetStringDataAsyncTask extends AsyncTask<String, Integer, String> {

    /**
     * 构造方法
     * */

    private DBSQLiteOpenHelper dbsqLiteOpenHelper;
    private String whichActivity;
    public GetStringDataAsyncTask(DBSQLiteOpenHelper dbsqLiteOpenHelper,String whichActivity){
        this.dbsqLiteOpenHelper=dbsqLiteOpenHelper;
        this.whichActivity=whichActivity;
    }

    /**
     *onPreExecute方法 执行前准备工作  UI线程
     * */

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
    }

    /**
     * onPostExecute 返回结果 UI线程
     * */

    @Override
    protected void onPostExecute(String s) {
        super.onPostExecute(s);
        String result="";
        if(!BooleanUtils.isEmpty(s)){
            result=s;
        }
        //发送EventBus通知 刷新页面
        EventBusBean eventBusBean=new EventBusBean();
        eventBusBean.setUpdatetype(whichActivity);
        eventBusBean.setContext(result);
        EventBus.getDefault().post(eventBusBean);
    }

    /**
     * onProgressUpdate 更新进度 UI线程
     * */

    @Override
    protected void onProgressUpdate(Integer... values) {
        super.onProgressUpdate(values);
    }

    /**
     * doInBackground 后台操作 非UI线程
     * */

    @Override
    protected String doInBackground(String... strings) {
        String result="";
        String sql=strings[0];
        SQLiteDatabase db = dbsqLiteOpenHelper.getReadableDatabase();
        if(null!=db&&!BooleanUtils.isEmpty(sql)){
            Cursor cursor=db.rawQuery(sql, null);
            boolean b=cursor.moveToFirst();
            if(b){
                result= cursor.getString(0);
            }
            cursor.close();
            db.close();
        }
        return result;
    }
}

 

 

Activity EventBus接收

/**
     * onEventMainThread EventBus 接收消息
     * */

    public void onEventMainThread(EventBusBean eventBusBean) {
        if(null!=eventBusBean){
            String type=eventBusBean.getUpdatetype();
            if("MessageActivity_List".equals(type)){//无网络本地数据库
                String context=eventBusBean.getContext();
                parseMessage(context,"0");
            }
        }
    }

 

 

代码链接:https://github.com/wujianning/AndroidDBDemo

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
大家好,个人觉得用Sqlite数据库时,经常需要进行机械性的CRUD操作,故对其进行了一下封装,希望能起到抛砖引玉的作用。 目的:封装共有的CRUD 下面简单的说一下使用步骤,如果觉得多余,可以无视。 1. 实现自己的DBHelper: /** * * @author Kee.Li * * 1. 继承了SmartDBHelper,不需要重写SQLiteOpenHelper的那两个方法 * 2. 父类构造方法参数modelClasses是实体类的数组,也就是需要生产表的类的Class数组 * */ public class DBHelper extends SmartDBHelper { //数据库名称 private final static String DATABASE_NAME = "books.db"; //数据库版本 private final static int DATABASE_VERSION = 2; //需要生成数据库表的类的数组 private final static Class<?>[] modelClasses = {Book.class,User.class}; public DBHelper(Context context) { super(context, DATABASE_NAME, null, DATABASE_VERSION,modelClasses); } } 2.创建app需要的实体,也就是对应的数据库表(这里的实体添加到DBHelper的modelClasses数组中) /** * 数据库的实体 * @author Kee.Li * 关于注解: * Table: 此类对应的数据库表名 * Id:标识此属性为数据库自增长的id,应为int型 * Column:标识此属性对应的数据库字段名 */ @Table(name="t_books") public class Book{ @Id @Column(name="book_id") private int bookId; @Column(name="book_name") private String bookName; @Column(name="book_author") private String bookAuthor; //set get 方法省略.... } 3. 实现DAO,也就是对实体的CRUD类 /** * @author Kee.Li * * 此类只需要继承TemplateDAO,在构造方法里面给父类的属性dbHelper赋值,即可实现CRUD操作 * 若有复杂的操作,可以自定义方法 */ public class BookDAO extends TemplateDAO { /** * 创建DAO时初始化连接数据库对象helper * @param context */ public BookDAO(Context context) { super(new DBHelper(context)); } } 4. activity的调用 bookDAO = new BookDAO(this); List books = bookDAO.find(); 好了,到此结束,如果有什么好的建议或者意见,希望可以共同学习!谢谢大家!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值