Android 数据库助手单例和同步

标签 android sqlite synchronization singleton

我使用 SQLiteOpenHelper 创建了一个数据库助手。我在 Singleton 模式中创建了相同的模式以停止创建多个数据库对象。由于有来自多个线程的数据库操作,我保持对象创建线程安全,我让它同步。

    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()、add()、update()、delete() 方法以使其成为线程安全的?

最佳答案

SqliteDatabase is thread safe by default所以你不应该同步get、update等函数。

另请查看 SqliteDatabase synchronization

顺便说一句,你实际上是在创建一个 Content Provider .为什么不直接使用 ContentProvider 类?

关于Android 数据库助手单例和同步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36034413/

相关文章:

android - 在 fragment 内的后退按钮上关闭 Youtube Player 全屏

android - 尝试在空对象引用上调用虚拟方法 'void com.google.android.gms.maps.GoogleMap.setOnMapLongClickListener'

objective-c - SQLite 的 strftime/julianday 和 Cocoa 的 timeIntervalSince1970 之间有差异吗?

iphone - 谁能告诉我为什么我的代码无法创建数据库和表,然后在其中存储数据。

java - 反向读写锁

android - 带抽屉导航的 PreferenceActivity 抛出空指针异常

android - 在 Android 中,_id 是否必须存在于任何创建的表中?

Java synchronized 似乎被忽略了

dataframe - 在 Julia 中与 @sync @async 并行

android - 如何在 Android Studio 中垂直居中 ConstraintLayout 内容?