在項目的開發(fā)過程中,必然會做數(shù)據(jù)的持久化,而在iOS的開發(fā)中,存儲大量數(shù)據(jù)很多人使用的是SQLite,我也是其中的一個,在項目中使用的數(shù)據(jù)庫相關(guān)的第三方框架是FMDB。
前幾天做項目的時候,為了偷懶,不想使用代碼在項目中動態(tài)創(chuàng)建數(shù)據(jù)庫文件和數(shù)據(jù)表,就使用可視化工具創(chuàng)建了一個數(shù)據(jù)庫文件,直接拖進(jìn)項目中,然后獲取路徑,使用FMDB進(jìn)行操作,由于開發(fā)前期是沒有使用真機(jī)進(jìn)行開發(fā)的(我想,很少有人會在電腦上插個iPhone一直用來調(diào)試的吧),所以,一切進(jìn)展在模擬器上都顯得那么和諧、那么順利。
臨近結(jié)束的時候,使用真機(jī)測試一下,瞬間問題出現(xiàn)了,在向數(shù)據(jù)庫中寫入數(shù)據(jù)的時候,控制臺一直提示: Unknown?error?calling?sqlite3_step?(8:?attempt?to?write?a?readonly)
這個提示語一看就知道,這個數(shù)據(jù)庫文件是一個只讀的,不能執(zhí)行寫入操作,好吧,我改。打開項目所在的目錄,找到數(shù)據(jù)庫文件,設(shè)置文件的訪問權(quán)限,重新運行,報錯。
難道是緩存,好的,卸載手機(jī)上的APP,重新運行安裝,再次報錯。
打開模擬器,卸載模擬器上的APP,重新安裝,運行,很正常。
怎么回事?手機(jī)上不能運行,模擬器上可以,難道不是數(shù)據(jù)庫文件沒有讀寫權(quán)限,而是數(shù)據(jù)庫文件所處的位置沒有讀寫權(quán)限?好吧,我用代碼動態(tài)創(chuàng)建試試,結(jié)果表明,成功了,順利運行。
經(jīng)過這次事情,我突然明悟了,拖進(jìn)項目中的資源是會被放在一個資源文件夾中,這個資源文件夾是只讀的,也就導(dǎo)致了放在里面的所有文件都無法進(jìn)行寫入操作。所以啊,想要對資源進(jìn)行讀寫操作,還是將需要進(jìn)行讀寫操作的文件放到系統(tǒng)分配的沙盒目錄下,如果實在是想使用拖進(jìn)去的資源文件進(jìn)行讀寫操作,可以先將資源文件拖進(jìn)項目中,在APP運行時將資源文件復(fù)制到沙盒中進(jìn)行操作。
開發(fā)中遇到的每一個錯誤都是一中收獲,收獲的可能不止這個錯誤的解決方案,還有其他的相關(guān)知識,每次解決錯誤都是一次進(jìn)步,如果解決錯誤還沒法讓自己進(jìn)步,放棄吧,這不是適合你的行業(yè)。