Android CursorWindow возвращает только 1 строку, 1 столбец - PullRequest
0 голосов
/ 27 декабря 2011

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

Класс 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, хотя я жестко закодировал значение в оператор запроса, чтобы убедиться, что проблема не связана с какими-либо неинициализированными переменными.

songFinalValue ссылается на первый столбец, Id.Значение, которое я пытаюсь вернуть, имеет соответствующий заголовок, столбец 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.

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

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

1 Ответ

1 голос
/ 11 января 2012

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

Взгляните на код - db.rawQuery ("ВЫБЕРИТЕ заголовок ИЗ МУЗЫКИ ГДЕ Id = 5899;", ноль); Это вернет один столбец, если данный идентификатор совпадает. - AVD 27 декабря 2011 г. в 4:04

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...