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