SORU
28 EYLÜL 2010, Salı


En iyi çoklu tablolar Android içerik sağlayıcılar kullanarak sergilemek için uygulamalar

Olaylar için bir masa ve yerler için bir tablo var sağlayan bir uygulama inşa ediyorum. Diğer uygulamalar bu verilere erişim izni vermek mümkün olmak istiyorum. Bir kaç soru sorun bu tür için en iyi uygulamaları ile ilgili.

  1. Nasıl veritabanı sınıfları yapısı gerekir? Ben şu anda sahip sınıflar için EventsDbAdapter ve VenuesDbAdapter sağlar mantığını sorgulamak her tablo, süre olması ayrı bir DbManager (genişletir SQLiteOpenHelper) yönetmek için veritabanı sürüm oluşturma/yükseltme veritabanları, erişim vermek için veritabanı (getWriteable/ReadeableDatabase). Bu önerilen çözüm, ya da daha iyi ya da bir sınıf (örn. her şeyi konsolide olurum bu DbManager) ya da her ayrılık ve her Bağdaştırıcı izin SQLiteOpenHelper uzanır?

  2. Nasıl birden fazla tablo için içerik sağlayıcılar tasarım gerekir? Bir önceki soruya uzanan, her uygulama için bir İçerik Sağlayıcı kullanmalıyım, ya da Olaylar ve yerler için ayrı sağlayıcıları oluşturmak gerekir?

Bulduğum örneklerin çoğu sadece tek bir tablo uygulamaları ile başa çıkmak, bir püf noktası burada ... çok memnun olurum.

CEVAP
5 Aralık 2010, Pazar


Muhtemelen senin için biraz geç oldu, ama diğerleri bu yararlı olabilir.

İlk birden çok CONTENT_URİs oluşturmanız gerekir

public static final Uri CONTENT_URI1 = 
    Uri.parse("content://"  PROVIDER_NAME   "/sampleuri1");
public static final Uri CONTENT_URI2 = 
    Uri.parse("content://"  PROVIDER_NAME   "/sampleuri2");

Sonra URİ Eşleştirici genişletin

private static final UriMatcher uriMatcher;
static {
    uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
    uriMatcher.addURI(PROVIDER_NAME, "sampleuri1", SAMPLE1);
    uriMatcher.addURI(PROVIDER_NAME, "sampleuri1/#", SAMPLE1_ID);      
    uriMatcher.addURI(PROVIDER_NAME, "sampleuri2", SAMPLE2);
    uriMatcher.addURI(PROVIDER_NAME, "sampleuri2/#", SAMPLE2_ID);      
}

Sonra tablo oluşturmak

private static final String DATABASE_NAME = "sample.db";
private static final String DATABASE_TABLE1 = "sample1";
private static final String DATABASE_TABLE2 = "sample2";
private static final int DATABASE_VERSION = 1;
private static final String DATABASE_CREATE1 =
    "CREATE TABLE IF NOT EXISTS "   DATABASE_TABLE1   
    " ("   _ID1   " INTEGER PRIMARY KEY AUTOINCREMENT,"   
    "data text, stuff text);";
private static final String DATABASE_CREATE2 =
    "CREATE TABLE IF NOT EXISTS "   DATABASE_TABLE2   
    " ("   _ID2   " INTEGER PRIMARY KEY AUTOINCREMENT,"   
    "data text, stuff text);";

onCreate() 7* *ikinci eklemeyi unutmayın

Bir kullanmak için gidiyoruzswitch-caseBlok Masa kullanıldığını belirlemek için. Bu ekleme benim kodudur

@Override
public Uri insert(Uri uri, ContentValues values) {
    Uri _uri = null;
    switch (uriMatcher.match(uri)){
    case SAMPLE1:
        long _ID1 = db.insert(DATABASE_TABLE1, "", values);
        //---if added successfully---
        if (_ID1 > 0) {
            _uri = ContentUris.withAppendedId(CONTENT_URI1, _ID1);
            getContext().getContentResolver().notifyChange(_uri, null);    
        }
        break;
    case SAMPLE2:
        long _ID2 = db.insert(DATABASE_TABLE2, "", values);
        //---if added successfully---
        if (_ID2 > 0) {
            _uri = ContentUris.withAppendedId(CONTENT_URI2, _ID2);
            getContext().getContentResolver().notifyChange(_uri, null);    
        }
        break;
    default: throw new SQLException("Failed to insert row into "   uri);
    }
    return _uri;                
}

, *, getType, *update10 vb devide gerekir. Sağlayıcınız DATABASE_TABLE veya CONTENT_URİ için çağrıları her yerde bir olgu eklemek ve DATABASE_TABLE1 veya CONTENT_URİ1 var ve istediğiniz kadar için gelecek ve #2.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • bashirsultani

    bashirsultan

    22 Mart 2010
  • Doc Adams

    Doc Adams

    20 HAZİRAN 2007
  • Miles Fisher

    Miles Fisher

    8 NİSAN 2009