SQL没有这样的列错误,当它确实存在 [英] SQL no such column error when it does exist

查看:255
本文介绍了SQL没有这样的列错误,当它确实存在的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

当我查询我的数据库我不断收到一个错误说的SQLException:没有这样的列,我不明白为什么当我的查询看起来只有精细

 光标nameCursor = context.getContentResolver()查询(StatusList.STATUS_URI,新的String [] {StatusList.STATUS_NAME,StatusList.STATUS_PERMISSIONS,StatusList.STATUS_ECM2ID}
                ,StatusList.STATUS_TYPE += 1+和+ StatusList.STATUS_NAME +=+ incidentCursor.getString(0),NULL,NULL);

下面是完整的错误

  15 08-01:39:59.104:W / System.err的(8623):android.database.sqlite.SQLiteException:没有这样的列:SIS(code 1) :,在编译:SELECT姓名,权限,ecm2id从状态WHERE(类型= 1 AND名字= SIS)
08-01 15:39:59.112:W / System.err的(8623):在android.database.sqlite.SQLiteConnection.native prepareStatement(本机方法)
08-01 15:39:59.112:W / System.err的(8623):在android.database.sqlite.SQLiteConnection.acquire preparedStatement(SQLiteConnection.java:882)
08-01 15:39:59.120:W / System.err的(8623):在android.database.sqlite.SQLiteConnection prepare(SQLiteConnection.java:493)
08-01 15:39:59.120:W / System.err的(8623):在android.database.sqlite.SQLiteSession prepare(SQLiteSession.java:588)
08-01 15:39:59.120:W / System.err的(8623):在android.database.sqlite.SQLiteProgram<&初始化GT;(SQLiteProgram.java:58)
08-01 15:39:59.120:W / System.err的(8623):在android.database.sqlite.SQLiteQuery<&初始化GT;(SQLiteQuery.java:37)
08-01 15:39:59.120:W / System.err的(8623):在android.database.sqlite.SQLiteDirectCursorDriver.query(SQLiteDirectCursorDriver.java:44)
08-01 15:39:59.120:W / System.err的(8623):在android.database.sqlite.SQLiteDatabase.rawQueryWithFactory(SQLiteDatabase.java:1314)
08-01 15:39:59.128:W / System.err的(8623):在android.database.sqlite.SQLiteQueryBuilder.query(SQLiteQueryBuilder.java:400)
08-01 15:39:59.128:W / System.err的(8623):在android.database.sqlite.SQLiteQueryBuilder.query(SQLiteQueryBuilder.java:294)
08-01 15:39:59.128:W / System.err的(8623):在ecm2.android.Providers.StatusList.query(StatusList.java:132)
08-01 15:39:59.128:W / System.err的(8623):在android.content.ContentProvider.query(ContentProvider.java:652)
08-01 15:39:59.128:W / System.err的(8623):在android.content.ContentProvider $ Transport.query(ContentProvider.java:189)
08-01 15:39:59.128:W / System.err的(8623):在android.content.ContentResolver.query(ContentResolver.java:370)
08-01 15:39:59.135:W / System.err的(8623):在android.content.ContentResolver.query(ContentResolver.java:313)
08-01 15:39:59.135:W / System.err的(8623):在ecm2.android.MainActivity.createNewDialog(MainActivity.java:1167)
08-01 15:39:59.135:W / System.err的(8623):在ecm2.android.MainActivity $ ListViews.onListItemClick(MainActivity.java:641)
08-01 15:39:59.135:W / System.err的(8623):在android.support.v4.app.ListFragment $ 2.onItemClick(ListFragment.java:58)
08-01 15:39:59.135:W / System.err的(8623):在android.widget.AdapterView.performItemClick(AdapterView.java:298)
08-01 15:39:59.135:W / System.err的(8623):在android.widget.AbsListView.performItemClick(AbsListView.java:1086)
08-01 15:39:59.143:W / System.err的(8623):在android.widget.AbsListView $ PerformClick.run(AbsListView.java:2855)
08-01 15:39:59.143:W / System.err的(8623):在android.widget.AbsListView $ 1.run(AbsListView.java:3529)
08-01 15:39:59.143:W / System.err的(8623):在android.os.Handler.handleCallback(Handler.java:615)
08-01 15:39:59.143:W / System.err的(8623):在android.os.Handler.dispatchMessage(Handler.java:92)
08-01 15:39:59.143:W / System.err的(8623):在android.os.Looper.loop(Looper.java:137)
08-01 15:39:59.143:W / System.err的(8623):在android.app.ActivityThread.main(ActivityThread.java:4745)
08-01 15:39:59.143:W / System.err的(8623):在java.lang.reflect.Method.invokeNative(本机方法)
08-01 15:39:59.151:W / System.err的(8623):在java.lang.reflect.Method.invoke(Method.java:511)
08-01 15:39:59.151:W / System.err的(8623):在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:786)
08-01 15:39:59.151:W / System.err的(8623):在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
08-01 15:39:59.151:W / System.err的(8623):在dalvik.system.NativeStart.main(本机方法)

