2016-03-16 21 views
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(),加(),更新(),刪除()方法也使他們線程安全的?

回答