2011-12-27 10 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. 

アイブ氏はしばらくの間、これに取り組んでき、すべてを訪問した ガイド、チュートリアル、そしてSOFに関する多くの質問をしてきました。私はこの問題を理解しているようです。

これは私の最初のSQLiteデータベースへの進出であり、私の最初のアプリケーションの1つです。私が経験したことで誰かが簡単に解決できるものだと仮定すると、私の人生はそれが何であるかを把握することはできませんが、私は何らかの愚かなミスで終わります。

+1

コードを見てください。指定されたIDが一致する場合、これは単一の列を返します。 – adatapost

+0

ああ。ありがとうございました。それはそれだった。それは私の愚かなことだと分かっていた。 また、誰かが不思議に思っているのは、一度値を返すだけだったので、whileループとmoveToNextを削除する必要があります。 – r2DoesInc

答えて

1

コメントが回答されました。

code-db.rawQuery( "SELECT Title FROM MUSIC WHERE Id = 5899;"、null);を参照してください。指定されたIDが一致する場合、これは単一の列を返します。 - AVD Dec 27 '11 at 4:04

関連する問題