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;
}
Önce geçerli tüm db'yi db'den sorgulayın, sonra bunları konumlara eşleyin. –