表信息在编译插入时没有名为 Desc 的列

Posted

技术标签:

【中文标题】表信息在编译插入时没有名为 Desc 的列【英文标题】:table info has no column named Desc while compiling insert 【发布时间】:2019-02-27 05:06:42 【问题描述】:
package pdatabase.rakesh.phobia.pdatabase;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

class MyDatabase 

    public static final String DB_NAME = "Tasks.db";
    public static final int DB_VER = 2;
    public static final String DB_TABLE = "Info";
    public static final String C_TASK = "task";
    public static final String C_DESC = "desc";
    public static final String Q_CREATE = "CREATE TABLE "+ DB_TABLE + " (C_TASK TEXT, C_DESC TEXT)";
    Context context;
    SQLiteDatabase database;

    public MyDatabase(Context c) 
        context = c;
    

    public MyDatabase open() 
        DBHelper dbh = new DBHelper(context);
        database = dbh.getWritableDatabase();
        return this;
    

    public void write(String task, String desc) 
        ContentValues cv = new ContentValues();
        cv.put(C_TASK, task);
        cv.put(C_DESC, desc);
        database.insert( DB_TABLE,null, cv);
    

    public void close() 
        database.close();
    

    public String read() 
        String result = "";

        String[] colms = C_TASK,C_DESC;
        Cursor cur = database.query(DB_TABLE, colms,null,null,null,null,null);

        int iTask=cur.getColumnIndex(C_TASK);
        int iDesc=cur.getColumnIndex(C_DESC);

        for(cur.moveToFirst(); !cur.isAfterLast(); cur.moveToNext())
            result = result + cur.getString(iTask) + "\t" + cur.getString(iDesc) + "\n";
        
        return result;
    

    private class DBHelper extends SQLiteOpenHelper

        public DBHelper(Context context) 
            super(context, DB_NAME,null, DB_VER);
        

        @Override
        public void onCreate(SQLiteDatabase db) 
            db.execSQL(Q_CREATE);

        

        @Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) 

        
    

在上面的代码中,我既不能读也不能写 C_DESC。我收到了 android studio 中这篇文章主题中所写的错误。这是我负责所有数据库操作的数据库类。当且仅当存在 C_TASK 时,它才能读写。如果两者都存在,则无法正常工作。该应用程序的目的是保存任务和描述并查看它。

【问题讨论】:

desc 是 SQL 中的保留字,因此您的代码可能不起作用。您正在检查错误并不明显。您应该修复您的代码,以便捕获错误。 我在需要的地方将 desc 更改为 descr 仍然在行代码处出现错误:: database.insert(DB_TABLE,null, cv); 在 logcat 09-23 19:28:17.964 26075-26075/pdatabase.rakesh.phobia.pdatabase E/SQLiteLog: (1) 表信息没有名为descr 09-23 19:28的列: 17.976 26075-26075/pdatabase.rakesh.phobia.pdatabase E/SQLiteDatabase: Error inserting descr=hcch task=jvf android.database.sqlite.SQLiteException: table Info 没有名为 descr (code 1) 的列:,编译时:INSERT INTO信息(描述,任务)值(?,?) 【参考方案1】:

您已使用实际列名C_DESC 创建了一个表,而不是使用该变量的内容。注意,顺便说一句,desc 是 SQL 中的保留字,所以如果你绝对必须将它用作列名,你应该用双引号将它括起来 ("):

public static final String Q_CREATE = 
    "CREATE TABLE "+ DB_TABLE + " (" + 
    "\"" + C_TASK + "\" TEXT, " + 
    "\"" + C_DESC + "\" TEXT)";

【讨论】:

以上是关于表信息在编译插入时没有名为 Desc 的列的主要内容,如果未能解决你的问题,请参考以下文章

我想创建触发器来更新基于多个字符串过滤器的列中插入或更新的值

插入后使用 SQL Server 触发器更新另一个表中的列

SSIS 数据流 - 具有所需外键值的顺序插入

在存在的列上插入表

将数据插入表中的列

Oracle SQL:根据在另一个表中给定条件的列中找到的值插入