【问题标题】:Android Studio SQLite no column named TIMEAndroid Studio SQLite 没有名为 TIME 的列
【发布时间】:2021-04-02 12:09:41
【问题描述】:

我很困惑,我已经在DatabaseHelper.java 中添加了一个名为“TIME”的列,正如您在下面的代码中看到的那样,甚至还仔细检查了它。我同步了我的 gradle 文件,使缓存无效并重新启动,清理并重建项目,但在 Logcat 中仍然出现此错误:

Logcat 错误

android.database.sqlite.SQLiteException: 表 Student_table 没有 名为 TIME (code 1 SQLITE_ERROR[1]): 的列,编译时:INSERT INTO Student_table(SURNAME,ID,DATE,NAME,TIME) VALUES (?,?,?,?,?)

DatabaseHelper.java

package com.example.AppDraft2;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import java.text.SimpleDateFormat;
import java.util.Date;


public class DatabaseHelper extends SQLiteOpenHelper {

    private Context context;

    public static final String DATABASE_NAME="Student.db";
    public static final String TABLE_NAME="Student_table";
    public static final String COL_1="DATE";
    public static final String COL_2="TIME";
    public static final String COL_3="NAME";
    public static final String COL_4="SURNAME";
    public static final String COL_5="ID";

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

    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL("create table " + TABLE_NAME + "( DATE TEXT, TIME TEXT, NAME TEXT, SURNAME TEXT, ID INTEGER)");
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int i, int i1) {
        db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME);
    }
    public boolean insertData(String name,String surname,String id){
        // set the format to sql date time
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
        SimpleDateFormat timeFormat = new SimpleDateFormat("HH:mm:ss");
        Date date = new Date();
        Date time = new Date();

        SQLiteDatabase db = this.getWritableDatabase();
        ContentValues contentValues = new ContentValues();
        contentValues.put(COL_1, dateFormat.format(date));
        contentValues.put(COL_2, timeFormat.format(time));
        contentValues.put(COL_3, name);
        contentValues.put(COL_4, surname);
        contentValues.put(COL_5, id);
        long result = db.insert(TABLE_NAME, null, contentValues);
        if(result==-1){
            return false;
        }else{
            return true;
        }
    }
    public Cursor getAllData(){
        //get all data
        SQLiteDatabase db=this.getWritableDatabase();
        Cursor res = db.rawQuery("select*from " + TABLE_NAME, null);
        return res;

    }

    public Integer deleteData(){
        SQLiteDatabase db=this.getWritableDatabase();
        return db.delete(TABLE_NAME,null,null);
    }

}


【问题讨论】:

  • 你确定时间不是保留字吗?
  • 它没有显示任何错误,但让我试试嗯...
  • 不,时间不是保留字。尝试用不同的单词替换 time 并发生相同的错误
  • 您是否在首次运行应用后添加了 TIME 列?
  • 这不是我第一次运行这个应用程序,我之前已经修改过,之前也遇到过同样的问题,并通过先卸载应用程序然后运行它来修复它。但是现在,没有什么是绝对有效的:'(

标签: java android sqlite


【解决方案1】:

关于您的评论(在现已删除的答案中)

我已经尝试多次卸载并安装该应用,但仍然没有任何反应

我相信卸载应用程序然后重新运行应用程序是解决问题的方法(但是,也许很快就可以看看这个关于清单的答案的结尾)。那是在您运行应用程序的设备上进入设置列表应用程序并卸载应用程序。

但是,您似乎确信这不是解决方法。然后也许尝试修改 insertData 方法以在 SQLiteDatabase db = this.getWritableDatabase(); 行之后临时包含以下代码:-

    //<<<<<<<<<< ADDED FOR TESTING
    Cursor csr = db.query("sqlite_master",new String[]{"sql"},"name='" + TABLE_NAME + "'",null,null,null,null);
    DatabaseUtils.dumpCursor(csr);
    csr.close();
    //<<<<<<<<<<<
  • 这会提取用于创建表的 SQL(根据 TABLE_NAME)并将游标转储到日志中。

测试阶段 1

使用您的 DatabaseHelper 进行上述修改,但有目的地使用:-

db.execSQL("create table " + TABLE_NAME + "( DATE TEXT,  NAME TEXT, SURNAME TEXT, ID INTEGER)");
  • 没有时间栏

在活动中使用以下内容运行测试应用程序:-

    DatabaseHelper db2 = new DatabaseHelper(this);
    db2.insertData("Fred","Bloggs","FB001");

结果:-

