2011-04-02 120 views
22

是否有可能在Android手機上使用SQLite與C++?我還沒有找到任何有關這可能的文檔。SQLite與Android NDK

+1

http://code.google.com/p/sqlite-ndk/ - 它包括小例子如何使用SQLite,也sqlite3ndk,您可以訪問存儲在「資產」目錄(2.3+)數據庫。您可以直接從sqlite.org使用SQLite,因爲源文件沒有變化。 – kibab 2011-09-29 15:19:22

回答

13

不可能通過NDK使用內置的SQLite(或者在六個月前,當我研究這個時),只能用Java訪問。然而,它可能會鏈接到你自己完全獨立的SQLite的C++版本。

+7

不僅「可能」它的工作,但它確實。我簡單地將「sqlite.c」添加到我的項目中:它包含整個數據庫 – 2011-04-04 13:38:48

+2

@bitbox:我對這個解決方案很感興趣,可以提供關於如何處理它的更多細節? – 2011-07-12 05:36:15

1

聲明:我只使用這種方法的獨立可執行文件,而不是實現JNI函數的庫。它可能適用於.so或不適用。另外,我正在使用自定義Android設備,而不是手機。

您可以通過NDK使用內置的SQLite,但它比支持的東西更像是一種破解。您需要從android源碼分發中剔除sqlite3.h和libsqlite.so,並使用它們進行編譯。將sqlite3.h放入你的應用程序源代碼目錄中,並且你需要將.so放在out/yourapp目錄下,或者在build/platform/android-x/arch-arm/usr/lib目錄下完成鏈接步驟。我在兩個地方都有,但我不確定哪一個是真正需要的。

您將最終鏈接到您提供的libsqlite.so,但二進制將在目標設備上使用系統libsqlite.so正常運行。

43

單從下載SQLite3的合併源文件: http://www.sqlite.org/download.html

然後在Android.mk添加sqlite3.cLOCAL_SRC_FILES變量。

+1

簡單但準確的答案。謝謝! – 2011-11-09 17:49:30

+0

嗨gabor,我只是想在我的android應用程序中使用sqlite3庫。我將sqlite3.c和sqlite3.h導入到我的項目中的jni文件夾中。接下來我應該做什麼? – idish 2012-12-09 08:13:27

+1

哇140+線,C是最好的 – user457015 2013-08-02 21:18:24

3

請參閱SQLite Android綁定http://www.sqlite.org/android/doc/trunk/www/index.wiki,其中描述瞭如何爲Android目標15(4.0.3)和更高版本包含sqlite3。它在下面複製。

的SQLite的Android綁定

SQLite庫是Android環境的核心部分。 Java 應用程序和內容提供者使用android.database.sqlite命名空間中的接口 訪問SQLite。使用Android的內置的SQLite支持

一個缺點是, 應用程序被強制使用的SQLite版本的Android 當前版本發生一起出貨。如果您的應用程序 恰巧需要更新版本的SQLite,或者安裝了自定義 擴展或VFS的版本,那麼您運氣不好。

此項目中的代碼允許使用Android NDK 打造的SQLite的一個定製版本的應用程序與應用程序 運,同時仍繼續使用標準的Java接口。

正常使用

安裝

的Android API等級15(安卓4.0.3),和更大的支持。如果目標API級別爲16或更高的 ,請使用此項目的默認「中繼」分支 。或者,對於API級別15,請使用「api-level-15」分支。它不可能以 爲目標的API級別低於15。

從這個項目將下列文件複製到應用程序項目中的等價 位置。

jni/Android.mk 
jni/Application.mk 
jni/sqlite/*    (copy contents of directory recursively) 
src/org/sqlite/database/* (copy contents of directory recursively) 

在此之後,目錄結構應包含 這些文件。

對於API級別15只,也複製以下:

src/org/sqlite/os/*   (copy contents of directory recursively) 

目錄 「JNI /源碼/」 包含sqlite3.h 和sqlite3.c源文件的副本。在它們之間,它們包含SQLite庫的源代碼 。如有必要,請將其替換爲源 以獲取所需的特定版本的SQLite。如果SQLite是要 與定義任何特殊的預處理器宏編譯,將它們添加到 的「JNI /源碼/ Android.mk」文件(沒有JNI/Android.mk)。

一旦文件被添加到項目,跑項目的根目錄下的命令 「NDK建造」。這將編譯在JNI /目錄(包括自定義的SQLite 版本),以將與該應用程序被部署到該設備沿 共享庫 本地代碼。假設它是成功的,除非你修改JNI /目錄結構中的 來源或makefile文件,你應該 並不需要再次運行「NDK建造」。

應用程序編程

組成的「android.database.sqlite」命名空間中的內置Android SQLite的接口位於 的類。該接口提供 所有相同的類時,除了 「org.sqlite.database.sqlite」命名空間內。這意味着要修改 應用程序使用SQLite的定製版本,所有通常需要 是全部替換「android.database.sqlite」 在源代碼中有「org.sqlite.database.sqlite」。

例如,以下內容:

import android.database.sqlite.SQLiteDatabase;

應替換:

import org.sqlite.database.sqlite.SQLiteDatabase;

除了代替在android.database.sqlite的類的所有用途。* 命名空間,應用程序還必須確保使用以下兩種:

org.sqlite.database.SQLException
org.sqlite.database.DatabaseErrorHandler

代替:

android.database.SQLException
android.database.DatabaseErrorHandler

除了命名空間的變化, 有是從股票Android界面其他差異應用程序需要注意:

SQLiteStatement.simpleQueryForBlobFileDescriptor()API不是 可用。 排序順序「UNICODE」不可用。 排序順序「LOCALIZED」通常與 系統的當前語言環境一致,總是等同於SQLite內置的 排序規則BINARY。