SORU
17 AĞUSTOS 2010, Salı


() SQLiteOpenHelper onUpgrade Karışıklık Android

Bir veritabanı ile ilk uygulamamı yapıyorum ve küçük bir sorun onUpgrade işlevini anlama yaşıyorum. Benim veritabanı kullanıcı favori böylece bir öğe ile bir masa ve sevdiğim bir sütunu olan bir madde. En çok ben sadece masaya bırakın ve yeniden görmek ama bunu yapmak istemiyorum uygulamaları. Tablo için daha fazla öğe eklemek mümkün olmak istiyorum.

Ne zaman app android pazar aracılığıyla yükseltilir veritabanı biliyor mu onun sürüm numarası? Kod sürüm sayısını artırmak ve ihracat pazarı için ve daha sonra kullanıcı ilk kez yükseltilmiş versiyonu yüklediğinde edebilirim ... sonra onUpgrade mi diyeceğiz?

Eğer bu durumda benim onUpgrade sadece bir dosyadan çekin ve veritabanı öğeleri ekleyin. Bu şeyler yapıyor ya da orada Android bu işleme daha iyi bir şekilde standart bir yoldur. Mümkün olduğunca standart kalmaya çalışıyorum.

Teşekkürler

CEVAP
17 AĞUSTOS 2010, Salı


Tamam, önce kızlar daha büyük sorunların gerektiğini biliyorum SQLite sınırlı üzerinde ALTER TABLE komutu sağlar add rename sadece hayır/Kaldır damla yapılır Rekreasyon tablosu.

Her zaman el altında yeni bir tablo oluşturma sorgu olmalı ve yükseltmek için kullanın ve varolan herhangi bir veri transferi. OnUpgrade yöntemleri sqlite yardımcı nesnesi için çalışır ve tüm tabloları işlemek gerekir. not:

Tavsiye onUpgrade.

  • beginTransaction
  • if not exists tablo oluşturma (yükseltme yapıyoruz, tablo değiştirme ve bırakma başarısız olur henüz mevcut değil bu yüzden
  • bir liste mevcut sütun List<String> columns = DBUtils.GetColumns(db, TableName); koymak
  • yedek tablosu (ALTER table " TableName " RENAME TO 'temp_" TableName)
  • new table (yeni tablo oluşturma şema) oluşturma
  • yeni sütunlar, bu kez sütunlar yükseltilmiş tablosundan alınan (columns.retainAll(DBUtils.GetColumns(db, TableName));) ile kesiştiği
  • verileri (String cols = StringUtils.join(columns, ","); db.execSQL(String.format( "INSERT INTO %s (%s) SELECT %s from temp_%s", TableName, cols, cols, TableName)); ) geri yükleme
  • yedek tablosu (DROP table 'temp_" TableName) kaldırın
  • setTransactionSuccessful

(Bu tablo düşürme bakmaz, eğer bir sütunu yeniden adlandırırsanız, sütun adları eşleşmiyor olarak mevcut veri transfer olsun) yok.

.

public static List<String> GetColumns(SQLiteDatabase db, String tableName) {
    List<String> ar = null;
    Cursor c = null;
    try {
        c = db.rawQuery("select * from "   tableName   " limit 1", null);
        if (c != null) {
            ar = new ArrayList<String>(Arrays.asList(c.getColumnNames()));
        }
    } catch (Exception e) {
        Log.v(tableName, e.getMessage(), e);
        e.printStackTrace();
    } finally {
        if (c != null)
            c.close();
    }
    return ar;
}

public static String join(List<String> list, String delim) {
    StringBuilder buf = new StringBuilder();
    int num = list.size();
    for (int i = 0; i < num; i  ) {
        if (i != 0)
            buf.append(delim);
        buf.append((String) list.get(i));
    }
    return buf.toString();
}

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Chaoticmoogle

    Chaoticmoogl

    13 ŞUBAT 2006
  • Kim Barbin

    Kim Barbin

    3 Mayıs 2012