以下是我們的情況:通過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.
您是如何處理數據庫鎖的?如果Im從Android中的幾個線程訪問數據庫,並且在本地訪問數據庫,是否會有數據庫損壞的可能性?你有沒有遇到過這樣的問題?我知道SQL是線程安全的,但我不確定是否真的可以跨Java和C++線程安全。我知道這是非常舊的帖子,但是如果你能在這裏提供一些想法,我會非常感謝 – Santosh 2014-11-26 14:44:38
對不起,但是對於我們來說,線程化並不是問題,因爲我們將所有記錄插入本地層之前的任何其他部分(Java層)開始讀取/寫入/刪除/修改這些記錄。 – protectedmember 2015-08-19 08:00:06
@protectedmember你是如何管理的? - 一些簡單的分析顯示,幾乎整個4分鐘都是將數據從本地層傳遞到Java層。 – 2017-09-28 13:49:37