2015-05-01 50 views
0

我有一個應用程序,作爲一個內部數據庫,以及與此錯誤的應用程序崩潰:Android的數據庫寫入錯誤

04-30 20:46:30.836 1647-1647/prosis.guiatour E/SQLiteLog﹕ (1) no such column: Basílica_Santa_Luzia 

並且這指的代碼是:

public void onCreate(SQLiteDatabase db) { 
    db.execSQL(CREATE_QUERY); 
    Log.e("Database Operations"," Table Created...."); 
    db.execSQL(addingInfo("Basílica_Santa_Luzia", "Stuff", "10.43597", "-10.5747")); 
Log.e("Database Operations"," Data Inserted"); 
} 
public String addingInfo(String nome, String cat, String lat, String longi){ 
    String Query = "INSERT INTO "+ Table_name+" VALUES("+nome+","+cat+","+lat+","+longi+");"; 
    return Query; 
} 

而且這是我的contructer查詢:

private static final String CREATE_QUERY = "CREATE TABLE "+ Contract.NewLocalInfo.Table_name+" ("+ Contract.NewLocalInfo.Nome+" TEXT,"+ Contract.NewLocalInfo.Categoria+" TEXT,"+ Contract.NewLocalInfo.Latitude+" TEXT,"+ Contract.NewLocalInfo.Longitude+" TEXT);"; 

我認爲SQL很好Writen所以你覺得什麼是這裏的問題?

回答

1

您的SQL將無效。根據你的功能,你會得到:

INSERT INTO table_name VALUES(Basilica_Santa_Luzia,Stuff,10.43,10.57) 

這是無效的。你必須單引號字符串,如:

INSERT INTO table_name VALUES('Basilica_Santa_Luzia','Stuff','10.43','10.57') 

但是,你不應該編寫任何SQL,除非你有複雜的要求。您應該使用Android內置的內容或獲得第三方選項。

編寫SQL查詢字符串會產生安全風險並導致像這樣的錯誤。
要插入,而不是做:

ContentValues cv = new ContentValues(); 
cv.put("key","value"); 
cv.put("key2","value2"); 
db.insert("table_name",cv); 

這種方法會自動流出的任何PARAMATERS並保證您的查詢沒有錯。

此外,緯度和經度可能不應該是String s。我不確定,但我認爲你需要的是double對於Java/Android方和正常的SQL,你需要一個decimal數據類型的列,但它的SQLite,我不知道你是什麼應該爲sqlite中的小數列做,所以也許Duck it

此外,我製作了一個database manager class,它包裝了SQLiteOpenHelper類以確保同步和線程安全,這可以簡化您的生活並防止大量錯誤。

0

圍繞所有值添加單引號,然後該插入將起作用。最終查詢應該如下所示

INSERT INTO TABLE_NAME VALUES('Basílica_Santa_Luzia','Stuff','10.43597','-10.5747'); 
+0

當一個字符串包含引號時,這將炸燬。 –

+0

通過在其之前添加一個單引號可以解析單引號的值 – Manish