Merhaba, Çok mu basit bir yerde hata var bilmiyorum ama 2 gündür bununla uğraşıyorum. Veritabanından gelen verileri bir nesneyi gömüp arrayliste atamaya çalışıyorum.Verilerin her zaman benzersiz geldiği kesin.Ama her yeni gelen veriyi liste atadığımda listteki tüm elemanlar o veri oluyor.Yani listin tüm elemanları o anki eleman oluyor. Göremediğim bir şey mi var?

public  ArrayList<Word> getChoicePack(SQLiteDatabase db,ArrayList<String> notIn){
    Cursor cursorOther=null;
    cursorOther=db.rawQuery("SELECT  * FROM words  ORDER BY RANDOM() ",null);
     int i=1;
    ArrayList<Word> quizWords=new ArrayList<Word>();
    if(cursorOther.moveToFirst()){
       do{

            Word word=new Word(cursorOther.getInt(0),cursorOther.getString(1),cursorOther.getString(2),cursorOther.getString(3),Integer.parseInt(cursorOther.getString(4)));
            quizWords.add(word);
            Log.v("i-->", String.valueOf(i));
            Log.v("current word --_>",word.toString());

            i++;
      }while (cursorOther.moveToNext());
        cursorOther.close();

   }else{
              }
    return quizWords;
}

soruldu: 08 Tem '15, 18:09

Mustafa's gravatar image

Mustafa
226449
cevap kabul oranı: 0%

kapatıldı: 09 Tem '15, 05:51

1

Word sınıfınızda static tanımlı değişkenler olabilir mi ? Word sınıfınızı da ekleyebilir misiniz soruya ? Daha kolay çözüm üretebiliriz böylelikle.

(09 Tem '15, 02:50) ersinyildiz ersinyildiz's gravatar image
1

Teşekkürler. Kafa dalgınlığı değişken ve metodların hepsini static yapmışım .

(09 Tem '15, 05:50) Mustafa Mustafa's gravatar image

Bu soru 09 Tem '15, 05:51 Mustafa tarafından "Bu soru cevaplandı ve bir cevap daha önce kabul edildi" gerekçesiyle kapatıldı.


Kodun okunabilirliği anlamında, metod geçtiğiniz "notIn" hiç kullanmamışsınız, kullanılmıyorsa silinmeli ;

private static final Logger LOGGER = LoggerFactory.getLogger(ClassName.class); //slf4j Logger
private static final String SQL_QUERY = "SELECT * FROM words  ORDER BY RANDOM()";
public  ArrayList<Word> getChoicePack(SQLiteDatabase db){
    try{
    Cursor cursorOther = db.rawQuery(QUERY, null);
    List<Word> quizWords= new ArrayList<Word>();
      if(!cursorOther.moveToFirst()){
          return quizWords;
      }

      while(cursorOther.moveToNext()){
            Word word= prepareWordInstanceFromDB(cursorOther);
            quizWords.add(word);
     }        
    }catch(Exception e){
        LOGGER.error("Exception occured when preparing word instance from db {}", e);
        //custom exception atılabilir, handle etmek için
    }finally{      
      closeQuietly(cursorOther);
    }
    return quizWords;
}

private Word prepareWordInstanceFromDB(Cursor cursorOther){
return new Word(cursorOther.getInt(0),cursorOther.getString(1),cursorOther.getString(2),cursorOther.getString(3),Integer.parseInt(cursorOther.getString(4)));
}

private void closeQuietly(Cursor cursorOther){
    if(cursorOther == null){
        return;
    }
    cursorOther.close();
}

Sorununuza gelince ; "Verilerin her zaman benzersiz geldiği kesin." böyle bir kesinlik yada zorunluluk varsa kullanılan Cursor kütüphanesinde bir sıkıntı vardır. Bu metodun unit testi varmı? Unit testler geçiyor mu? Yoksa Unit testlerini yazıp, görmeli.. eşeği sağlam kazığa baylayacaksak programatik olarakta önlem alınabilir ve defansif bir önlem olarak Set ile add işlemi yapılabilir;

private static final Logger LOGGER = LoggerFactory.getLogger(ClassName.class); //slf4j Logger
private static final String SQL_QUERY = "SELECT * FROM words  ORDER BY RANDOM()";
public  ArrayList<Word> getChoicePack(SQLiteDatabase db){
    try{
    Cursor cursorOther = db.rawQuery(QUERY, null);
    Set<Word> quizWords = new LinkedHashSet<Word>(); //sıralı olsun diye.. Linked
      if(!cursorOther.moveToFirst()){
          return wordList(quizWords);
      }

      while(cursorOther.moveToNext()){
            Word word= prepareWordInstanceFromDB(cursorOther);
            quizWords.add(word);
     }        
    }catch(Exception e){
        LOGGER.error("Exception occured when preparing word instance from db {}", e);
        //custom exception atılabilir, handle etmek için
    }finally{      
      closeQuietly(cursorOther);
    }
    return wordList(quizWords);
}

private ArrayList<Word> wordList(Set<Word> quizWords){
  return new ArrayList<Word>(quizWords);
}

private Word prepareWordInstanceFromDB(Cursor cursorOther){
return new Word(cursorOther.getInt(0),cursorOther.getString(1),cursorOther.getString(2),cursorOther.getString(3),Integer.parseInt(cursorOther.getString(4)));
}

private void closeQuietly(Cursor cursorOther){
    if(cursorOther == null){
        return;
    }
    cursorOther.close();
}
permanent link

cevaplandı: 09 Tem '15, 03:06

Turgay%20Can's gravatar image

Turgay Can
8.3k63798
cevap kabul oranı: 18%

değiştirildi: 09 Tem '15, 03:08

Bu soruyu takip et

E-Posta üzerinden:

Üyelik girişi yaptıktan sonra abonelik işlemlerini yapabilirsiniz

RSS üzerinden:

Cevaplar

Cevaplar ve Yorumlar

Yazı Formatlama

  • *italic* ya da _italic_
  • **bold** ya da __bold__
  • link:[text](http://url.com/ "başlık")
  • resim?![alt text](/path/img.jpg "başlık")
  • liste: 1. Foo 2. Bar
  • temel HTML etiketleri de kullanılabilir

Bu sorunun etiketleri:

×819
×39
×4

Soruldu: 08 Tem '15, 18:09

Görüntüleme: 380 kez

Son güncelleme: 09 Tem '15, 05:51

powered by BitNami OSQA