2012-08-10 17 views
26

generic biçiminde Bundle nesnesinde yinelenen yardımcı yöntem oluşturmaya çalışıyorum. ByTüm Bundle nesnelerinde yineleme nasıl yapılır

"jenerik" Yani:

  1. parametre olarak geçirilen Bundle nesnelerin adlarını (tuşlar) bilmemiz gerekir vermez.
  2. Gelecekte başka bir üyenin (anahtarın) Bundle eklenmesi gerekmiyor.

Şimdiye kadar, bunu gerçekleştirmek için aşağıdaki anahat anlamaya:

private void bundleToSharedPreferences(Bundle bundle) { 
    Set<String> keys = bundle.keySet(); 
    for (String key : keys) { 
     Object o = bundle.get(key); 
     if (o.getClass().getName().contentEquals("int")) { 
      // save ints 
     } 
     else if (o.getClass().getName().contentEquals("boolean")) { 
      // save booleans 
     } 
     else if (o.getClass().getName().contentEquals("String")) { 
      // save Strings 
     } 
     else { 
      // etc. 
     } 
    } 
    } 

bu yaklaşım hiçbir şekilde anlam mı?

Bunu gerçekleştirmenin daha iyi bir yolu var mı?

+2

Bu tasarımın herhangi bir anlam ifade etmediğini düşünüyorum.Tercihleriniz ve bir pakette gelenler, tercihe göre eşlenmesi gereken belirli anahtarlara sahip olduğunuzdan, her zaman pakete girmemelidir. Bunlar, kodlanmış olması gereken anahtarlarla tanımlanır. – JoxTraex

+0

Sanırım haklısınız. Ama bir Bundle'u (yerel) kalıcı depolamaya kaydetmek için herhangi bir ** sane ** yolu var mı? – ateiob

+0

Bir SQLite veritabanı kullanmaya çalışıyorum. – JoxTraex

cevap

3

Bunu yapsam, bunu yansıtma yoluyla yapardım. Stat.class öğesinin SharedPreference.putString() ile eşleştiği şekilde statik bir Harita depolayın. Daha sonra, öğeler arasında geçiş yaparken sınıflarını haritaya göre kontrol edin. Eğer mevcut değilse, süper sınıfı kontrol edin. Bu size ya doğru çağrı yöntemini verecektir ya da istenen nesnenin türünün tercihlere eklenebilecek bir şey olmadığını bilmenizi sağlayacaktır.

Yani temel algoritma şudur:

  1. sınıf haritası Eğer durum bu ise
  2. ise
  3. Bkz sınıfsal alın paket
  4. nesneyi alın, belirtilen yöntemi çağırmak PaylaşılanPreferences
  5. içine koymak için , bu sınıfı alın ve 3. adıma geri dönün.
  6. Eğer java.lang.Obj kadar tüm yolu alırsanız ect, daha sonra SharedPreferences'da hemen depolanamayan bir paket var. Bu yol boyunca isabet ettiğiniz sınıflara bağlı olarak, bununla da uğraşmak isteyebilirsiniz ya da sadece hatayı kaydetmek ve devam etmek isteyebilirsiniz. 'u bilmeden, neden yapıyorsunuz, yöntem başarısız olduğunda nasıl tepki vermeniz gerektiğini tahmin etmek imkansız. Her iki paket ve tercihler üzerinde tam bir kontrole sahip olmadıkça her zaman değişecektir, ancak bu kontrol miktarına sahipseniz, bu çemberler arasında zıplamaya gerek yoktur çünkü çok daha basit ve basitçe kendi tanımınızı yapabilirsiniz. anahtarlar.

Not: yansıma hızlı değildir ve kodlanması ve bakımı en kolay şey değildir. Mümkünse, kullanım durumunuza uyan daha az genel bir yöntem bulmanızı tavsiye ederim.

+1

Bunu "* Bund ** nesnesiyle bütünleştirin! *" şeklinde yorumluyorum. Başka kimse daha iyi bir cevap vermediğinden kabul ediyorum. – ateiob

52

Her şeyi toString() yöntemini kullanarak String olarak kaydedebilir misiniz? İlkel türlerin Nesne eşdeğerleriyle eşleştirilip eşlenmediğini (ör., Tamsayıya tam tersi) eşleme yapmazlar, ancak eğer öyleyse, olası her bir sınıfı zahmetli bir şekilde kontrol etmek yerine, böyle bir şey yapabilirsiniz. Bu ihtiyaçlarınız için çalışacak, ama şu an bir JSON dizeye bir paket dönüştürmek için benzer bir şey yapmaya çalışıyorum eğer

for (String key : bundle.keySet()) { 
     saveKeyValueInPrefs(key, bundle.get(key).toString()); //To Implement 
} 

emin değilim.

İlgili konular