【问题标题】:Android SQLite CREATE TABLE not working [duplicate]Android SQLite CREATE TABLE 不工作 [重复]
【发布时间】:2018-01-18 22:58:59
【问题描述】:

CREATE TABLE 没有创建表

从这里我取表名

private static  String getTableName() {
    Calendar calendar = Calendar.getInstance();
    calendar.setTimeZone(TimeZone.getTimeZone("Asia/Calcutta"));
    SimpleDateFormat df = new SimpleDateFormat("yyyyMMdd");
    String date = df.format(calendar.getTime());
    return date;
}


//table name
private String TABLE_DATE = getTableName();

这是创建表的代码

@Override
public void onCreate(SQLiteDatabase db) {
    String CREATE_ENTRY_TABLE = "CREATE TABLE " +TABLE_DATE + "("
            + KEY_ID + " INTEGER PRIMARY KEY," + KEY_ROLL + " TEXT,"
            + KEY_DATE + " TEXT," +  KEY_TIME + " TEXT" + ")";
    db.execSQL(CREATE_ENTRY_TABLE);
}

错误

java.lang.RuntimeException: Unable to start activity ComponentInfo{com.jagdishchoudhary.iitgandhinagarmesssystem/com.jagdishchoudhary.iitgandhinagarmesssystem.MainActivity}: android.database.sqlite.SQLiteException: near "20180119": syntax error (code 1): , while compiling: CREATE TABLE  20180119(id INTEGER PRIMARY KEY,Roll TEXT,Date TEXT,Time TEXT)
                                               at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2659)
                                               at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2724)
                                               at android.app.ActivityThread.-wrap12(ActivityThread.java)
                                               at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1473)
                                               at android.os.Handler.dispatchMessage(Handler.java:102)
                                               at android.os.Looper.loop(Looper.java:154)
                                               at android.app.ActivityThread.main(ActivityThread.java:6123)
                                               at java.lang.reflect.Method.invoke(Native Method)
                                               at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:867)
                                               at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:757)
                                            Caused by: android.database.sqlite.SQLiteException: near "20180119": syntax error (code 1): , while compiling: CREATE TABLE  20180119(id INTEGER PRIMARY KEY,Roll TEXT,Date TEXT,Time TEXT)

请查看日志。

【问题讨论】:

  • 为什么要在你的应用程序中创建它?准备好后将数据库与您的应用一起部署。

标签: android database sqlite


【解决方案1】:

我几乎 100% 确定 20180119 是一个无效的表名,这似乎是错误日志所指的内容。

在您返回的表名的开头添加一个下划线,我想您会发现它的工作方式与您预期的一样。

例如:

private String TABLE_DATE = "_"+getTableName();

这不应该是必需的,但如果由于某些奇怪的原因这不起作用,请尝试在下划线后面附加一个字母,如下所示:

private String TABLE_DATE = "_T"+getTableName();

【讨论】:

  • 以数字开头的全数字名称或表格、列名称等是可能的/可用的。但是,它们必须包含在特殊字符中,以便名称被强制/强制成为标识符。有效字符为 " "(双引号)重音符号(ASCII 码 96) 和 [ ]。例如::-CREATE TABLE IF NOT EXISTS "2017" ("1234567890abc" INTEGER PRIMARY KEY, [1aaaaa] TEXT)(注意重音符号用于显示代码,因此无法显示)。 SQL As Understood By SQLite - SQLite Keywords注意!重音不是标准 SQL。
  • 我记得不久前读过关于将名称包装在 [] 中作为数字表名称的解决方案,因此这很可能也是一个有效的解决方案。感谢您的评论@MikeT,最初回答时我并没有想到这一点。
【解决方案2】:

尝试使用带有日期的trim() 函数。

在 CREATE_ENTRY_TABLE 变量中使用:

String CREATE_ENTRY_TABLE = "CREATE TABLE '" + TABLE_DATE + "' (...);";

注意表名前后的单引号。

【讨论】:

    猜你喜欢
    • 2018-10-05
    • 1970-01-01
    • 2013-04-22
    • 2016-09-16
    • 2011-08-20
    • 2015-05-16
    • 2013-12-30
    • 2016-11-04
    • 2016-03-07
    相关资源
    最近更新 更多