2015-07-21 119 views
-1

這裏是我要插入值的表:SQLiteException:無法識別的標記: 「」:

" create table if not exists "+CipherCongfigTable + 
" (DATABSE_NAME **TEXT** PRIMARY KEY NOT NULL,DATABSE_KEY **TEXT** NOT NULL);"; 

當我想插入

String **configDBPassword**= "**x\'2DD29CA89\'**" 

通過聲明

"insert into "+CipherCongfigTable+ " values("+DataBaseName+","+**configDBPassword**+")" 

我收到異常:

無法識別的標記:「\」:

我需要有逃生性格特徵相同的格式,即密碼。有沒有辦法做到這一點?

謝謝

+1

我相信它的java創建問題,請嘗試\\而不是使用準備好的語句 – Panther

+3

爲什麼你使用not [insert()](https://developer.android.com/reference/android/database/sqlite/SQLiteDatabase。 html#insert%28java.lang.String,%20java.lang.String,%20android.content.ContentValues%29),而是通過*沒有正確引用您的參數來創建SQL注入攻擊點。 – dhke

回答

1

不要手工打造INSERT(或任何其他,如果你能避免它)查詢在Android(或任何其他數據庫的包裝,只要有一個預定義的API來獲得你想要的)。它會引導您的應用程序引用問題,例如您的問題和最糟糕的問題 - 從您的應用程序之外的SQL注入攻擊。

例如,設置configDBPassword = "\"; DROP TABLE <tablename>; --"只要configDBPassword可以由用戶輸入,我可能會對您的數據庫造成嚴重破壞。

此外,SQLite的使用雙引號("),反引號(`,從MySQL借來的),或方括號([],從MS SQL借來的)報價標識符(如列或表名稱包含空格) ,字符串文字是單引號(')引號。 SQLite在允許混合使用兩種引用類型方面相當寬鬆,但在適當的情況下使用適當的引用風格的可讀性要明顯得多。從the documentation

程序員被告誡不要使用前面的項目符號中描述的兩個例外。我們強調,它們的存在只是爲了使舊的和格式不正確的SQL語句能夠正確運行。未來版本的SQLite可能會引發錯誤,而不是接受上述例外所涵蓋的格式錯誤的語句。

事實上,你應該儘可能避免自己做引用。要插入值,請改爲使用SQLiteDatabase.insert(),這是將值插入Android上的SQLiteDatabase的正確方法。它也不會正確引用的論據,也:

db.beginTransaction(); 
    try { 
     final ContentValues values = new ContentValues(); 
     values.put("DATABSE_NAME", DataBaseName); 
     values.put("DATABSE_KEY", configDBPassword); 

     db.insert(CipherCongfigTable, null, values); 
     db.setTransactionSuccessful(); 
    } finally { 
     db.endTransaction(); 
    } 

始終正確引用您的SQL參數。

+0

感謝@dhke現在我正在使用SQLiteStatement來構建sql語句,然後使用SQLiteStatement.execute()。我已經夠好了 –

0

試試這個。

"INSERT INTO "+CipherCongfigTable+ " values('DataBaseName','configDBPassword')」 

你是不是在你的插入查詢添加單引號(')

編輯: 如果您需要用單qotes手段插入之前使用這樣的插入字符串。

configDBPassword = configDBPassword.replace ("'", "''"); 

而且改變你的**

" create table if not exists "+CipherCongfigTable + 
" (DATABSE_NAME TEXT PRIMARY KEY NOT NULL,DATABSE_KEY TEXT NOT NULL);"; 
+0

謝謝阿舍爾。 acutlly我需要單引號(')在密碼。有沒有辦法做到這一點。 –

+0

請不要促進不正確的SQL編碼技術。另外,那些報價是什麼?爲什麼? – user2864740

+0

@SidharthDash檢查我的編輯 – Amsheer