2011-12-27 3 views
0

Я пытаюсь создать приложение, чтобы вытащить данные sqlite из существующей базы данных, скопированной в каталог до запуска приложения. База данных содержит более 2000 строк и около 20 столбцов.Android CursorWindow возвращает только 1 строку, 1 столбец

DBAdapter класс.

package com.t3hh4xx0r.gmusicsniper; 

import android.content.Context; 
import android.database.Cursor; 
import android.database.SQLException; 
import android.database.sqlite.SQLiteDatabase; 
import android.database.sqlite.SQLiteOpenHelper; 

public class DBAdapter { 

    public static final String KEY_ROWID = "Id"; 
    public static final String KEY_TITLE = "Title"; 
    private static final String DATABASE_NAME = Constants.gMusicSniperDir + Constants.musicDB; 
    private static final String DATABASE_TABLE = "MUSIC"; 

    private static final int DATABASE_VERSION = 37; 


    private final Context context; 

    private DatabaseHelper DBHelper; 
    private SQLiteDatabase db; 

    public DBAdapter(Context ctx) { 
     this.context = ctx; 
     DBHelper = new DatabaseHelper(context); 
    } 

    private static class DatabaseHelper extends SQLiteOpenHelper { 
     DatabaseHelper(Context context) { 
      super(context, DATABASE_NAME, null, DATABASE_VERSION); 
     } 

     @Override 
     public void onCreate(SQLiteDatabase arg0) { 
      // TODO Auto-generated method stub 

     } 

     @Override 
     public void onUpgrade(SQLiteDatabase arg0, int arg1, int arg2) { 
      // TODO Auto-generated method stub 

     } 
    } 

    //---opens the database--- 
    public DBAdapter open() throws SQLException { 
     db = SQLiteDatabase.openDatabase(DATABASE_NAME, null, SQLiteDatabase.OPEN_READONLY); 
     return this; 
    } 

    //---closes the database---  
    public void close() { 
     DBHelper.close(); 
    } 

    //---retrieves a particular title--- 
    public Cursor getTitle(int songFinalValue) throws SQLException { 
     Cursor mCursor = 
       db.rawQuery("SELECT Title FROM MUSIC WHERE Id = 5899;", null); 
       //db.query(DATABASE_TABLE, new String [] {KEY_TITLE}, KEY_ROWID + " = \'" + songFinalValue + "\'", null, null, null, null); 
     if (mCursor != null) { 
      mCursor.moveToFirst(); 
     } 
     return mCursor; 
    } 

} 

Метод, в котором данные должны быть восстановлены. songFinalValue находится в этом тестовом примере 5899, хотя ive жестко закодировал значение в запросе, чтобы убедиться, что проблема не была с любыми неинициализированными переменными.

songFinalValue относится к первому столбцу Id. Значение, которое Im пытается вернуть это к соответствующему Название колонке 13.

private void getTrackName(String songFinal) { 
     int songFinalValue = Integer.parseInt(songFinal); 
     DBAdapter db = new DBAdapter(this); 

     //---get a title--- 
     db.open(); 
     Cursor c = db.getTitle(songFinalValue); 
     while (c.isAfterLast() == false && c != null) { 
      c.getString(13); // will fetch you the data 
      c.moveToNext(); 
      //DisplayTitle(c); 
      String cS = String.valueOf(c);    
Log.d("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!", cS); 
      } 
     db.close(); 
     } 

Когда бежал, это ошибки с

E/CursorWindow(17998): Failed to read row 0, column 13 from a CursorWindow which has 1 rows, 1 columns. 
    E/su  (18033): sudb - Database closed 
    W/System.err(17998): java.lang.IllegalStateException: Couldn't read row 0, col 13 from CursorWindow. Make sure the Cursor is initialized correctly before accessing data from it. 

Ive работает над этим некоторое время, и посетили каждый руководство, учебник, и вылил много вопросов SOF, и я не могу понять, что проблема.

Это мой первый набег на базы данных SQLite, а также одно из моих первых приложений. Я предполагаю, что ошибка - это что-то, легко решаемое кем-либо с опытом, обычно заканчивается какой-то глупой ошибкой с моей стороны, хотя я не могу, чтобы жизнь меня определяла, что это будет.

+1

Посмотрите на код - db.rawQuery («SELECT Title FROM MUSIC WHERE Id = 5899;», null); Это приведет к возврату одного столбца, если заданы ID-совпадения. – adatapost

+0

ах. Спасибо. Вот и все. Знаешь, это было что-то глупое с моей стороны. Кроме того, для кого-то еще интересно, потому что он возвращался только после значения, цикл while и moveToNext должны быть удалены. – r2DoesInc

ответ

1

Ответил в комментариях.

Посмотрите на код - db.rawQuery ("SELECT Title FROM MUSIC WHERE Id = 5899;", null); Это приведет к возврату одного столбца, если заданы ID-совпадения. - AVD Dec 27 '11 at 4:04

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