SQLite数据库,列不存在

时间:2015-02-01 20:02:17

标签: android database sqlite

我正在尝试创建此数据库,然后从中检索值,但我无法弄清楚语法。我整个周末一直在搜索谷歌,我疯了。请帮助我理解为什么这不起作用。这是SQLiteHelper:

public class DBHelper extends SQLiteOpenHelper {

public static final String DATABASE_NAME = "DBName.db";
public static final String RESULTS_TABLE_NAME = "results";
public static final String RESULTS_COLUMN_ID = "id";
private static final String KEY_WEATHER = "weather";
private static final String KEY_WEEKEND = "weekend";
private static final String KEY_HOBBIES = "hobbies";
private static final String KEY_MUSIC = "music";
private static final String KEY_FAMILY = "family";

private static final String[] columnArray = {KEY_WEATHER, KEY_WEEKEND, KEY_HOBBIES, KEY_MUSIC, KEY_FAMILY};

private HashMap hp;

public DBHelper(Context context){
    super(context, DATABASE_NAME, null, 1);

}
@Override
public void onCreate(SQLiteDatabase db) {
    Log.d("create db", "created database");
    db.execSQL("CREATE TABLE results "+
    "(id INTEGER PRIMARY KEY AUTOINCREMENT, " +
    "weather0 INTEGER, weather1 INTEGER, weather2 INTEGER, weather3 INTEGER, weather4 INTEGER, " +
    "weekend0 INTEGER, weekend1 INTEGER, weekend2 INTEGER, weekend3 INTEGER, weekend4 INTEGER, " +
    "hobbies0 INTEGER, hobbies1 INTEGER, hobbies2 INTEGER, hobbies3 INTEGER, hobbies4 INTEGER, " +
    "music0 INTEGER, music1 INTEGER, music2 INTEGER, music3 INTEGER, music4 INTEGER, " +
    "family0 INTEGER, family1 INTEGER, family2 INTEGER, family3 INTEGER, family4 INTEGER );");
}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    db.execSQL("DROP TABLES IF EXISTS results");
    this.onCreate(db);
}

public boolean insertResult (String[] topics){

    //String topicUnitId = column+unitId;
    SQLiteDatabase db = this.getWritableDatabase();
    ContentValues values = new ContentValues();
    /*for(int topicLoop = 0; topicLoop < topics.length; topicLoop++){
        for(int unitLoop = 0; unitLoop < 5; unitLoop++){
            contentValues.put(topics[topicLoop].toLowerCase(), -1);
            Log.d("CREATING TABLE", topics[topicLoop]+unitLoop);
        }
    }*/
    values.put("weather0", -1);
    values.put("weather1", -1);
    values.put("weather2", -1);
    values.put("weather3", -1);
    values.put("weather4", -1);
    db.insert(RESULTS_TABLE_NAME, null, values);
    db.close();
    return true;
}

public ArrayList getAllResults(int i){

    String arrayId = columnArray[i];
    ArrayList arrayList = new ArrayList();
    SQLiteDatabase db = this.getReadableDatabase();
    for(int n = 0; n <= 4; n++) {
        Cursor res = db.rawQuery("SELECT * FROM results WHERE " + arrayId + n +" IS NOT NULL;", null);
        res.moveToFirst();
        while (res.isAfterLast() == false) {
            arrayList.add(res.getString(res.getColumnIndex(arrayId+n)));
            res.moveToNext();
        }
    res.close();
    }

    db.close();
    return arrayList;
}
}

我收到此错误:

android.database.sqlite.SQLiteException: no such column: weather0 (code 1): , while compiling: SELECT * FROM results WHERE weather0 IS NOT NULL;

当我尝试从我的应用程序中的另一个活动运行“getAllResults()”时。

感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

您可能会看到此错误,因为您已使用一个架构创建了数据库,然后修改了架构并再次运行该应用程序。初始数据库文件将保留在设备上,除非您增加数据库版本号,否则不会使用新架构重新创建。

数据库版本号在SQLiteOpenHelper构造函数的调用中设置。

super(context, DATABASE_NAME, null, 1);

或者,您可以从模拟器中卸载应用程序或选择其他数据库文件名,并在下次执行时重新创建数据库。

答案 1 :(得分:0)

可能您已经创建了数据库,然后尝试更改它。

解决方案: 从设备中删除您的应用程序或在以下位置将数据库版本从1更改为其他:

super(context, DATABASE_NAME, null, DATABASE_VERSION);