2011-11-11 5 views
1

データベースにあるすべてのテーブルをリストビューに表示しようとしていますが、テーブル名の文字列配列を作成してlistView、私はリストビューを作成するアクティビティを呼び出すボタンを持っています。アクティビティは自分のデータベースクラスからgetDbNamesを呼び出します。私はこのエラーを日食でLogCatで得る:AndroidのSQLiteデータベースでテーブルの名前を取得しようとしたときにエラーが発生しました

タグ - CursorWindow
テキスト - フィールドスロット1、-1のリクエストが間違っています。 numRows = 3、numColumns = 1

あなたのお手伝いができるかどうかを私のデータベースクラス全体に含めます。

package the.paddox.pool; 

import java.util.ArrayList; 

import android.content.ContentValues; 
import android.content.Context; 
import android.database.Cursor; 
import android.database.SQLException; 
import android.database.sqlite.SQLiteDatabase; 
import android.database.sqlite.SQLiteOpenHelper; 

public class Database { 

public static final String KEY_ROWID = "_id"; 
public static final String KEY_NAME = "newplayersname"; 
public static final String KEY_PERCENTAGE = "percentage"; 

private static final String DATABASE_NAME = "paddoxa"; 
private static final String DATABASE_TABLE = "players"; 
private static final int DATABASE_VERSION = 1; 

private DbHelper ourHelper; 
private final Context ourContext; 
private SQLiteDatabase ourDatabase; 

public static class DbHelper extends SQLiteOpenHelper{ 

    public DbHelper(Context context) { 
     super(context, DATABASE_NAME, null, DATABASE_VERSION); 
     // TODO Auto-generated constructor stub 
    } 

    @Override 
    public void onCreate(SQLiteDatabase db) { 
     // TODO Auto-generated method stub 
     db.execSQL("CREATE TABLE " + DATABASE_TABLE + " (" + 
       KEY_ROWID + " INTEGER PRIMARY KEY AUTOINCREMENT, " + 
       KEY_NAME + " TEXT NOT NULL);" 
       ); 
    } 

    @Override 
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
     // TODO Auto-generated method stub 
     db.execSQL("DROP TABLE IF EXISTS " + DATABASE_TABLE); 
     onCreate(db); 
    } 

} 

public Database(Context c){ 
    ourContext = c; 
} 

public Database open() throws SQLException{ 
    ourHelper = new DbHelper(ourContext); 
    ourDatabase = ourHelper.getWritableDatabase(); 
    return this; 
} 

public void close(){ 
    ourHelper.close(); 
} 

public long createEntry(String name) { 
    // TODO Auto-generated method stub 
    ContentValues cv = new ContentValues(); 
    cv.put(KEY_NAME, name); 
    return ourDatabase.insert(DATABASE_TABLE, null, cv); 
} 

public String[] getData() { 
    // TODO Auto-generated method stub 
    String[] columns = new String[] { KEY_NAME}; 
    Cursor c = ourDatabase.query(DATABASE_TABLE, columns, null, null, null, null, null); 
    String result =""; 
    String[] mString = {""}; 
    ArrayList<String> playersData = new ArrayList<String>(); 

    int iName = c.getColumnIndex(KEY_NAME); 

    for (c.moveToFirst(); !c.isAfterLast(); c.moveToNext()){ 
     result = c.getString(iName); 
     playersData.add(result); 
    } 
    mString = (String[]) playersData.toArray(new String[playersData.size()]); 
    return mString; 
} 

public String[] getDBNames() { 
    String[] result = null; 
    Cursor c = ourDatabase.rawQuery("SELECT name FROM sqlite_master WHERE type='table'", null); 
    c.moveToFirst(); 
    result = new String[c.getCount()]; 
    int i = 0; 
    while (c.moveToNext()) { 
     result[i] = c.getString(c.getColumnIndex(DATABASE_TABLE)); 
     i++; 
    } 
    return result; 
} 


} 

ご協力いただければ幸いです。

答えて

0

iNameを取得しようとすると、そのステートメントの前にc.moveToFirst();が呼び出されていないため、このエラーが発生していると思います。代わりに

あなたはそれが好きで使用することができます:

for (c.moveToFirst(); !c.isAfterLast(); c.moveToNext()){ 
    result = c.getString(c.getColumnIndex(KEY_NAME)); 
    playersData.add(result); 
} 
0

name

ためgetDBNames()列のそれのリスト行としてでクエリ

"SELECT name FROM sqlite_master WHERE type='table'"
を確認してくださいあなたの
c.getColumnIndex(DATABASE_TABLE) // DATABASE_TABLE = "players" in your code.
が実際に動作しないとのように返されます-1。

詳細については、hereを参照してください。

希望すると、これ以上作業するのに役立ちます。

関連する問題