2016-04-07 15 views
0

これを正しく行う方法が少し分かりません。ここに私のDatabaseHelperクラスです:AndroidでSqliteデータベースのシングルトンパターンを使用する

public class DatabaseProcessor { 

    private SQLiteDatabase mDatabase; 
    private DatabaseHelper mSQLHelper; 
    private Context mContext; 

    public DatabaseProcessor(Context context) { 
     mContext = context; 
     mSQLHelper = new DatabaseHelper(mContext); 
    } 

    private void open() throws SQLException { 
     mDatabase = mSQLHelper.getWritableDatabase(); 
    } 

    private void close() { 
     mDatabase.close(); 
    } 

    public void insertSomethingIntoDb(String key) { 
     ContentValues values = new ContentValues(); 
     values.put("some_column_name", name); 
     open(); 
     mDatabase.insert("some_table_name", null, values); 
     close(); 
    } 
... 

そして、これが正しいならば、どのように私はきちんとデシベルメソッドを呼び出します:

public class DatabaseHelper extends SQLiteOpenHelper { 
    private static DatabaseHelper mInstance = null; 

    private static final String DB_NAME = "database.db"; 
    private static final int DB_VERSION = 1; 

    private Context mContext; 

    public static DatabaseHelper getInstance(Context context) { 

     if (mInstance == null) { 
      mInstance = new DatabaseHelper(context.getApplicationContext()); 
     } 
     return mInstance; 
    } 

    public DatabaseHelper(Context context) { 
     super(context, DB_NAME, null, DB_VERSION); 
     mContext = context; 
    } 

    ... 

これが正しいと仮定すると、これは、照会クラスを処理するための正しい方法でありますアクティビティ、フラグメントなどのコード内のどこからでも、どこからでもアクセスできます。

答えて

2

DatabaseHelperコンストラクタをprivateにして、getInstanceメソッドを使用してこのクラスのインスタンスを作成する必要があります。例:mSQLHelper = DatamabseHelper.getInstance(context)

このクラスのメソッドを呼び出すには、次のようなことができます。

​​

そしてDatabaseProcessor機能のいずれかを使用して、あなたがこれを行うことができます:

new DatabaseProcessor(context).insertSomethingIntoDb(...); 

このシングルトンアプローチはいくつかの問題を抱えていることに注意してくださいは、スターターのために、それはそこに、マルチスレッドをサポートしていません。 2つのスレッドが同時にインスタンスを要求する場合、1つのインスタンスしか作成されないことを保証するメカニズムはありません。

+0

私はそのコンストラクタを非公開にすることも考えていました(私はそれをちょうどそのようにしてしまったので、いくつかの例を公開しました)が、これを聞いてうれしく思います。だからコードのどこかにいるとしましょう。あなたは 'insertSomethingIntoDb'をどのように呼びますか?私は 'DatabaseProcessor db = new DatabaseProcessor(getActivity());'と 'dbを実行しますか? insertSomethingIntoDb( "some_key"); '? – KaliMa

+0

'getInstance(...)'メソッドが 'static'なので、これを行うことができます。' DatabaseHelper.getInstance(context).insertSomethingIntoDb(...) ' – Titus

+0

私は技術的にそれを行うことはできません。プロセッサークラス – KaliMa

関連する問題