### 數據存儲
#### 1、描述一下Android數據持久存儲方式?
> * 參考回答:Android平臺實現數據持久存儲的常見幾種方式:
> * **SharedPreferences存儲**:一種輕型的數據存儲方式,本質是基于XML文件存儲的key-value鍵值對數據,通常用來存儲一些簡單的配置信息(如應用程序的各種配置信息);
> * **SQLite數據庫存儲**:一種輕量級嵌入式數據庫引擎,它的運算速度非常快,占用資源很少,常用來存儲大量復雜的關系數據;
> * **ContentProvider**:四大組件之一,用于數據的存儲和共享,不僅可以讓不同應用程序之間進行數據共享,還可以選擇只對哪一部分數據進行共享,可保證程序中的隱私數據不會有泄漏風險;
> * **File文件存儲**:寫入和讀取文件的方法和 Java中實現I/O的程序一樣;
> * **網絡存儲**:主要在遠程的服務器中存儲相關數據,用戶操作的相關數據可以同步到服務器上;
#### 2、SharedPreferences的應用場景?注意事項?
> * 參考回答:
> * SharedPreferences是一種輕型的數據存儲方式,本質是基于XML文件存儲的key-value鍵值對數據,通常用來存儲一些簡單的配置信息,如int,String,boolean、float和long;
> * 注意事項:
> * **勿存儲大型復雜數據,這會引起內存GC、阻塞主線程使頁面卡頓產生ANR**
> * **勿在多進程模式下,操作Sp**
> * **不要多次edit和apply,盡量批量修改一次提交**
> * **建議apply,少用commit**
> * 推薦文章:
> * [史上最全面,清晰的SharedPreferences解析](https://blog.csdn.net/geekerhw/article/details/79713068)
> * [SharedPreferences在多進程中的使用及注意事項](http://zmywly8866.github.io/2015/09/09/sharedpreferences-in-multiprocess.html)
#### 3、SharedPrefrences的apply和commit有什么區別?
> * 參考回答:
> * **apply沒有返回值而commit返回boolean表明修改是否提交成功。**
> * **apply是將修改數據原子提交到內存, 而后異步真正提交到硬件磁盤**, 而commit是**同步**的提交到硬件磁盤,因此,在多個并發的提交commit的時候,他們會等待正在處理的commit保存到磁盤后在操作,從而降低了效率。而apply只是原子的提交到內容,后面有調用apply的函數的將會直接覆蓋前面的內存數據,這樣從一定程度上提高了很多效率。
> * **apply方法不會提示任何失敗的提示。** 由于在一個進程中,sharedPreference是單實例,一般不會出現并發沖突,如果對提交的結果不關心的話,建議使用apply,當然需要確保提交成功且有后續操作的話,還是需要用commit的。
#### 4、了解SQLite中的事務操作嗎?是如何做的
> * 參考回答:
> * SQLite在做CRDU操作時都默認開啟了事務,然后把SQL語句翻譯成對應的SQLiteStatement并調用其相應的CRUD方法,此時整個操作還是在rollback journal這個臨時文件上進行,只有操作順利完成才會更新db數據庫,否則會被回滾;
#### 5、使用SQLite做批量操作有什么好的方法嗎?
> * 參考回答:
> * 使用SQLiteDatabase的beginTransaction方法開啟一個事務,將批量操作SQL語句轉化為SQLiteStatement并進行批量操作,結束后endTransaction()
#### 6、如何刪除SQLite中表的個別字段
> * 參考回答:
> * SQLite數據庫只允許增加字段而不允許修改和刪除表字段,只能創建新表保留原有字段,刪除原表
#### 7、使用SQLite時會有哪些優化操作?
> * 參考回答:
> * 使用事務做批量操作
> * 及時關閉Cursor,避免內存泄露
> * 耗時操作異步化:數據庫的操作屬于本地IO耗時操作,建議放入異步線程中處理
> * ContentValues的容量調整:ContentValues內部采用HashMap來存儲Key-Value數據,ContentValues初始容量為8,擴容時翻倍。因此建議對ContentValues填入的內容進行估量,設置合理的初始化容量,減少不必要的內部擴容操作
> * 使用索引加快檢索速度:對于查詢操作量級較大、業務對查詢要求較高的推薦使用索引