Я пытаюсь создать приложение для извлечения данных 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, а также одно из моих первых приложений.Я предполагаю, что ошибка легко решается кем-то, имеющим опыт, и обычно она оказывается глупой ошибкой с моей стороны, хотя я не могу на всю жизнь понять, что это будет.