1. 程式人生 > >在Android中多程序使用同一個sqlite資料庫的問題

在Android中多程序使用同一個sqlite資料庫的問題

一、多程序訪問同一個資料庫是否安全

背景:多個程序代表多個數據庫操作instance,每個程序有自己的ApplicationContext。多個程序記憶體不共享。

寫程式碼做了測試測試程式碼在最後,雖然sqlite不是執行緒安全的,但是在安卓多程序同時呼叫插入式沒有問題的,並沒有發生錯誤和衝突。因此網路上也就沒有發現解決多程序訪問資料庫的問題,也就是不存在這樣的問題。但是,並不能保證多個程序插入的順序。

二、多程序有執行順序要求的處理辦法

只是證明了多程序可以同時新增資料,但對於有執行順序要求的資料庫操作可能並不能滿足,即便使用了事務(事務是線上程的前提下工作的)如果真的需要考慮執行順序但又需要多個程序同時訪問也有方法。

原理是:

1.把資料庫單獨放大一個程序裡面,也就是多個程序操作最後都要經過統一的入口開操作,

2.對其他程序提供介面,目的是保證資料庫操作只在一個程序裡面完成

3.同時在這個程序裡面使用事務或者單執行緒保證操作的順序。

4.保證了資料插入更改的順序,當然也就有了效能瓶頸。

實現方法:

1.在專案裡面的所有使用資料庫的程序裡,挑選其中一個作為操作資料庫的唯一程序。

2.在這個程序裡面定義context provider 包裹資料庫(context provider 是用了程序間通訊的安卓標準四大元件之一)

3.其他程序通過context provider 來操作資料庫

4.也就是說context provider 成為唯一的資料庫操作入口

三、sqlite處理執行緒不安全的方法

sqlite插入資料的時候預設一條語句就是一個事務,有多少條資料就有多少次磁碟操作(可以自己寫事務程式碼控制事務把多條插入語句弄到一個事務裡,因為事務降低了效率)測試多程序沒有問題,也就是說在使用sqlite的時候只要考慮多執行緒訪問的安全。因為倆個執行緒同時插入會丟擲異常。既然是執行緒安全,那麼加鎖和同步程式碼塊的方法(synchronized)就可以保證使用不丟擲異常。

下面是對執行緒安全處理的示例程式碼:

public synchronized void insertNewTask(int tid, int start) {//呼叫插入資料庫的程式碼 }

public synchronized List getAllTask() {//呼叫讀取資料庫的程式碼}

四、測試安卓多程序訪問資料是否有安全的的全部程式碼

https://github.com/robert1207/DbMultProcess