2012-08-03 125 views
2

以下是我們的情況:通過C++創建SQLite數據庫。通過Java SDK訪問它?

我們有一些本機代碼可以在特定時間掃描用戶定義的目錄。我們的目標是收集關於特定類型文件的數據並從中建立一個SQLite數據庫。可能有數以萬計的文件要查詢。

問題是,每個文件被發現的時間,收集了有關該文件的數據必須跨越JNI邊界Java的土地通過由Android SDK中提供的SQLite的類被comitted到數據庫之前迎來。這需要太遠太長。

建議的解決方案將下載SQLite源代碼,將其鏈接到我們的項目中,並按照此處所述原生構建數據庫:SQLite with Android NDK。這將消除將數據從C++層完全傳遞到Java層所花費的時間。

問題是:如果這樣做,Android SDK(Java層)仍然可以用來打開數據庫,獲取正常的Cursor對象等嗎?我們可以保持數據庫非常簡單;沒有外鍵,觸發器,約束等。儘管索引是非常可取的。

我們已經考慮了將數據移動到JNI邊界的管道和套接字。但是,Fat32文件系統不支持命名管道(因此,在用戶將應用程序移動到Fat32格式的SD卡時,這是不可用的)。套接字也不可用,因爲我們必須在清單中包含Internet許可,而我們認爲這些許可看起來可疑。

如果有人有任何關於此的信息,我們很樂意聽取您的意見。

非常感謝, P.

回答

2

只需跟進,我們採取了暴跌,扔在一起編譯最新的SQLite的融合(3.7.13)的源代碼測試應用程序。我們發現我們確實能夠通過Android Java SDK與本地創建的數據庫進行交互。

表現明智,這是一個很大的飛躍!通過在本地層插入我們的記錄,我們發現了性能增加的大規模。以前,將20,000條記錄插入非複雜數據庫需要大約4分鐘的時間。一些簡單的分析顯示,幾乎整個4分鐘都是將數據從本地層傳遞到Java層。

現在,插入需要4到6秒。我們也可以按照正常的方式使用Java API打開,查詢等數據庫。

性能調整需要注意的是交易和使用日誌移動到內存:

pragma journal_mode=memory; 

我們決定不關閉出於穩定性的原因同步,再加上我們都樂意與我們已經達到了性能更。

希望其他人會覺得這個建議很有用。

P

+0

您是如何處理數據庫鎖的?如果Im從Android中的幾個線程訪問數據庫,並且在本地訪問數據庫,是否會有數據庫損壞的可能性?你有沒有遇到過這樣的問題?我知道SQL是線程安全的,但我不確定是否真的可以跨Java和C++線程安全。我知道這是非常舊的帖子,但是如果你能在這裏提供一些想法,我會非常感謝 – Santosh 2014-11-26 14:44:38

+0

對不起,但是對於我們來說,線程化並不是問題,因爲我們將所有記錄插入本地層之前的任何其他部分(Java層)開始讀取/寫入/刪除/修改這些記錄。 – protectedmember 2015-08-19 08:00:06

+0

@protectedmember你是如何管理的? - 一些簡單的分析顯示,幾乎整個4分鐘都是將數據從本地層傳遞到Java層。 – 2017-09-28 13:49:37