写了个数据库操作类,担心同步出问题?

原创 2017年01月03日 02:45:42
使用synchronized,却一直不很明白,是否已经做到同步绝对没问题了?

/*
 * 类介绍:数据库帮助
 * 
 * 说明:参考http://bbs.51cto.com/thread-990260-1.html
 * 如果多线程同时读写,保持单个SqliteOpenHelper实例,同时对所有数据库操作的方法添加synchronized关键字。
 */
public class DatabaseHelper extends SQLiteOpenHelper {
public static final String TAG = "DatabaseHelper";

private static DatabaseHelper instance;

/**
 * 构造
 * @param context
 */
private DatabaseHelper(Context context) {
super(context, DatabaseBean.DB_NAME, null, DatabaseBean.DB_VERSION);
}

/**
 * 获得单实例
 * @param context
 * @return
 */
public synchronized static DatabaseHelper the(Context context) {
if (DatabaseHelper.instance == null) {
DatabaseHelper.instance = new DatabaseHelper(context);
}

return DatabaseHelper.instance;
}

@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(DatabaseBean.DB_CREATE_TABLE_MSGBOX);
}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// TODO Auto-generated method stub
}

/**
 * 总数
 * @return
 */
    public synchronized long getCount() {
     long count = 0;
try {
SQLiteDatabase db = getReadableDatabase();
String sql = "SELECT COUNT(*) FROM " + DatabaseBean.DB_TABLE_MSGBOX;
SQLiteStatement sqLiteStatement = db.compileStatement(sql);
count = sqLiteStatement.simpleQueryForLong();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
         close();
        }
    
        return count;
    }
    
    /**
 * 查询
 * @param index
 * @return
 */
    public synchronized DatabaseBean query(int index) {
     DatabaseBean databaseBean = new DatabaseBean();
try {
SQLiteDatabase db = getWritableDatabase();
Cursor cursor = db.query(DatabaseBean.DB_TABLE_MSGBOX, null, null, null, null, null, null);
if (cursor != null) {
if (cursor.moveToPosition(index)) {
int id = cursor.getInt(DatabaseBean.COLUMN_IDX_ID);
String datatime = cursor.getString(DatabaseBean.COLUMN_IDX_DATETIME);
String content = cursor.getString(DatabaseBean.COLUMN_IDX_CONTENT);
databaseBean.setId(id);
databaseBean.setDatatime(datatime);
databaseBean.setContent(content);
}
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
         close();
        }
    
        return databaseBean;
    }
    
    /**
 * 插入
 * @param datetime
 * @param content
 * @return
 */
    public synchronized long insert(String datetime, String content) {
try {
SQLiteDatabase db = getWritableDatabase();
ContentValues contentValues = new ContentValues();
contentValues.put(DatabaseBean.COLUMN_DATETIME, datetime);
contentValues.put(DatabaseBean.COLUMN_CONTENT, content);
long count = db.insert(DatabaseBean.DB_TABLE_MSGBOX, null, contentValues);
return count;
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
         close();
        }
        
        return -1;
    }
    
    /**
     * 删除
     * @param id
     * @return
     */
    public synchronized int delete(int id) {
     int count = -1;
try {
SQLiteDatabase db = getWritableDatabase();
String[] whereArgs = {""+id};
count = db.delete(DatabaseBean.DB_TABLE_MSGBOX, DatabaseBean.WHERECLAUSE, whereArgs);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
         close();
        }
        
        return count;
    }
}

/**
 * 类介绍:数据库数据区定义
 */
public class DatabaseBean {
public static final String DB_NAME = "avc.db";
public static final int DB_VERSION = 1;
public static final String DB_TABLE_MSGBOX = "msgbox";

public static final String COLUMN_ID = "id";
public static final String COLUMN_DATETIME = "datetime";
public static final String COLUMN_CONTENT = "content";

public static final String[] COLUMNS = {
COLUMN_ID, COLUMN_DATETIME, COLUMN_CONTENT
    };
    