基本上,我试图做到这一点查询我的的任何类型1 名称

我知道一个事实,这样的记录存在,所以我不知道为什么我收到此错误

编辑:
数据库创建code

 私有静态类DatabaseHelper扩展SQLiteOpenHelper
{
    DatabaseHelper(上下文的背景下)
    {
        超(背景下,DATABASE_NAME,空,DATABASE_VERSION);
    }    @覆盖
    公共无效的onCreate(SQLiteDatabase DB)
    {
        createTables(DB);
    }    @覆盖
    公共无效onUpgrade(SQLiteDatabase分贝,INT oldVersion,
                          INT静态网页)
    {
        Log.w(信息,从版本升级数据库+ oldVersion
              +至
              + NEWVERSION +,这将摧毁所有旧数据);
        db.execSQL(DROP TABLE IF EXISTS事件);
        db.execSQL(DROP TABLE IF EXISTS分布);
        的onCreate(DB);
    }    私人无效createTables(SQLiteDatabase DB){
        db.execSQL(CREATE TABLE+ INCIDENTS_TABLE +(+ INCIDENT_ID +整数主键自动增量,+
                INCIDENT_ECM2ID +INTEGER,+ INCIDENT_STATON_NAME +TEXT+ INCIDENT_READ +INTEGER,+ INCIDENT_TOC +TEXT+
                INCIDENT_STATION_ID +INTEGER,+ INCIDENT_MESSAGE_ID +INTEGER,+ INCIDENT_MESSAGE +TEXT););        db.execSQL(CREATE TABLE+ DISTRIBUTION_MESSAGES_TABLE +(+ DIST_ID +整数主键自动增量,+
                DIST_MESSAGE_ID +INTEGER,+ DIST_ECM2ID +INTEGER,+ DIST_SENDER_EMAIL +TEXT+
                DIST_SENDER_NAME +TEXT+ DIST_STATION_ID +INTEGER,+ DISC_READ +INTEGER,+ DIST_TOC +TEXT
                + DIST_SUBJECT +TEXT+ DIST_MESSAGE +TEXT););
    }
}


解决方案

SIS 不是列,它应该是一个字符串。无论是使用替换字符或包装你的字符串中的引号。

使用SQL注入安全

 光标nameCursor = context.getContentResolver()查询(StatusList.STATUS_URI,
        新的String [] {StatusList.STATUS_NAME,StatusList.STATUS_PERMISSIONS,StatusList.STATUS_ECM2ID},
        StatusList.STATUS_TYPE += 1和+ StatusList.STATUS_NAME +=?,
        新的String [] {incidentCursor.getString(0)},
        空值);

