-1

我正在尝试使用 SQLite 在 android 中创建一个表,但出现错误“没有这样的列”。我检查了一切都是正确的,请帮助我解决这个问题。谢谢

创建表的代码是:

public static final String DATABASE_NAME="Employee.db";
public static final int DATABASE_VERSION=1;
public static final String TABLE_EMPLOYEE="Employee";
public static final String COLUMN_ID="Empid";
public static final String COLUMN_NAME="Empname";
public static final  String COLUMN_SALARY="Empsalary";
public static final String createReq="CREATE TABLE " + TABLE_EMPLOYEE + "("
        + COLUMN_ID + " INTEGER PRIMARY KEY," + COLUMN_NAME + " TEXT,"
        + COLUMN_SALARY + " NUMERIC" + ")";

public dbhelper(Context context)
{   
    super(context,DATABASE_NAME,null,DATABASE_VERSION);
      Log.e("dbhelper constructor: ", "dbhelper const called..");
}
@Override
public void onCreate(SQLiteDatabase db) 
{
     Log.e("onCreate method of dbhelper: ", "onCreate method of dbhelper method called..");
    db.execSQL(createReq);
}

当我在 logcat 中打印表的列名时,它显示 col: Empid Col: EmpnameTEXTEmpsalaryNUMERIC

4

2 回答 2

0

我想你错过了这里的空间:

试试下面的代码,让我知道:

public static final String createReq = "CREATE TABLE " + TABLE_EMPLOYEE + "("
        + COLUMN_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " + COLUMN_NAME + " TEXT NOT NULL, "
        + COLUMN_SALARY + " NUMERIC " + ")";
于 2013-06-10T06:21:23.690 回答
0

编辑

当说明onCreate每次创建SQLiteOpenHelperdbhelper在这种情况下)时调用该方法时,我的原始答案是错误的。根据文档,它仅在创建数据库时被调用(感谢@KumarBibek,让我注意到这一点)。这也意味着我的回答几乎没有用,至少在报告的问题上。我仍然选择让它活着,部分是为了提醒我草率的错误:-)但也因为它(根据我)对任何未来的读者都有一些其他有用的旁注。

起源

onCreate无论您当前的问题是什么,如果您尝试在该方法中创建表,我认为您也会遇到其他问题。除非您以某种方式删除您的表(在相应的onDestroy或其他地方),否则您将尝试在CREATE TABLE...每次dbhelper平台“创建”类时对已经存在的表执行查询。您当前的问题实际上甚至可能是因为这个(即使我发现它有点不太可能,由于所述的错误消息)。

在(我假设您正在扩展)中有一个onUpgradeandonDowngrade方法,该方法将是创建表的更合适的位置,但同样:您需要在之前删除它或只执行 create 语句第一个版本(在方法参数上添加一个 if 检查)。或者,您可以添加一个转义序列,以便您的 create 语句看起来像.SQLiteOpenHelperonUpgradenewVersionIF NOT EXISTSCREATE TABLE IF NOT EXISTS Employee...

如果您创建内存数据库,这不是问题(但是您的数据库文件名将以冒号开头,例如“:Employee.db”)。但是请注意,一旦您的内存数据库被释放,您的所有数据都会被删除。

另一个提示:您实际上可以在在线 SQL 语法验证器中测试您的 SQL 语法(此处提供了一个示例,请确保您在工具栏中选择了正确的 SQL 引擎“SQLite”)。这些工具将验证您的SQL 语法。但是,它们不能验证逻辑有效性(即由于滥用 Android 生命周期而导致的错误)。

另一个旁注是,按照不成文的老式 Java 标准,类名应该以大写字母开头。因此,您的dbhelper类(以及您的构造函数)实际上应该阅读Dbhelper甚至更好DbHelper

于 2013-06-10T06:21:47.650 回答