    public static final int COLUMN_IDX_ID = 0;
    public static final int COLUMN_IDX_DATETIME = 1;
    public static final int COLUMN_IDX_CONTENT = 2;

//最后COLUMNS没有逗号
public static final String DB_CREATE_TABLE_MSGBOX = "create table if not exists " + DB_TABLE_MSGBOX + "("
+ COLUMN_ID + " integer primary key autoincrement,"
+ COLUMN_DATETIME + " varchar(20),"
+ COLUMN_CONTENT + " varchar(120)"
+ ")";

public static final String WHERECLAUSE = COLUMN_ID + "=?";

private int id;
private String datatime;
private String content;

/**
 * 构造
 */
public DatabaseBean() {
super();
id = 0;
datatime = "";
content = "";
}

/**
 * @return the id
 */
public int getId() {
return id;
}

/**
 * @param id the id to set
 */
public void setId(int id) {
this.id = id;
}

/**
 * @return the datatime
 */
public String getDatatime() {
return datatime;
}

/**
 * @param datatime the datatime to set
 */
public void setDatatime(String datatime) {
this.datatime = datatime;
}

/**
 * @return the content
 */
public String getContent() {
return content;
}

/**
 * @param content the content to set
 */
public void setContent(String content) {
this.content = content;
}
}

相关文章推荐

使用模块Q的promise机制实现数据库操作的同步问题

附上上一篇文章链接: node.js对mongodb的连接&增删改查(附async同步流程控制)(上)上一篇文章说到,关于耦合度很高的对数据库的连续操作,如何实现同步流程控制呢?使用了async模块...

Oracle之 dmp导入/导出、数据库操作等过程中的字符集问题

开篇: 本文转自:http://blog.163.com/jiankun_liu/blog/static/1863927762013698175289/ 原文标题:Oracle_字符集问题(数据...

Qt 多线程与数据库操作需要注意的几点问题

彻底抛弃MFC, 全面应用Qt 已经不少时间了。除了自己看书按步就班做了十几个验证性的应用,还正式做了3个比较大的行业应用,总体感觉很好。Native C++ 下, Qt 基本是我用过的最简便的界面库...

php在执行mysql存储过程后执行其他数据库操作问题解决方法

问题描述:php在执行mysql存储过程后执行其他数据库操作时,报错Commands out of sync; you can't run this command now 产生原因:1、存储过程产生...

Oracle之 dmp导入/导出、数据库操作等过程中的字符集问题

开篇:因为要定位一个 关于dmp文件导入的乱码问题, 于是乎我开始了漫长了 Oracle字符集搜索之路,网上关于讲解oracle字符集的文章多得数不胜数,但转载的这篇文章确是我最最喜欢的,图文并茂,恰...

Oracle之 dmp导入/导出、数据库操作等过程中的字符集问题

Oracle之 dmp导入/导出、数据库操作等过程中的字符集问题 开篇:因为要定位一个 关于dmp文件导入的乱码问题, 于是乎我开始了漫长了 Oracle字符集搜索之路,网上关于讲解orac...
  • haiross
  • haiross
  • 2014年01月13日 16:57
  • 14395

Qt 多线程与数据库操作需要注意的几点问题

Qt的数据库操作自成一派,相对于复杂的 ADO \ODBC\DAO\OLEDB 等传统 C++ 访问数据库的方法,还是很先进的,充分体现了 OO 的理念。对数据库的封装,想法是很有意思的。设计者把进程...

Oracle中dmp导入/导出、数据库操作等过程中的字符集问题

描述:本文主要记录了Oracle数据库的字符集问题,也涉及作为服务器操作系统的UNIX/LINUX、CentOS或者Windows的字符集与Oracle字符集之间的关联关系。 Oracle数据库的字...
  • Scofy0
  • Scofy0
  • 2015年12月16日 11:30
  • 1153

spring的数据库操作问题(具体实例是mybatis)

没有啦 !

greenDAO对数据库操作的升级问题

最近项目中用到了数据库,第三方库greenDAO对数据库操作的封装有特别好用,因此在项目中集成了greenDAO。但是当项目版本升级的时候,遇到了数据库升级的问题。经查greenDAO的源码,发现它对...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:写了个数据库操作类,担心同步出问题?
举报原因:
原因补充:

(最多只允许输入30个字)