使用引号:

 光标nameCursor = context.getContentResolver()查询(StatusList.STATUS_URI,
        新的String [] {StatusList.STATUS_NAME,StatusList.STATUS_PERMISSIONS,StatusList.STATUS_ECM2ID},
        StatusList.STATUS_TYPE += 1和+ StatusList.STATUS_NAME +='+ incidentCursor.getString(0)+',
        空值,
        空值);

When I query my database I keep getting an error saying SQLException: no such column and i do not understand why when my query looks just fine

Cursor nameCursor = context.getContentResolver().query(StatusList.STATUS_URI,new String[] {StatusList.STATUS_NAME,StatusList.STATUS_PERMISSIONS,StatusList.STATUS_ECM2ID}
                ,StatusList.STATUS_TYPE+"=1"+" AND "+StatusList.STATUS_NAME+"="+incidentCursor.getString(0),null,null);

here is the full error

08-01 15:39:59.104: W/System.err(8623): android.database.sqlite.SQLiteException: no such column: SIS (code 1): , while compiling: SELECT name, permissions, ecm2id FROM Status WHERE (type=1 AND name=SIS)
08-01 15:39:59.112: W/System.err(8623):     at android.database.sqlite.SQLiteConnection.nativePrepareStatement(Native Method)
08-01 15:39:59.112: W/System.err(8623):     at android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:882)
08-01 15:39:59.120: W/System.err(8623):     at android.database.sqlite.SQLiteConnection.prepare(SQLiteConnection.java:493)
08-01 15:39:59.120: W/System.err(8623):     at android.database.sqlite.SQLiteSession.prepare(SQLiteSession.java:588)
08-01 15:39:59.120: W/System.err(8623):     at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:58)
08-01 15:39:59.120: W/System.err(8623):     at android.database.sqlite.SQLiteQuery.<init>(SQLiteQuery.java:37)
08-01 15:39:59.120: W/System.err(8623):     at android.database.sqlite.SQLiteDirectCursorDriver.query(SQLiteDirectCursorDriver.java:44)
08-01 15:39:59.120: W/System.err(8623):     at android.database.sqlite.SQLiteDatabase.rawQueryWithFactory(SQLiteDatabase.java:1314)
08-01 15:39:59.128: W/System.err(8623):     at android.database.sqlite.SQLiteQueryBuilder.query(SQLiteQueryBuilder.java:400)
08-01 15:39:59.128: W/System.err(8623):     at android.database.sqlite.SQLiteQueryBuilder.query(SQLiteQueryBuilder.java:294)
08-01 15:39:59.128: W/System.err(8623):     at ecm2.android.Providers.StatusList.query(StatusList.java:132)
08-01 15:39:59.128: W/System.err(8623):     at android.content.ContentProvider.query(ContentProvider.java:652)
08-01 15:39:59.128: W/System.err(8623):     at android.content.ContentProvider$Transport.query(ContentProvider.java:189)
08-01 15:39:59.128: W/System.err(8623):     at android.content.ContentResolver.query(ContentResolver.java:370)
08-01 15:39:59.135: W/System.err(8623):     at android.content.ContentResolver.query(ContentResolver.java:313)
08-01 15:39:59.135: W/System.err(8623):     at ecm2.android.MainActivity.createNewDialog(MainActivity.java:1167)
08-01 15:39:59.135: W/System.err(8623):     at ecm2.android.MainActivity$ListViews.onListItemClick(MainActivity.java:641)
08-01 15:39:59.135: W/System.err(8623):     at android.support.v4.app.ListFragment$2.onItemClick(ListFragment.java:58)
08-01 15:39:59.135: W/System.err(8623):     at android.widget.AdapterView.performItemClick(AdapterView.java:298)
08-01 15:39:59.135: W/System.err(8623):     at  android.widget.AbsListView.performItemClick(AbsListView.java:1086)
08-01 15:39:59.143: W/System.err(8623):     at android.widget.AbsListView$PerformClick.run(AbsListView.java:2855)
08-01 15:39:59.143: W/System.err(8623):     at android.widget.AbsListView$1.run(AbsListView.java:3529)
08-01 15:39:59.143: W/System.err(8623):     at android.os.Handler.handleCallback(Handler.java:615)
08-01 15:39:59.143: W/System.err(8623):     at android.os.Handler.dispatchMessage(Handler.java:92)
08-01 15:39:59.143: W/System.err(8623):     at android.os.Looper.loop(Looper.java:137)
08-01 15:39:59.143: W/System.err(8623):     at android.app.ActivityThread.main(ActivityThread.java:4745)
08-01 15:39:59.143: W/System.err(8623):     at java.lang.reflect.Method.invokeNative(Native Method)
08-01 15:39:59.151: W/System.err(8623):     at java.lang.reflect.Method.invoke(Method.java:511)
08-01 15:39:59.151: W/System.err(8623):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
08-01 15:39:59.151: W/System.err(8623):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
08-01 15:39:59.151: W/System.err(8623):     at dalvik.system.NativeStart.main(Native Method)

