SORU
1 AĞUSTOS 2011, PAZARTESİ


SQLiteDatabase için kullanarak Singleton tasarım deseni

Android üzerinde oldukça acemi değilim, ve basit bir uygulama üzerinde bazı temel deneyim elde etmek için çalışıyorum. Benim uygulaması oldukça basittir ve yayın alıcısı ve bazı faaliyetleri diğer şeyler arasında oluşur. Her iki bileşen tek bir veritabanı kullanmak, teoride her iki db aynı anda erişim olabilir.

Şu anda sadece db başlatmasını ben bir Yardımcı Sınıf SQLite db) ihtiyacım var her zaman nesne ve gerekli işlemleri gerçekleştirmek: sorgu, ekleme, vb.

Ne okuyorum burada ve diğer bazı belgeler, bu sorunun bir "db kilitli" istisna diye db erişilen aynı anda, bu yüzden daha iyi bir yaklaşım olacağını olan bir tek örnek bu db nesne yani tüm bileşenleri aynı db bağlantısı her zaman.

Yukarıdaki mantık doğru mu? Bir tek o zaman bunun için yeteri kadar iyi bir çözüm olurdu? Bazı titiz bunun aksini iddia biliyorum, ama lütfen bunu yapmayacağım şeyler yapıyor diğer durumlarda gelemez yüzden oldukça basit bir uygulama olduğunu unutmayın.

Aksi takdirde, daha iyi bir seçenek ne olabilir? İçerik sağlayıcı kullanarak ilgili yazılar okumuştum ama diğer faaliyetleri ile veri paylaşımı için ilgilenmiyorum ayrıca çok fazla bu olur. Nitekim post Bu okudum ve oldukça faydalı buldum.

Şimdiden teşekkürler.

CEVAP
14 ŞUBAT 2012, Salı


Click here to see my blog post on this subject.


Burada üç olası yaklaşımlar gösteren bazı örnek kod. Bu uygulama boyunca veritabanına erişim sağlayacaktır.

Yaklaşım #1: `SQLiteOpenHelper` statik veri üyesi olmak zorunda

Bu tam bir uygulama değil, ama doğru DatabaseHelper Sınıf tasarımı hakkında gitmek için nasıl iyi bir fikir verebilir. Statik fabrika metodu aynı anda tek bir DatabaseHelper örneği var olmamasını sağlar.

/**
 * create custom DatabaseHelper class that extends SQLiteOpenHelper
 */
public class DatabaseHelper extends SQLiteOpenHelper { 
    private static DatabaseHelper mInstance = null;

    private static final String DATABASE_NAME = "databaseName";
    private static final String DATABASE_TABLE = "tableName";
    private static final int DATABASE_VERSION = 1;

    private Context mCxt;

    public static DatabaseHelper getInstance(Context ctx) {
        /** 
         * use the application context as suggested by CommonsWare.
         * this will ensure that you dont accidentally leak an Activitys
         * context (see this article for more information: 
         * http://android-developers.blogspot.nl/2009/01/avoiding-memory-leaks.html)
         */
        if (mInstance == null) {
            mInstance = new DatabaseHelper(ctx.getApplicationContext());
        }
        return mInstance;
    }

    /**
     * constructor should be private to prevent direct instantiation.
     * make call to static factory method "getInstance()" instead.
     */
    private DatabaseHelper(Context ctx) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
        this.mCtx = ctx;
    }
}

Yaklaşım #2: soyut bir `ContentProvider` ile SQLite veritabanı

Bu öneririm yaklaşımdır. Bir, yeni CursorLoader sınıf gerektirir ContentProviders, bu yüzden eğer istediğiniz bir Etkinlik veya parçasına uygulanması LoaderManager.LoaderCallbacks<Cursor> CursorLoader (öneririm yararlanmak, o büyülü!), uygulamanız için ContentProvider bir uygulamaya ihtiyacınız olacak. Ayrıca, ContentProviders ile Tek bir veritabanı Yardımcısı yapma konusunda endişelenmenize gerek yok. Sadece Ara getContentResolver() Etkinlik ve sistemi ilgilenecek her şey için (başka bir deyişle, gerek tasarımı için bir Singleton deseni önlemek için birden çok örneğini oluşturulan).

Bu yardımcı olur umarım!

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Grace Su

    Grace Su

    6 Ocak 2006
  • Joanna Okrajni

    Joanna Okraj

    4 EYLÜL 2010
  • Paste Magazine

    Paste Magazi

    28 AĞUSTOS 2008