2016-04-07 2 views
0

Я немного смущен, как это сделать правильно. Вот мой DatabaseHelper класс:Использование шаблона Singleton для базы данных Sqlite в Android

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; 
    } 

    ... 

Предполагая, что это правильно, это правильный способ справиться с классом запрашивая:

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(); 
    } 
... 

И если это так, как я правильно вызвать метод дб из какого-либо другого кода, такого как Activity, Fragment и т. д., где угодно.

ответ

2

Вы должны сделать конструктор DatabaseHelperprivate и создать экземпляры этого класса с помощью метода getInstance. например: mSQLHelper = DatamabseHelper.getInstance(context).

Чтобы вызвать метод этого класса, вы можете сделать что-то вроде этого.

DatabaseHelper.getInstance(context).someFunction(...); 

И использовать любой из DatabaseProcessor функций, вы можете сделать это:

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

Имейте в виду, что этот синглтон подход имеет некоторые проблемы, для начала, он не поддерживает многопоточность, там не существует механизма для обеспечения того, что если два потока запросят экземпляр одновременно, будет создан только один экземпляр.

+0

Я тоже думал о том, чтобы сделать этот конструктор частным (несколько примеров в Интернете были опубликованы, поэтому я оставил его на всякий случай), но я рад это слышать. Итак, скажем, вы где-то в коде, как бы вы назвали 'insertSomethingIntoDb'? Будет ли я работать с DatabaseProcessor db = new DatabaseProcessor (getActivity()), а затем 'db. insertSomethingIntoDb ("some_key"); '? – KaliMa

+0

Поскольку метод 'getInstance (...)' является 'static', вы можете сделать это' DatabaseHelper.getInstance (context) .insertSomethingIntoDb (...) ' – Titus

+0

Я не могу технически сделать это таким образом, функция в классе Процессор – KaliMa

Смежные вопросы