2016-05-21 92 views
0

我創建一個服務,其中有三個主題:將使SQLiteOpenHelper類成爲單線程使其線程安全嗎?

  • GPS定位跟蹤器,將寫位置值到數據庫中。
  • 發送程序線程,它們都讀取和寫入數據庫。
  • 接收器線程也讀取和寫入數據庫。

現在我已經看到類似these的帖子,其中說只有一個助手類應該可用以及僅在數據庫連接上可用。我試圖通過使用Singleton模式來實現Helper類的一個實例,但是我完全困惑於如何去創建只有一個數據庫連接來實現前面提到的三個任務。這是我的Helper類的實現。

package com.example.userpc.roadtracker; 

import android.content.Context; 
import android.database.sqlite.SQLiteDatabase; 
import android.database.sqlite.SQLiteOpenHelper; 

/** 
    * Created by USER PC on 5/21/2016. 
*/ 
public class DatabaseHelper extends SQLiteOpenHelper { 

    private static final String DATABASE_NAME="location_service.db"; 
    private static final int VERSION=1; 
    private static final String DB_CREATE="CREATE TABLE `location_service`.`location` (`id` INT NOT NULL AUTO_INCREMENT , `longitude` DOUBLE NOT NULL , `latitude` DOUBLE NOT NULL , PRIMARY KEY (`id`), UNIQUE (`longitude`, `latitude`)) ENGINE = MyISAM;"; 

    private static SQLiteDatabase mDatabase=null; 
    private static DatabaseHelper mDatabaseHelper=null; 

    private DatabaseHelper(Context context) { 
     super(context, DATABASE_NAME, null, VERSION); 
    } 

    public static DatabaseHelper getInstance(Context context) 
    { 
     if(mDatabaseHelper==null) 
      return new DatabaseHelper(context); 
     else 
      return mDatabaseHelper; 
    } 

    public SQLiteDatabase getUsableDataBase() 
    { 
     if(mDatabase==null) 
      return this.getWritableDatabase(); 
     else 
      return mDatabase; 
    } 

    @Override 
    public void onCreate(SQLiteDatabase sqLiteDatabase) { 
     sqLiteDatabase.execSQL(DB_CREATE); 
    } 

    @Override 
    public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) { 

    } 
} 

在此先感謝。

回答

1

不,您仍然需要同步您訪問SQLiteOpenHelper實例的代碼塊。

它將是一個Singleton實例,但這並不意味着2個線程將無法訪問同一個實例。