Я пытаюсь создать приложение, чтобы вытащить данные 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, а также одно из моих первых приложений. Я предполагаю, что ошибка - это что-то, легко решаемое кем-либо с опытом, обычно заканчивается какой-то глупой ошибкой с моей стороны, хотя я не могу, чтобы жизнь меня определяла, что это будет.
Посмотрите на код - db.rawQuery («SELECT Title FROM MUSIC WHERE Id = 5899;», null); Это приведет к возврату одного столбца, если заданы ID-совпадения. – adatapost
ах. Спасибо. Вот и все. Знаешь, это было что-то глупое с моей стороны. Кроме того, для кого-то еще интересно, потому что он возвращался только после значения, цикл while и moveToNext должны быть удалены. – r2DoesInc