2016-04-07 22 views
0

Bunun nasıl yapılacağı konusunda biraz kafam karıştı. İşte benim DatabaseHelper sınıftır:Android'de Sqlite veritabanı için Singleton desenini kullanma

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

Ve bu doğru ise, nasıl düzgün bir db yöntemi çağırmak yok:

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

    ... 

bu hak olduğunu varsayarsak, bu sorgulama sınıfını işlemek için doğru yoldur Herhangi bir yerde etkinlik, parça, vb. gibi başka bir yerden.

cevap

2

DatabaseHelper yapıcı private yapmalı ve bu sınıfın örneklerini getInstance yöntemini kullanarak oluşturmalısınız. örneğin: mSQLHelper = DatamabseHelper.getInstance(context).

Bu sınıfın yöntemini çağırmak için böyle bir şey yapabilirsiniz.

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

Ve DatabaseProcessor işlevlerinin hiçbirini kullanma, bunu yapabilirsiniz:

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

bu tekil bir yaklaşım başlayanlar için bazı sorunları vardır unutmayın, bu çoklu desteklemez, orada İki iş parçacığı aynı anda bir örnek istese, yalnızca bir örnek oluşturulacağını garanti edecek bir mekanizma yoktur.

+0

Ben de bu kurucuyu özel yapmayı düşündüm (birkaç örnek çevrimiçi kamuya açıktı, ben de öyle yaptım), ama bunu duyduğuma sevindim. Öyleyse kodun içinde bir yerde olduğunu söyleyelim, nasıl 'insertSomethingIntoDb' diye adlandırırsınız? DatabaseProcessor db = new DatabaseProcessor (getActivity()); 've sonra' db yapar mıyım? insertSomethingIntoDb ("some_key"); '? – KaliMa

+0

"getInstance (...)" yöntemi "statik" olduğundan, bunu yapabilirsin 'DatabaseHelper.getInstance (context) .insertSomethingIntoDb (...)' – Titus

+0

Teknik olarak bu şekilde yapamam, işlev İşlemci sınıfında – KaliMa

İlgili konular