Android 无法从游标窗口读取第0行第4列,该窗口有1行和4列

Android 无法从游标窗口读取第0行第4列,该窗口有1行和4列,android,database,sqlite,Android,Database,Sqlite,我正在尝试创建一个SQLite数据库,在列表中添加“profileWeight”之前,一切似乎都正常。我试着调查其他样品,但都与我的不同。有人能帮我吗。my DBController.java的代码如下: public class DBController extends SQLiteOpenHelper { private static final String LOGCAT = null; public DBController(Context applicationcontext) {

我正在尝试创建一个SQLite数据库,在列表中添加“profileWeight”之前,一切似乎都正常。我试着调查其他样品,但都与我的不同。有人能帮我吗。my DBController.java的代码如下:

public class DBController extends SQLiteOpenHelper {
private static final String LOGCAT = null;

public DBController(Context applicationcontext) {
    super(applicationcontext, "profiledatabase.db", null, 1);
    Log.d(LOGCAT, "Created");
}

@Override
public void onCreate(SQLiteDatabase database) {
    String query = "CREATE TABLE profiles ( profileId INTEGER PRIMARY KEY, profileName TEXT, "
            + "profileDOB DATE, profileSex TEXT, profileWeight TEXT)";
    database.execSQL(query);
    Log.d(LOGCAT, "profiles Created");
}

@Override
public void onUpgrade(SQLiteDatabase database, int version_old,
        int current_version) {
    String query;
    query = "DROP TABLE IF EXISTS profiles";
    database.execSQL(query);
    onCreate(database);
}

public void insertProfile(HashMap<String, String> queryValues) {
    SQLiteDatabase database = this.getWritableDatabase();
    ContentValues values = new ContentValues();
    values.put("profileName", queryValues.get("profileName"));
    values.put("profileDOB", queryValues.get("profileDOB"));
    values.put("profileSex", queryValues.get("profileSex"));
    values.put("profileWeight", queryValues.get("profileWeight"));

    database.insert("profiles", null, values);
    database.close();
}

public int updateProfile(HashMap<String, String> queryValues) {
    SQLiteDatabase database = this.getWritableDatabase();
    ContentValues values = new ContentValues();
    values.put("profileName", queryValues.get("profileName"));
    values.put("profileDOB", queryValues.get("profileDOB"));
    values.put("profileSex", queryValues.get("profileSex"));    
    values.put("profileWeight", queryValues.get("profileWeight"));      

    return database.update("profiles", values, "profileId" + " = ?",
            new String[] { queryValues.get("profileId")});
    // String updateQuery =
    // "Update  words set txtWord='"+word+"' where txtWord='"+ oldWord +"'";
    // Log.d(LOGCAT,updateQuery);
    // database.rawQuery(updateQuery, null);
    // return database.update("words", values, "txtWord  = ?", new String[]
    // { word });
}

public void deleteProfile(String id) {
    Log.d(LOGCAT, "delete");
    SQLiteDatabase database = this.getWritableDatabase();
    String deleteQuery = "DELETE FROM profiles where profileId='" + id
            + "'";
    Log.d("query", deleteQuery);
    database.execSQL(deleteQuery);
}

public ArrayList<HashMap<String, String>> getAllProfiles() {
    ArrayList<HashMap<String, String>> wordList = new ArrayList<HashMap<String, String>>();
    String selectQuery = "SELECT  * FROM profiles";
    SQLiteDatabase database = this.getWritableDatabase();
    Cursor cursor = database.rawQuery(selectQuery, null);
    if (cursor.moveToFirst()) {
        do {

            HashMap<String, String> profileMap = new HashMap<String, String>();
            profileMap.put("profileId", cursor.getString(0));
            profileMap.put("profileName", cursor.getString(1));
            profileMap.put("profileDOB", cursor.getString(2));
            profileMap.put("profileSex", cursor.getString(3));
            profileMap.put("profileWeight", cursor.getString(4));

            wordList.add(profileMap);

        } while (cursor.moveToNext());
    }

    // return contact list
    return wordList;
}

public HashMap<String, String> getProfileInfo(String id) {
    HashMap<String, String> wordList = new HashMap<String, String>();
    SQLiteDatabase database = this.getReadableDatabase();
    String selectQuery = "SELECT * FROM profiles where profileId='" + id
            + "'";
    Cursor cursor = database.rawQuery(selectQuery, null);
    if (cursor.moveToFirst()) {
        do {
            // HashMap<String, String> map = new HashMap<String, String>();
            wordList.put("profileId", cursor.getString(0));             
            wordList.put("profileName", cursor.getString(1));
            wordList.put("profileDOB", cursor.getString(2));
            wordList.put("profileSex", cursor.getString(3));    
            wordList.put("profileWeight", cursor.getString(4));                 

            // wordList.add(map);
        } while (cursor.moveToNext());
    }
    return wordList;
}
}
public类DBController扩展SQLiteOpenHelper{
私有静态最终字符串LOGCAT=null;
公共数据库控制器(上下文应用程序上下文){
super(applicationcontext,“profiledatabase.db”,null,1);
Log.d(LOGCAT,“创建”);
}
@凌驾
public void onCreate(SQLiteDatabase){
String query=“创建表配置文件(profileId整型主键,profileName文本,”
+“profileDOB日期、profileSex文本、profileWeight文本”;
execSQL(查询);
Log.d(LOGCAT,“创建的配置文件”);
}
@凌驾
public void onUpgrade(SQLiteDatabase数据库,int version_old,
int(当前版本){
字符串查询;
query=“如果存在配置文件,则删除表”;
execSQL(查询);
onCreate(数据库);
}
公共void insertProfile(HashMap查询值){
SQLiteDatabase=this.getWritableDatabase();
ContentValues=新的ContentValues();
value.put(“profileName”,queryvalue.get(“profileName”);
value.put(“profileDOB”,queryvalue.get(“profileDOB”);
value.put(“profileSex”),queryvalue.get(“profileSex”);
value.put(“profileWeight”,queryvalue.get(“profileWeight”);
数据库。插入(“配置文件”,空,值);
close()数据库;
}
public int updateProfile(HashMap查询值){
SQLiteDatabase=this.getWritableDatabase();
ContentValues=新的ContentValues();
value.put(“profileName”,queryvalue.get(“profileName”);
value.put(“profileDOB”,queryvalue.get(“profileDOB”);
value.put(“profileSex”),queryvalue.get(“profileSex”);
value.put(“profileWeight”,queryvalue.get(“profileWeight”);
返回database.update(“profiles”,值,“profileId”+“=?”,
新字符串[]{queryValues.get(“profileId”)});
//字符串更新=
//“更新单词集txtWord='”+word+”,其中txtWord='“+oldWord+”;
//Log.d(LOGCAT,updateQuery);
//rawQuery(updateQuery,null);
//返回database.update(“words”,值,“txtWord=?”,新字符串[]
//{word});
}
公共无效删除配置文件(字符串id){
Log.d(LOGCAT,“删除”);
SQLiteDatabase=this.getWritableDatabase();
String deleteQuery=“从profileId=”的配置文件中删除”+id
+ "'";
Log.d(“查询”,deleteQuery);
execSQL(deleteQuery);
}
公共ArrayList getAllProfiles(){
ArrayList wordList=新建ArrayList();
String selectQuery=“从配置文件中选择*”;
SQLiteDatabase=this.getWritableDatabase();
Cursor=database.rawQuery(selectQuery,null);
if(cursor.moveToFirst()){
做{
HashMap profileMap=新的HashMap();
profileMap.put(“profileId”,cursor.getString(0));
profileMap.put(“profileName”,cursor.getString(1));
profileMap.put(“profileDOB”,cursor.getString(2));
profileMap.put(“profileSex”,cursor.getString(3));
profileMap.put(“profileWeight”,cursor.getString(4));
添加(profileMap);
}while(cursor.moveToNext());
}
//返回联系人列表
返回词表;
}
公共HashMap getProfileInfo(字符串id){
HashMap wordList=新建HashMap();
SQLiteDatabase=this.getReadableDatabase();
String selectQuery=“从profileId=”的配置文件中选择*”+id
+ "'";
Cursor=database.rawQuery(selectQuery,null);
if(cursor.moveToFirst()){
做{
//HashMap=newHashMap();
put(“profileId”,cursor.getString(0));
put(“profileName”,cursor.getString(1));
put(“profileDOB”,cursor.getString(2));
put(“profileSex”,cursor.getString(3));
put(“profileWeight”,cursor.getString(4));
//添加(地图);
}while(cursor.moveToNext());
}
返回词表;
}
}

我怀疑profileWeight不在数据库中。
您需要增加数据库的版本,以便调用
onUpgrade
onCreate
方法,并使用profileWeight字段重新创建数据库

此行中指定了版本

super(applicationcontext, "profiledatabase.db", null, 1);

尝试将1更改为2。

列索引从0开始。您正在从只有4列的游标请求索引4(第5个元素)。这就是例外情况的解释

为什么
SELECT*
从一个5列表中只返回4列:您最近添加了另一列,您需要确保数据库文件反映了此更改。一些选择:

  • 删除旧的数据库文件:例如,卸载应用程序。这可以确保再次运行数据库帮助程序
    onCreate()
    ,从头开始创建新数据库

  • 增加传递给
    SQLiteOpenHelper
    super
    构造函数的数据库版本
    1
    。由于磁盘上的文件是版本1,请求更大的版本将调用
    onUpgrade()
    回调,您可以使用新列更新数据库文件


当有人这样做时,事情就是这样结束的:cursor.getString(4)是的!这真的很有帮助……谢谢……)