私は、アプリケーションが実行される前にディレクトリにコピーされた既存のデータベースから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.
アイブ氏はしばらくの間、これに取り組んでき、すべてを訪問した ガイド、チュートリアル、そしてSOFに関する多くの質問をしてきました。私はこの問題を理解しているようです。
これは私の最初のSQLiteデータベースへの進出であり、私の最初のアプリケーションの1つです。私が経験したことで誰かが簡単に解決できるものだと仮定すると、私の人生はそれが何であるかを把握することはできませんが、私は何らかの愚かなミスで終わります。
コードを見てください。指定されたIDが一致する場合、これは単一の列を返します。 – adatapost
ああ。ありがとうございました。それはそれだった。それは私の愚かなことだと分かっていた。 また、誰かが不思議に思っているのは、一度値を返すだけだったので、whileループとmoveToNextを削除する必要があります。 – r2DoesInc