2016-08-13 17 views
5

Kullanıcının, robotun daha sonra cihazdan getireceği zımba kombinasyonlarını tanımlayabileceği bir robot için bir uygulama üzerinde çalışıyorum. Kullanıcının bu eğitimleri saklamasına izin vermek için, eğitimin kimliğini, adını ve yumruk kombinasyonunu tutan bir sınıf "Eğitimler" tanımladım. Bu eğitim daha sonra bir DatabaseHandler sınıfı yazdığım bir veritabanına kaydedilir. Ekleme ve görüntüleme verileri çalışıyor ama aşağıda yöntemi ile bir girişi silmek istediğinizde:Nullpointer SQL veritabanından girişi sildikten sonra Nullpointer İstisnası

public void deleteTraining(Training training) { 
     SQLiteDatabase db = this.getWritableDatabase(); 

     db.delete(TABLE_TRAININGS, KEY_ID + " = ?", 
     new String[] { String.valueOf(training.getID()) }); 
     db.close(); 
} 

ve daha sonra tekrar benim GridView doldurmak için deneyin (bir GridAdapter sınıfı tarafından ele), bir Nullpointer olsun İstisna

java.lang.NullPointerException: com.noeth.tobi bir boş nesne referans
ilgili alan 'java.lang.String com.noeth.tobi.mcrobektrainingsplaner.Training._name' okuma çalışıldı. mcrobektrainingsplaner.GridAdapter.getView (GridAdapter.java:50)

GridAdapter ait GetView yöntemi:

public View getView(int position, View convertView, ViewGroup parent) { 
    if (convertView == null) { 
     // if it's not recycled, initialize some attributes 
     btn = new Button(context); 
     btn.setLayoutParams(new GridView.LayoutParams(370, 350)); 
     btn.setPadding(2,100,2,100); 
     btn.setOnClickListener(new CustomOnClickListener(position, context)); 
     btn.setOnLongClickListener(new CustomOnLongClickListener(position, context, btn)); 

    } 
    else { 
     btn = (Button) convertView; 
    } 

    btn.setText(db.getTraining(position)._name); //Here the programm throws a Nullpointer Exception AFTER deleting an entry from the database 

    btn.setTextColor(Color.WHITE); 
    btn.setBackgroundResource(R.drawable.button_border); 
    btn.setTag("not_activated"); 
    btn.setId(position); 

    return btn; 
} 
ben döngü sadece bir yöntem yazdı nedenle tüm kimlikleri geçer gibi, silinen eğitimin kimliği ile ilgili bir şey olması gerektiğini düşündüm

public void recalcIDs(){ 
    int k = 1; 
    int subtract = 1; 
    int id; 
    Training training; 

    for(int i = deleted.get(0)+1; i < db.getTrainingCount(); i++){ 
     if(deleted.size() > 1){ 
      if(i < deleted.get(k)){ 
       training = db.getTraining(i); 
       id = training.getID(); 
       training.setID(id-subtract); 
      } 
      else{ 
       k+=1; 
       subtract+=1; 
      } 
     } 
     else{ 
      training = db.getTraining(i); 
      id = training.getID(); 
      training.setID(id-subtract); 
     } 


    } 

} 

Ancak bu değil
recalcIDs: silinen eğitimden sonra gelen her öğenin kimliği yeniden hesaplar recalcIDs düzelt.
Uygulamayı yeniden yüklerken ve tamamen yeni bir veritabanıyla başlayarak her zaman tekrar çalışır.
Yanlış yaptığım bir fikri olan var mı?

P.S. .: Burada ismi bulamıyorum getTraining bir yöntem vardır: Ben veritabanını çağırmaz sizin Training.setId yöntemi farz ediyorum

Training getTraining(int id) { 
    SQLiteDatabase db = this.getReadableDatabase(); 
    Training training; 
    Cursor cursor = db.query(TABLE_TRAININGS, new String[] { KEY_ID, 
        KEY_NAME, KEY_SK}, KEY_ID + "=?", 
      new String[] { String.valueOf(id) }, null, null, null, null); 
    if (cursor != null && cursor.moveToFirst()){ 

    training = new Training(Integer.parseInt(cursor.getString(0)), 
      cursor.getString(1), cursor.getLong(2)); 
     cursor.close(); 
    } 
    else{ 
     training = null; 
     Toast.makeText(con,"Couldn't find any training sessions!", Toast.LENGTH_LONG).show(); 
    } 

    // return training 
    return training; 
} 
+0

Önce geçerli tüm db'yi db'den sorgulayın, sonra bunları konumlara eşleyin. –

cevap

2

. Eğitiminizin kimliğini değiştirmemelisiniz çünkü alt katman veritabanı tarafından yönetiliyorlar. Siz yalnızca uygulama mantığındaki kimlikleri değiştirirseniz, hem veri kümeleri (uygulama ve veritabanı) farklılık gösterir. Bir kullanıcı silme kararı aldıktan sonra Gridview.notifyDatasetChanged numaralı telefonu arayarak tüm eğitimleri veritabanından yeniden yüklemenizi tavsiye ederim.

+0

Bu, veritabanlarının her öğe için kendine özgü bir kimliği olduğu anlamına mı geliyor? Şu anda "DatabaseHandler.getTraining" tarafından çağrılan ve "Training.setID" tarafından belirlenen ID, Eğitim sınıfının içindeki bir değişkendir. Böyle bir soru için özür dilerim, ancak düzenli olarak veritabanlarıyla çalışmıyorum. –

+0

Bir soru daha: kaç eğitimin daha önce girildiğini nasıl belirliyorsunuz? – Jacob

+0

Bunu böyle yapıyorum: http://pastebin.com/vdDWMz6Z –

İlgili konular