Basically what I am trying to do it query my database for anything of type 1 and a name

I know for a fact such record exists so I dont know why I am getting this error

EDIT: Database creation code

private static class DatabaseHelper extends SQLiteOpenHelper 
{
    DatabaseHelper(Context context) 
    {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
    }

    @Override
    public void onCreate(SQLiteDatabase db) 
    {
        createTables(db);
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, 
                          int newVersion) 
    {
        Log.w("Messages", "Upgrading database from version " + oldVersion 
              + " to "
              + newVersion + ", which will destroy all old data");
        db.execSQL("DROP TABLE IF EXISTS Incidents");
        db.execSQL("DROP TABLE IF EXISTS Distributions");
        onCreate(db);
    }

    private void createTables(SQLiteDatabase db){
        db.execSQL("CREATE TABLE " + INCIDENTS_TABLE + "(" + INCIDENT_ID + " integer primary key autoincrement, " +
                INCIDENT_ECM2ID + " INTEGER, " + INCIDENT_STATON_NAME + " TEXT, " + INCIDENT_READ + " INTEGER, " + INCIDENT_TOC + " TEXT, " +
                INCIDENT_STATION_ID + " INTEGER, " + INCIDENT_MESSAGE_ID + " INTEGER, " + INCIDENT_MESSAGE + " TEXT);");

        db.execSQL("CREATE TABLE " + DISTRIBUTION_MESSAGES_TABLE + "(" + DIST_ID + " integer primary key autoincrement, " +
                DIST_MESSAGE_ID + " INTEGER, " + DIST_ECM2ID + " INTEGER, " + DIST_SENDER_EMAIL + " TEXT, " + 
                DIST_SENDER_NAME + " TEXT, " + DIST_STATION_ID + " INTEGER, " + DISC_READ + " INTEGER, " + DIST_TOC + " TEXT, "
                + DIST_SUBJECT +" TEXT, " + DIST_MESSAGE + " TEXT);");
    }
}

解决方案

SIS is not a column, it should be a string. Either use the ? substitution character or wrap your string in quotes.

Using SQL injection safe ?:

Cursor nameCursor = context.getContentResolver().query(StatusList.STATUS_URI,
        new String[] {StatusList.STATUS_NAME, StatusList.STATUS_PERMISSIONS, StatusList.STATUS_ECM2ID},
        StatusList.STATUS_TYPE + "=1 AND " + StatusList.STATUS_NAME + "=?",
        new String[] {incidentCursor.getString(0)},
        null);

Using quotes:

Cursor nameCursor = context.getContentResolver().query(StatusList.STATUS_URI,
        new String[] {StatusList.STATUS_NAME, StatusList.STATUS_PERMISSIONS, StatusList.STATUS_ECM2ID},
        StatusList.STATUS_TYPE + "=1 AND " + StatusList.STATUS_NAME + "='" + incidentCursor.getString(0) + "'",
        null,
        null);

这篇关于SQL没有这样的列错误,当它确实存在的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