2021-04-03 08:52:18.439 2388-2388/a.a.so66891171javaroomemojii I/System.out: >>>>> Dumping cursor android.database.sqlite.SQLiteCursor@bc1ea7c
2021-04-03 08:52:18.441 2388-2388/a.a.so66891171javaroomemojii I/System.out: 0 {
2021-04-03 08:52:18.441 2388-2388/a.a.so66891171javaroomemojii I/System.out:    sql=CREATE TABLE Student_table( DATE TEXT,  NAME TEXT, SURNAME TEXT, ID INTEGER)
2021-04-03 08:52:18.441 2388-2388/a.a.so66891171javaroomemojii I/System.out: }
2021-04-03 08:52:18.441 2388-2388/a.a.so66891171javaroomemojii I/System.out: <<<<<
2021-04-03 08:52:18.442 2388-2388/a.a.so66891171javaroomemojii E/SQLiteLog: (1) table Student_table has no column named TIME
2021-04-03 08:52:18.445 2388-2388/a.a.so66891171javaroomemojii E/SQLiteDatabase: Error inserting DATE=2021-04-03 TIME=08:52:18 SURNAME=Bloggs ID=FB001 NAME=Fred
    android.database.sqlite.SQLiteException: table Student_table has no column named TIME (code 1 SQLITE_ERROR): , while compiling: INSERT INTO Student_table(DATE,TIME,SURNAME,ID,NAME) VALUES (?,?,?,?,?)

即您可以清楚地看到消息/失败是正确的,没有 TIME 列。

测试阶段 2

只需更改 DatabaseHelper 以使用:-

db.execSQL("create table " + TABLE_NAME + "( DATE TEXT, TIME TEXT, NAME TEXT, SURNAME TEXT, ID INTEGER)");

并重新运行不卸载应用程序会导致:-

2021-04-03 08:56:00.155 2621-2621/a.a.so66891171javaroomemojii I/System.out: >>>>> Dumping cursor android.database.sqlite.SQLiteCursor@bc1ea7c
2021-04-03 08:56:00.155 2621-2621/a.a.so66891171javaroomemojii I/System.out: 0 {
2021-04-03 08:56:00.156 2621-2621/a.a.so66891171javaroomemojii I/System.out:    sql=CREATE TABLE Student_table( DATE TEXT,  NAME TEXT, SURNAME TEXT, ID INTEGER)
2021-04-03 08:56:00.156 2621-2621/a.a.so66891171javaroomemojii I/System.out: }
2021-04-03 08:56:00.156 2621-2621/a.a.so66891171javaroomemojii I/System.out: <<<<<
2021-04-03 08:56:00.156 2621-2621/a.a.so66891171javaroomemojii E/SQLiteLog: (1) table Student_table has no column named TIME
2021-04-03 08:56:00.160 2621-2621/a.a.so66891171javaroomemojii E/SQLiteDatabase: Error inserting DATE=2021-04-03 TIME=08:56:00 SURNAME=Bloggs ID=FB001 NAME=Fred
    android.database.sqlite.SQLiteException: table Student_table has no column named TIME (code 1 SQLITE_ERROR): , while compiling: INSERT INTO Student_table(DATE,TIME,SURNAME,ID,NAME) VALUES (?,?,?,?,?)
  • 即相同的错误但不同的时间。

测试阶段 3

无需进行任何更改,只需卸载应用程序:-

2021-04-03 08:58:28.436 2949-2949/a.a.so66891171javaroomemojii I/System.out: >>>>> Dumping cursor android.database.sqlite.SQLiteCursor@bc1ea7c
2021-04-03 08:58:28.437 2949-2949/a.a.so66891171javaroomemojii I/System.out: 0 {
2021-04-03 08:58:28.438 2949-2949/a.a.so66891171javaroomemojii I/System.out:    sql=CREATE TABLE Student_table( DATE TEXT, TIME TEXT, NAME TEXT, SURNAME TEXT, ID INTEGER)
2021-04-03 08:58:28.438 2949-2949/a.a.so66891171javaroomemojii I/System.out: }
2021-04-03 08:58:28.438 2949-2949/a.a.so66891171javaroomemojii I/System.out: <<<<<
2021-04-03 08:58:28.453 2949-2949/a.a.so66891171javaroomemojii D/OpenGLRenderer: Skia GL Pipeline
  • 即也不例外,TIME现在存在

清单 (AndroidManifest.xml) 如果您按照上述操作但仍有问题,那么在某些情况下,可能是数据正在恢复,在这种情况下,请卸载应用程序,然后尝试将 Manifest 更改为具有:-

android:allowBackup="false"
  • 而不是android:allowBackup="true"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多