如何向android sql添加列?

如何向android sql添加列?,android,android-sqlite,Android,Android Sqlite,我尝试将三列添加到包含8列的exist数据库中 我已经找到了一些解决方案,可以在onUpgradeoverride方法中键入代码,并尝试将列添加到我的exist数据库中。不幸的是,我得到了如下错误java.lang.IllegalStateException:无法从CursorWindow读取第0行第8列。在从光标访问数据之前,确保光标已正确初始化。 这是我关于onCreat和onUpgrade的代码: public class DatabaseHandler extends SQLiteOpe

我尝试将三列添加到包含8列的exist数据库中

我已经找到了一些解决方案,可以在
onUpgrade
override方法中键入代码,并尝试将列添加到我的exist数据库中。不幸的是,我得到了如下错误
java.lang.IllegalStateException:无法从CursorWindow读取第0行第8列。在从光标访问数据之前,确保光标已正确初始化。

这是我关于
onCreat
onUpgrade
的代码:

public class DatabaseHandler extends SQLiteOpenHelper {

    private String TAG = DatabaseHandler.class.getCanonicalName();
    // All Static variables
    // Database Version
    private static final int DATABASE_VERSION = 1;

    // Database Name
    private static final String DATABASE_NAME = "contactsManager";

    // Contacts table name
    private static final String TABLE_CONTACTS = "contacts";

    // Contacts Table Columns names
    private static final String KEY_ID = "id";
    private static final String KEY_DATE = "date";
    private static final String KEY_BMORNING = "bMorning";
    private static final String KEY_AMORNING = "aMorning";
    private static final String KEY_BNOON = "bNoon";
    private static final String KEY_ANOON = "aNoon";
    private static final String KEY_BNIGHT = "bNight";
    private static final String KEY_ANIGHT = "aNight";
    private static final String KEY_BEXERCISE = "bExercise";
    private static final String KEY_AEXERCISE = "aExercise";
    private static final String KEY_COMMENT = "comment";

    String date, value;


    public DatabaseHandler(Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
    }

    //Creating Tables
    @Override
    public void onCreate(SQLiteDatabase db) {
        System.out.println("table is here");
        String CREATE_CONTACTS_TABLE = "CREATE TABLE " + TABLE_CONTACTS + "("
                + KEY_ID + " INTEGER PRIMARY KEY," + KEY_DATE + " TEXT,"
                + KEY_BMORNING + " TEXT," + KEY_AMORNING + " TEXT,"
                + KEY_BNOON + " TEXT," + KEY_ANOON + " TEXT,"
                + KEY_BNIGHT + " TEXT," + KEY_ANIGHT + " TEXT" +
                ")";
        db.execSQL(CREATE_CONTACTS_TABLE);

    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        //Drop order table if existed
        db.execSQL("DROP TABLE IF EXISTS " + TABLE_CONTACTS);

        Log.d(TAG, "DB Version =>" + db.getVersion()); // Can't see it on logcat
        if (oldVersion < 2) {
            db.execSQL("ALTER TABLE " + TABLE_CONTACTS + " ADD COLUMN " + KEY_BEXERCISE + " TEXT;");
            db.execSQL("ALTER TABLE " + TABLE_CONTACTS + " ADD COLUMN " + KEY_AEXERCISE + " TEXT;");
            db.execSQL("ALTER TABLE " + TABLE_CONTACTS + " ADD COLUMN " + KEY_COMMENT + " TEXT;");
        } if (oldVersion < 3) {
            //do nothing temporarily
        }
        //Create table again
        onCreate(db);
    }
}
公共类DatabaseHandler扩展了SQLiteOpenHelper{
私有字符串标记=DatabaseHandler.class.getCanonicalName();
//所有静态变量
//数据库版本
私有静态最终int数据库_VERSION=1;
//数据库名称
私有静态最终字符串数据库\u NAME=“contactsManager”;
//联系人表名称
专用静态最终字符串表\u CONTACTS=“CONTACTS”;
//联系人表列名称
私有静态最终字符串密钥\u ID=“ID”;
私有静态最终字符串键\u DATE=“DATE”;
私有静态最终字符串键\u BMORNING=“BMORNING”;
私有静态最终字符串键\u AMORNING=“AMORNING”;
私有静态最终字符串键\u BNOON=“BNOON”;
私有静态最终字符串键\u ANOON=“ANOON”;
私有静态最终字符串密钥\u BNIGHT=“BNIGHT”;
私有静态最终字符串键\u ANIGHT=“ANIGHT”;
私有静态最终字符串键\u BEXERCISE=“BEXERCISE”;
私有静态最终字符串键\u AEXERCISE=“AEXERCISE”;
私有静态最终字符串键\u COMMENT=“COMMENT”;
字符串日期、值;
公共数据库处理程序(上下文){
super(上下文、数据库名称、null、数据库版本);
}
//创建表
@凌驾
public void onCreate(SQLiteDatabase db){
System.out.println(“表在这里”);
字符串CREATE_CONTACTS_TABLE=“CREATE TABLE”+TABLE_CONTACTS+”(“
+键ID+“整数主键”+“键日期+”文本
+按键+装饰+文字,“+按键+装饰+文字,”
+按键按钮+“文本,”+按键按钮+“文本,”
+按键右键+文本,“+按键右键+文本”+
")";
execSQL(创建联系人表);
}
@凌驾
public void onUpgrade(SQLiteDatabase db,int-oldVersion,int-newVersion){
//删除订单表(如果存在)
db.execSQL(“如果存在删除表”+表_联系人);
Log.d(标记“DB Version=>”+DB.getVersion());//在logcat上看不到它
如果(旧版本<2){
db.execSQL(“ALTER TABLE”+TABLE_CONTACTS+“ADD COLUMN”+KEY_BEXERCISE+“TEXT;”);
db.execSQL(“ALTER TABLE”+TABLE_CONTACTS+“ADD COLUMN”+KEY_AEXERCISE+“TEXT;”);
db.execSQL(“ALTER TABLE”+TABLE_CONTACTS+“ADD COLUMN”+KEY_COMMENT+“TEXT;”);
}如果(旧版本<3){
//暂时什么也不做
}
//再次创建表
onCreate(db);
}
}
以下是我关于启动数据库代码的主要活动:

DatabaseHandler db = new DatabaseHandler(getActivity());
Log.d("Insert: ", "Inserting...");
Log.d("Reading: ", "Reading all contact...");
List<Contact> contacts = db.getAllContacts(); // this code cause the error happen
DatabaseHandler db=newdatabasehandler(getActivity());
Log.d(“插入:”,“插入…”);
日志d(“读取:”,“读取所有联系人…”);
列出联系人=db.getAllContacts();//此代码导致错误发生
我想可能是因为override方法
onUpgrade
没有触发器,因为我看不到我的日志数据库版本

我真的搞不懂


任何帮助都将不胜感激。提前感谢。

将数据库版本增加1,然后再次运行