在移动开发中,我们难免会遇到对于消息数据类的处理,比如说记录一篇文章是否已经阅读过,这时候可能我们会使用到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); } } }