2013-03-06 3 views
0

Это мой журнал CatПростой запрос возвращает ошибку

  java.lang.RuntimeException: Unable to start activity ComponentInfo{XXXXXX}: java.lang.IllegalStateException: Couldn't read row 0, col 0 from CursorWindow. Make sure the Cursor is initialized correctly before accessing data from it. 
     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1960) 
     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1985) 
     at android.app.ActivityThread.access$600(ActivityThread.java:127) 
     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1151) 
     at android.os.Handler.dispatchMessage(Handler.java:99) 
     at android.os.Looper.loop(Looper.java:137) 
     at android.app.ActivityThread.main(ActivityThread.java:4482) 
     at java.lang.reflect.Method.invokeNative(Native Method) 
     at java.lang.reflect.Method.invoke(Method.java:511) 
     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:794) 
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:561) 
     at dalvik.system.NativeStart.main(Native Method) 
     Caused by: java.lang.IllegalStateException: Couldn't read row 0, col 0 from  CursorWindow. Make sure the Cursor is initialized correctly before accessing data from it. 
     at android.database.CursorWindow.nativeGetString(Native Method) 
     at android.database.CursorWindow.getString(CursorWindow.java:442) 
     at android.database.AbstractWindowedCursor.getString(AbstractWindowedCursor.java:51) 
     at com.gallops.CheckProfile.fillData(CheckProfile.java:171) 
     at com.gallops.CheckProfile.onCreate(CheckProfile.java:154) 
     at android.app.Activity.performCreate(Activity.java:4728) 
     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1051) 
     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1924) 
     ... 11 more 

Запросов Я пытаюсь запустить: // DBAdapter файл

public Cursor fetchRow(String a) { 
      String Key = a; 
      return mDb.query(DATABASE_TABLE0, new String[] {IDno1, GIDno1,Name1,Owner1,Breed1,Gender1, Notes1,Nature1,Color1,Sire1,Dam1,Height1,Foaled1,Acquired1,Date1,IMG}, "IDno=?",new String[]{Key}, null, null, null, null); 
} 

Функция, через которую я даю ему вызов:

  private void fillData() { 
    String D = getid(); 

    Cursor c = DBHelper.fetchRow(IDB); 

    // List<String> idList = new ArrayList<String>(); 
    if (c.moveToFirst()) { 
     do { 
      String X = (c.getString(c.getColumnIndexOrThrow("IDno"))); 
      TextView tv2=(TextView)findViewById(R.id.textView3); 
      tv2.setText(X); 

      String B = (c.getString(c.getColumnIndexOrThrow("GIDno"))); 
      TextView tv6=(TextView)findViewById(R.id.textView7); 
      tv6.setText(B); 

      String A = (c.getString(c.getColumnIndexOrThrow("Name"))); 
      TextView tv=(TextView)findViewById(R.id.textView1); 
      tv.setText(A); 
      NameTop = A; 

      String Y = (c.getString(c.getColumnIndexOrThrow("Owner"))); 
      TextView tv12=(TextView)findViewById(R.id.textView13); 
      tv12.setText(Y); 

      String G = (c.getString(c.getColumnIndexOrThrow("Breed"))); 
      TextView tv10=(TextView)findViewById(R.id.textView11); 
      tv10.setText(G); 

      String N = (c.getString(c.getColumnIndexOrThrow("Notes"))); 
      TextView tv8=(TextView)findViewById(R.id.textView9); 
      tv8.setText(N); 

      String da = (c.getString(c.getColumnIndexOrThrow("Dam"))); 
      TextView tv14=(TextView)findViewById(R.id.TextView02); 
      tv14.setText(da); 

      String si = (c.getString(c.getColumnIndexOrThrow("Sire"))); 
      TextView tv16=(TextView)findViewById(R.id.TextView04); 
      tv16.setText(si); 

      String co = (c.getString(c.getColumnIndexOrThrow("Color"))); 
      TextView tv18=(TextView)findViewById(R.id.TextView06); 
      tv18.setText(co); 


      String g = (c.getString(c.getColumnIndexOrThrow("Gender"))); 
      TextView tv20=(TextView)findViewById(R.id.TextView08); 
      tv20.setText(g); 


      String na = (c.getString(c.getColumnIndexOrThrow("Nature"))); 
      TextView tv22=(TextView)findViewById(R.id.TextView10); 
      tv22.setText(na); 


      String he = (c.getString(c.getColumnIndexOrThrow("Height"))); 
      TextView tv24=(TextView)findViewById(R.id.TextView12); 
      tv24.setText(he); 


      String fo = (c.getString(c.getColumnIndexOrThrow("Foaled"))); 
      //TextView tv26=(TextView)findViewById(R.id.TextView14); 
      //tv26.setText(fo); 


      String ac = (c.getString(c.getColumnIndexOrThrow("Acquired"))); 
      TextView tv28=(TextView)findViewById(R.id.TextView16); 
      tv28.setText(ac); 

      /*Dt = (c.getString(c.getColumnIndexOrThrow("Date"))); 
      int age = age(Dt); 
      TextView Tvx =(TextView)findViewById(R.id.textView5); 
      String DD = Integer.toString(age); 
      Tvx.setText(DD); */ 

      Image = c.getBlob(c.getColumnIndex("image")); 

      if (Image!=null){ 
      BitmapFactory.Options options = new BitmapFactory.Options(); 
        bitmap = BitmapFactory.decodeByteArray(Image, 0, Image.length, options); 
        ImageView Img = (ImageView)findViewById(R.id.imageView1); 
        Img.setImageBitmap(bitmap); 
      }else{ 
       ImageView Img = (ImageView)findViewById(R.id.imageView1); 
       Img.setBackgroundResource(R.drawable.pic); 
      } 

     } while (c.moveToNext()); 
     DBHelper.close(); 

    } 
} 
+2

Не закрывайте базу данных внутри предложения if. Закройте его из 'if (c.moveToFirst()) {}'. – GrIsHu

+0

Спасибо, что указал на это. Я изменил его! – Skynet

ответ

1

Попробуйте

Объявите курсор глобально в своей деятельности

Курсор datacursor;

And then assign to datacursor instead of c. 

datacursor = DBHelper.fetchRow(IDB); 

Доступ к строке с помощью datacursor

+0

Пробовал это тоже, я отчитаю, если снова столкнусь с этой проблемой. Спасибо за помощь. Хотя мне интересно, как это может изменить способ заполнения курсора. – Skynet

1

Вы, вероятно, будете хотеть, чтобы писать некоторые отладочные строки, что выход на LogCat, чтобы убедиться, что ваши на самом деле получить информацию в курсоре и что вы получаете информацию вы думаете вы должны быть.

Вам также необходимо проверить, что курсор не имеет значения null, прежде чем пытаться использовать данные из него. Если курсор равен NULL, приложение выйдет из строя. Я узнал, что это трудно. Вы можете проверить нулевой курсор, используя:

if(cu != null && cu.getCount() > 0){ 
    cu.moveToFirst(); 
    // The rest of your code 
} 
+0

Эта ошибка возникает только в некоторых случаях, когда я запрашиваю, для других полей в базе данных (в строках) она работает нормально. Только в некоторых случаях это всплывает, плюс я уверен, что имею данные в базе данных, как я могу видеть это в браузере SQLite. – Skynet

+1

У меня тоже были данные в моей базе данных, но иногда мой SQL не возвращал то, что я думал. Просто что-то полезное, чтобы иметь в виду будущие ссылки. – ubundude

+0

Спасибо большое matey Я буду реализовывать это :) – Skynet

Смежные вопросы