2012-08-01 48 views
0

当我查询我的数据库中,我不断收到一个错误说SQLException: no such column,我不明白为什么当我查询看起来只有精细SQL没有这样的列错误时,它确实存在

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); 

这里是完整的错误

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) 

基本上什么,我试图做到这一点查询我的数据库为type 1东西和name

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

编辑: 数据库创建代码

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);"); 
    } 
} 
+0

您需要发布代码,其中你创建你的数据库。现有代码的新眼睛可能有助于 – 2012-08-01 19:56:35

+0

编辑与数据库创建代码 – tyczj 2012-08-01 19:58:51

回答

1

SIS不是列,它应该是一个字符串。请使用?替代字符或将您的字符串用引号括起来。

使用SQL注入安全?

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); 

使用引号:

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); 
+0

报价做了谢谢!我只是假设,因为我从光标中得到一个字符串,这将是好的 – tyczj 2012-08-01 20:00:14

+0

@tyczj,绝不要手动插入引号。始终使用'?'并紧随'selectionArgs'参数。想象一下,你的字符串已经包含单引号或双引号...... BOOM! – StenaviN 2012-08-01 20:05:43

+0

@StenaviN如果用户无法与数据交互,则使用引号是安全的。防止自己插入SQL插入是没有意义的。 – Sam 2012-08-01 22:06:10

1

这是建立查询正确的方法:

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

很有用,以备将来参考,谢谢 – tyczj 2012-08-01 20:02:30