android坚持我的数据库表中没有列

时间:2014-03-10 03:27:37

标签: android sqlite sqliteopenhelper

当我尝试将值插入数据库时​​,我无法弄清楚这个奇怪的错误

ERROR

01-01 15:48:56.065  10056-10056/com.autophone E/SQLiteLog﹕ (1) table mainTable has no column named status_date
01-01 15:48:56.100  10056-10056/com.autophone E/SQLiteDatabase﹕ Error inserting status_date=1 בינו 2000 15:48:56 problem=non model=N9005 phone_number=123 in_date=1 בינו 2000 15:48:56 status=received name=ian
    android.database.sqlite.SQLiteException: table mainTable has no column named status_date (code 1): , while compiling: INSERT INTO mainTable(status_date,problem,model,phone_number,in_date,status,name) VALUES (?,?,?,?,?,?,?)

它的主要观点是我在主表中没有“status_date” 但是怎么可能呢?

  public static final String KEY_ROWID = "_id";
    public static final int COL_ROWID = 0;

    private static final String KEY_NAME = "name";//1
    private static final String KEY_MODEL = "model";//2
    private static final String KEY_PHONE_NUMBER = "phone_number";//3
    private static final String KEY_PROBLEM = "problem";//4
    private static final String KEY_STATUS = "status";//5
    private static final String KEY_IN_DATE = "in_date";//6
    private static final String KEY_STATUS_DATE = "status_date";//7

    public static final String DATABASE_NAME = "MyDb";
    public static final String DATABASE_TABLE = "mainTable";
    public static final int DATABASE_VERSION = 1;

    private static final String DATABASE_CREATE_SQL =
            "create table " + DATABASE_TABLE
                    + " (" + KEY_ROWID + " integer primary key autoincrement, "
                    + KEY_NAME + " text not null, "
                    + KEY_MODEL + " text not null, "
                    + KEY_PHONE_NUMBER + " text not null, "
                    + KEY_PROBLEM + "text not null, "
                    + KEY_STATUS + "text not null, "
                    + KEY_IN_DATE + "text not null, "
                    + KEY_STATUS_DATE + "text not null "
                    +");";

这里是......

这是输入部分

 long newID=myDB.insertRow(new LogEntery("ian","N9005","123","non"));

logentery是我使用的类,它还为数据添加了其余的

public LogEntery(String name,String model,String phone_number,String problem)
    {
        super();
        this.name=name;
        this.model=model;
        this.phone_number=phone_number;
        this.problem=problem;
        this.in_date = DateFormat.getDateTimeInstance().format(new Date());
        this.status_date = DateFormat.getDateTimeInstance().format(new Date());
        this.status = "received";
    }
顺便说一下......我如何更改getDateTimeInstance以获取DD / MM / YYYY而不是完整的数据/时间?

3 个答案:

答案 0 :(得分:3)

常见的错误来源是数据库版本。

如果您在桌面中没有KEY_STATUS_DATE字段的情况下至少运行了一次应用,然后添加了该字段并运行了应用,则表格将不会更新(onUpgrade()将不会被调用),因为系统认为数据库没有改变。

尝试提升版本。

public static final int DATABASE_VERSION = 2; 

有了这个,系统就会想到“哦,有一个新版本的数据库,让我们调用onUpgrade()”。理想情况下,通过此方法,您可以手动删除表onCreate(SQLiteDatabase db),或执行一些DDL语句以添加缺少的字段。

答案 1 :(得分:1)

您可以检查手机中的数据库,看看是否真的没有名为status_date的列。

解决你的“顺便说一句”:

SimpleDateFormat dateFormatGmt = new SimpleDateFormat(“dd / MM / yyyy”); String dateString = dateFormatGmt.format(new Date());

答案 2 :(得分:0)

我的建议是从一个有效的基本模式开始,然后编写你的抽象层。我退后一步,确保所有假设都是正确的。

例如,构造函数有4个参数,而表中有8列,构造函数中有7个setter。看起来你可能只是一个接一个,一目了然。如果没有,它仍然有点混乱。我要么在构造函数中要求语句的所有参数,要么以某种方式标记可选字段(即使用no-args构造函数重载方法调用等)。

希望我的意见有用。

布兰登