1
我已經使用SQLiteOpenHelper創建了一個DB助手。我在Singleton模式中創建了相同的方法來停止創建多個數據庫對象。由於有來自多個線程的數據庫操作,因此我保持線程安全的對象創建,並使其同步。Android數據庫幫助單身人士和同步
public class DatabaseManager{
private static final String DATABASE_NAME = "dbname";
private static final int DATABASE_VERSION = 1;
private DatabaseHelper helper;
private SQLiteDatabase db;
private Context context;
private DatabaseManager(Context c){
this.context = c;
helper = new DatabaseHelper(context);
}
private static final Object lock = new Object();
private static volatile DatabaseManager instance;
public static DatabaseManager getInstance(Context c){
DatabaseManager r = instance;
if (r == null) {
synchronized (lock) { // While we were waiting for the lock, another
r = instance; // thread may have instantiated the object.
if (r == null) {
r = new DatabaseManager();
instance = r;
}
}
}
return r;
}
public Cursor getAll() {
SQLiteDatabase db = _openHelper.getReadableDatabase();
if (db == null) {
return null;
}
return db.rawQuery("select * from todos order by priority, title", null);
}
public void delete(long id) {
SQLiteDatabase db = _openHelper.getWritableDatabase();
if (db == null) {
return;
}
db.delete("todos", "_id = ?", new String[] { String.valueOf(id) });
db.close();
}
public long add(String title, int priority) {
SQLiteDatabase db = _openHelper.getWritableDatabase();
if (db == null) {
return 0;
}
ContentValues row = new ContentValues();
row.put("title", title);
row.put("priority", priority);
long id = db.insert("todos", null, row);
db.close();
return id;
}
public void update(long id, String title, int priority) {
SQLiteDatabase db = _openHelper.getWritableDatabase();
if (db == null) {
return;
}
ContentValues row = new ContentValues();
row.put("title", title);
row.put("priority", priority);
db.update("todos", row, "_id = ?", new String[] { String.valueOf(id) });
db.close();
}
class DatabaseHelper extends SQLiteOpenHelper{
DatabaseHelper(Context context){
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db){
db.execSQL("create table todos (_id integer primary key autoincrement, title text, priority integer)");
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion){
}
}
}
現在我應該需要同步的get(),加(),更新(),刪除()方法也使他們線程安全的?