Java 尝试获取Android SQLite数据库中表的名称时出错

Java 尝试获取Android SQLite数据库中表的名称时出错,java,android,sqlite,listview,Java,Android,Sqlite,Listview,我试图在列表视图中列出数据库中的所有表,方法是创建表名的字符串数组,然后将它们传递给listView。我有一个按钮,用于调用创建listView的活动。该活动从我的数据库类调用getDbNames。我在eclipse中的LogCat中遇到以下错误: 标记-光标窗口 Text-字段插槽1的错误请求,-1。numRows=3,numColumns=1 我将包括我的整个数据库类,看看您是否可以提供帮助 package the.paddox.pool; import java.util.ArrayLi

我试图在列表视图中列出数据库中的所有表,方法是创建表名的字符串数组,然后将它们传递给listView。我有一个按钮,用于调用创建listView的活动。该活动从我的数据库类调用getDbNames。我在eclipse中的LogCat中遇到以下错误:

标记-光标窗口
Text-字段插槽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;
}


}
打包.paddox.pool;
导入java.util.ArrayList;
导入android.content.ContentValues;
导入android.content.Context;
导入android.database.Cursor;
导入android.database.SQLException;
导入android.database.sqlite.SQLiteDatabase;
导入android.database.sqlite.SQLiteOpenHelper;
公共类数据库{
公共静态最终字符串键_ROWID=“_id”;
公共静态最终字符串键\u NAME=“newplayersname”;
公共静态最终字符串键\u PERCENTAGE=“PERCENTAGE”;
私有静态最终字符串数据库\u NAME=“paddoxa”;
私有静态最终字符串数据库\u TABLE=“players”;
私有静态最终int数据库_VERSION=1;
私人助理;
私人最终语境;
私有SQLITE数据库;
公共静态类DbHelper扩展了SQLiteOpenHelper{
公共DbHelper(上下文){
super(上下文、数据库名称、null、数据库版本);
//TODO自动生成的构造函数存根
}
@凌驾
public void onCreate(SQLiteDatabase db){
//TODO自动生成的方法存根
db.execSQL(“创建表”+数据库表+”(“+
KEY_ROWID+“整数主键自动递增,”+
键_NAME+“文本不为空);”
);
}
@凌驾
public void onUpgrade(SQLiteDatabase db,int-oldVersion,int-newVersion){
//TODO自动生成的方法存根
db.execSQL(“如果存在删除表”+数据库_表);
onCreate(db);
}
}
公共数据库(上下文c){
ourContext=c;
}
公共数据库open()引发SQLException{
ourHelper=newdbhelper(ourContext);
ourDatabase=ourHelper.getWritableDatabase();
归还这个;
}
公众假期结束(){
ourHelper.close();
}
公共长createEntry(字符串名称){
//TODO自动生成的方法存根
ContentValues cv=新的ContentValues();
简历(姓名、钥匙);
返回ourDatabase.insert(DATABASE_TABLE,null,cv);
}
公共字符串[]getData(){
//TODO自动生成的方法存根
字符串[]列=新字符串[]{KEY_NAME};
游标c=ourDatabase.query(数据库表,列,null,null,null,null,null);
字符串结果=”;
字符串[]mString={”“};
ArrayList PlayerData=新的ArrayList();
int iName=c.getColumnIndex(键名称);
for(c.moveToFirst();!c.isAfterLast();c.moveToNext()){
结果=c.getString(iName);
playersData.add(结果);
}
mString=(字符串[])playersData.toArray(新字符串[playersData.size()]);
返回mString;
}
公共字符串[]getDBNames(){
字符串[]结果=null;
游标c=ourDatabase.rawQuery(“从sqlite_master中选择名称,其中type='table',null);
c、 moveToFirst();
结果=新字符串[c.getCount()];
int i=0;
while(c.moveToNext()){
结果[i]=c.getString(c.getColumnIndex(数据库_表));
i++;
}
返回结果;
}
}

任何帮助都将不胜感激。

我想,您会遇到此错误,因为在您试图获取
的地方,您没有调用
c.moveToFirst()在该语句之前

相反,您可以像这样使用它:

for (c.moveToFirst(); !c.isAfterLast(); c.moveToNext()){
    result = c.getString(c.getColumnIndex(KEY_NAME));
    playersData.add(result);
}
请检查您的查询是否实际不起作用,并返回为-1

查看详细信息。

希望这将帮助您进一步工作

"SELECT name FROM sqlite_master WHERE type='table'" c.getColumnIndex(DATABASE_TABLE) // DATABASE_TABLE = "players" in your code.