Android多线程访问SQLite,及消息已读未读的处理

        在移动开发中,我们难免会遇到对于消息数据类的处理,比如说记录一篇文章是否已经阅读过,这时候可能我们会使用到SQLite数据库。

        而在Android数据库操作中,由于单个数据库的使用会致使应用出现各类的问题,所以本文将讲解多线程下访问SQLite,以及基本的数据库操作。


1.首先看效果图

2.创建一个数据库

/**
 * Created by can on 2018/2/26.
 * 消息数据库操作
 */

public class MessageDataOpenHelper extends SQLiteOpenHelper {


    public MessageDataOpenHelper(Context context) {
        super(context, "message.db", null, 2);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        //noeID : 某一条消息的id
        //noeTitle : 消息的标题
        //noeTime : 消息的时间
        // isRead : 0表示未读 1表示已读
        db.execSQL("create table if not exists message(id integer primary key autoincrement ,noeTitle varchar(50),noeTime varchar(50), isRead varchar(10))");
    }

    @Override
    public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {

    }



}

3.多线程下调用SQLite

/**
 * 多线程下调用SQLite
 */
public class DataBaseManager {
    //解决多线程并发
    private AtomicInteger mOpenCounter = new AtomicInteger();
    private static DataBaseManager instance;
    private static SQLiteOpenHelper mDatabaseHelper;
    private SQLiteDatabase mDatabase;

    private DataBaseManager(){}

    /**
     * 初始化
     */
    public static synchronized void initializeInstance(SQLiteOpenHelper helper) {
        if (instance == null) {
            instance = new DataBaseManager();
            mDatabaseHelper = helper;
        }
    }

    /**
     * 获得当前实例对象
     */
    public static synchronized DataBaseManager getInstance() {
        if (instance == null) {
            throw new IllegalStateException(
                    DataBaseManager.class.getSimpleName()
                            + " is not initialized, call initializeInstance(..) method first.");
        }
        return instance;
    }

    /**
     * 打开数据库对象
     */
    public synchronized SQLiteDatabase openDatabase() {
        if (mOpenCounter.incrementAndGet() == 1) {
            mDatabase = mDatabaseHelper.getWritableDatabase();
        }
        return mDatabase;
    }

    /**
     * 多线程下关闭
     */
    public synchronized void closeDatabase() {
        if (mOpenCounter.decrementAndGet() == 0) {
            mDatabase.close();
        }
    }
}

4.一些数据库的基本操作

/**
 * Created by can on 2018/2/26.
 *  消息数据库的操作方法
 */


public class MessageDataBaseUtils {

    private static SQLiteDatabase db;
    private static Context context;

    public MessageDataBaseUtils(Context mContext){
        context = mContext;
        MessageDataOpenHelper dd = new MessageDataOpenHelper(context);
        DataBaseManager.initializeInstance(dd);
        db = DataBaseManager.getInstance().openDatabase();
    }

    /**
     * 关闭数据库
     */
    public  void closeDataBase(){
        if(db!=null&&db.isOpen())
            DataBaseManager.getInstance().closeDatabase();
    }

    /**
     * 获取数据库所有数据
     */
    public  List<MessageBean> getMessages(){
        List<MessageBean> list = new ArrayList<>();
        Cursor cursor = db.query("message", null, null, null, null, null, null);
        while (cursor.moveToNext()) {
            String noeTitle = cursor.getString(cursor.getColumnIndex("noeTitle"));
            String noeTime = cursor.getString(cursor.getColumnIndex("noeTime"));
            String isRead = cursor.getString(cursor.getColumnIndex("isRead"));
            list.add(new MessageBean(noeTitle,noeTime,isRead));
        }
        cursor.close();
        return list;
    }

    /**
     * 添加数据
     */
    public  void addMessage(String noeTitle,String noeTime, String isRead){
        if(db!=null&&noeTitle!=null)
            db.execSQL("insert into message(noeTitle,noeTime,isRead) values(?,?,?)",new Object[]{noeTitle,noeTime,isRead});
    }

    /**
     * 清空数据
     */
    public void clearMessage(){
        db.execSQL("delete from message");
    }

    /**
     * 查询数据
     */
    public  boolean searchMessage(String noeTitle){
        if(db!=null&&noeTitle!=null){
            Cursor cursor = db.rawQuery("select * from message where noeTitle=? ",new String[]{noeTitle});
            while (cursor.moveToNext()){
                cursor.close();
                return true;
            }
        }
        return false;
    }

    /**
     * 查询消息是否已读
     */
    public  boolean searchMessageIsRead(String noeTitle){
        if(db!=null&&noeTitle!=null){
            Cursor cursor = db.rawQuery("select * from message where noeTitle=? ",new String[]{noeTitle});
            while (cursor.moveToNext()){
                String isRead = cursor.getString(cursor.getColumnIndex("isRead"));
                cursor.close();
                if(isRead.equals("1")){
                    return true;
                }
            }
        }
        return false;
    }

    /**
     * 设置消息已读
     */
    public void setMessageIsRead(String noeTitle) {
        if(db!=null&&noeTitle!=null){
            String sql = "update message set isRead=? where noeTitle=?";
            Object bindArgs[] = new Object[] { 1, noeTitle };
            db.execSQL(sql, bindArgs);
        }
    }

}

5.源码地址

https://github.com/xuwennengcan/MySqlite

猜你喜欢

转载自blog.csdn.net/xuwenneng/article/details/79376746