Ⅰ 簡述android平台提供了哪些數據存儲方法
數據存儲在開發中是使用最頻繁的,Android平台主要有5種實現數據存儲的方式。
第1種: 使用SharedPreferences存儲數據
SharedPreferences是Android平台上一個輕量級的存儲類,主要是保存一些常用的配置比如窗口狀態,一般在Activity中 重載窗口狀態onSaveInstanceState保存一般使用SharedPreferences完成,它提供了Android平台常規的Long長 整形、Int整形、String字元串型的保存。
它的本質是基於XML文件存儲key-value鍵值對數據,通常用來存儲一些簡單的配置信息。
其存儲位置在/data/data/<包名>/shared_prefs目錄下。
SharedPreferences對象本身只能獲取數據而不支持存儲和修改,存儲修改是通過Editor對象實現。
實現SharedPreferences存儲的步驟如下:
一、根據Context獲取SharedPreferences對象
二、利用edit()方法獲取Editor對象。
三、通過Editor對象存儲key-value鍵值對數據。
四、通過commit()方法提交數據。
SharedPreferences對象與sqlite資料庫相比,免去了創建資料庫,創建表,寫SQL語句等諸多操作,相對而言更加方便,簡潔。但是SharedPreferences也有其自身缺陷,比如其職能存儲boolean,int,float,long和String五種簡單的數據類型,比如其無法進行條件查詢等。所以不論SharedPreferences的數據存儲操作是如何簡單,它也只能是存儲方式的一種補充,而無法完全替代如SQLite資料庫這樣的其他數據存儲方式。
第2種: 內部文件存儲數據
關於文件存儲,Activity提供了openFileOutput()方法可以用於把數據輸出到文件中,具體的實現過程與在J2SE環境中保存數據到文件中是一樣的。
文件可用來存放大量數據,如文本、圖片、音頻等。
默認位置:/data/data/<包>/files/***.***。
openFileOutput()方法的第一參數用於指定文件名稱,不能包含路徑分隔符「/」 ,如果文件不存在,Android 會自動創建它。
創建的文件保存在/data/data//files目錄,如: /data/data/cn.itcast.action/files/itcast.txt ,通過點擊Eclipse菜單「Window」-「Show View」-「Other」,在對話窗口中展開android文件夾,選擇下面的File Explorer視圖,然後在File Explorer視圖中展開/data/data//files目錄就可以看到該文件。
openFileOutput()方法的第二參數用於指定操作模式,有四種模式,分別為:
Context.MODE_PRIVATE = 0
Context.MODE_APPEND = 32768
Context.MODE_WORLD_READABLE = 1
Context.MODE_WORLD_WRITEABLE = 2
Context.MODE_PRIVATE:為默認操作模式,代表該文件是私有數據,只能被應用本身訪問,在該模式下,寫入的內容會覆蓋原文件的內容,如果想把新寫入的內容追加到原文件中。可以使用Context.MODE_APPEND
Context.MODE_APPEND:模式會檢查文件是否存在,存在就往文件追加內容,否則就創建新文件。
Context.MODE_WORLD_READABLE和Context.MODE_WORLD_WRITEABLE用來控制其他應用是否有許可權讀寫該文件。
MODE_WORLD_READABLE:表示當前文件可以被其他應用讀取;
MODE_WORLD_WRITEABLE:表示當前文件可以被其他應用寫入。
如果希望文件被其他應用讀和寫,可以傳入: openFileOutput(「itcast.txt」, Context.MODE_WORLD_READABLE + Context.MODE_WORLD_WRITEABLE); android有一套自己的安全模型,當應用程序(.apk)在安裝時系統就會分配給他一個userid,當該應用要去訪問其他資源比如文件的時候,就需要userid匹配。默認情況下,任何應用創建的文件,sharedpreferences,資料庫都應該是私有的(位於/data/data//files),其他程序無法訪問。
除非在創建時指定了Context.MODE_WORLD_READABLE或者Context.MODE_WORLD_WRITEABLE ,只有這樣其他程序才能正確訪問。 對於私有文件只能被創建該文件的應用訪問,如果希望文件能被其他應用讀和寫,可以在創建文件時,指定Context.MODE_WORLD_READABLE和Context.MODE_WORLD_WRITEABLE許可權。
Activity還提供了getCacheDir()和getFilesDir()方法: getCacheDir()方法用於獲取/data/data//cache目錄 getFilesDir()方法用於獲取/data/data//files目錄。
第3種: 外部文件存儲數據
把文件存入SDCard:
使用Activity的openFileOutput()方法保存文件,文件是存放在手機空間上,一般手機的存儲空間不是很大,存放些小文件還行,如果要存放像視頻這樣的大文件,是不可行的。對於像視頻這樣的大文件,我們可以把它存放在SDCard。
SDCard是干什麼的?你可以把它看作是移動硬碟或U盤。 在模擬器中使用SDCard,你需要先創建一張SDCard卡(當然不是真的SDCard,只是鏡像文件)。
創建SDCard可以在Eclipse創建模擬器時隨同創建,也可以使用DOS命令進行創建,如下: 在Dos窗口中進入android SDK安裝路徑的tools目錄,輸入以下命令創建一張容量為2G的SDCard,文件後綴可以隨便取,建議使用.img: mksdcard 2048M D:\AndroidTool\sdcard.img 在程序中訪問SDCard,你需要申請訪問SDCard的許可權。
在AndroidManifest.xml中加入訪問SDCard的許可權如下:
要往SDCard存放文件,程序必須先判斷手機是否裝有SDCard,並且可以進行讀寫。
注意:訪問SDCard必須在AndroidManifest.xml中加入訪問SDCard的許可權。
Environment.getExternalStorageState()方法用於獲取SDCard的狀態,如果手機裝有SDCard,並且可以進行讀寫,那麼方法返回的狀態等於Environment.MEDIA_MOUNTED。
Environment.getExternalStorageDirectory()方法用於獲取SDCard的目錄,當然要獲取SDCard的目錄,你也可以這樣寫:
第4種: SQLite資料庫存儲數據
SQLite是輕量級嵌入式資料庫引擎,它支持 SQL 語言,並且只利用很少的內存就有很好的性能。此外它還是開源的,任何人都可以使用它。許多開源項目((Mozilla, PHP, Python)都使用了 SQLite.SQLite 由以下幾個組件組成:SQL 編譯器、內核、後端以及附件。SQLite 通過利用虛擬機和虛擬資料庫引擎(VDBE),使調試、修改和擴展 SQLite 的內核變得更加方便。
特點:
面向資源有限的設備,
沒有伺服器進程,
所有數據存放在同一文件中跨平台,
可自由復制。
SQLite 基本上符合 SQL-92 標准,和其他的主要 SQL 資料庫沒什麼區別。它的優點就是高效,Android 運行時環境包含了完整的 SQLite。
SQLite 和其他資料庫最大的不同就是對數據類型的支持,創建一個表時,可以在 CREATE TABLE 語句中指定某列的數據類型,但是你可以把任何數據類型放入任何列中。當某個值插入資料庫時,SQLite 將檢查它的類型。如果該類型與關聯的列不匹配,則 SQLite 會嘗試將該值轉換成該列的類型。如果不能轉換,則該值將作為其本身具有的類型存儲。比如可以把一個字元串(String)放入 INTEGER 列。SQLite 稱這為「弱類型」(manifest typing.)。 此外,SQLite 不支持一些標準的 SQL 功能,特別是外鍵約束(FOREIGN KEY constrains),嵌套 transcaction 和 RIGHT OUTER JOIN 和 FULL OUTER JOIN, 還有一些 ALTER TABLE 功能。 除了上述功能外,SQLite 是一個完整的 SQL 系統,擁有完整的觸發器,交易等等。
Android 集成了 SQLite 資料庫 Android 在運行時(run-time)集成了 SQLite,所以每個 Android 應用程序都可以使用 SQLite 資料庫。
對於熟悉 SQL 的開發人員來時,在 Android 開發中使用 SQLite 相當簡單。但是,由於 JDBC 會消耗太多的系統資源,所以 JDBC 對於手機這種內存受限設備來說並不合適。因此,Android 提供了一些新的 API 來使用 SQLite 資料庫,Android 開發中,程序員需要學使用這些 API。
資料庫存儲在 data/< 項目文件夾 >/databases/ 下。 Android 開發中使用 SQLite 資料庫 Activites 可以通過 Content Provider 或者 Service 訪問一個資料庫。
創建資料庫 Android 不自動提供資料庫。在 Android 應用程序中使用 SQLite,必須自己創建資料庫,然後創建表、索引,填充數據。
Android 提供了 SQLiteOpenHelper 幫助你創建一個資料庫,你只要繼承 SQLiteOpenHelper 類,就可以輕松的創建資料庫。SQLiteOpenHelper 類根據開發應用程序的需要,封裝了創建和更新資料庫使用的邏輯。
SQLiteOpenHelper 的子類,至少需要實現三個方法:
1 構造函數,調用父類 SQLiteOpenHelper 的構造函數。這個方法需要四個參數:上下文環境(例如,一個 Activity),資料庫名字,一個可選的游標工廠(通常是 Null),一個代表你正在使用的資料庫模型版本的整數。
2 onCreate()方法,它需要一個 SQLiteDatabase 對象作為參數,根據需要對這個對象填充表和初始化數據。
3 onUpgrage() 方法,它需要三個參數,一個 SQLiteDatabase 對象,一個舊的版本號和一個新的版本號,這樣你就可以清楚如何把一個資料庫從舊的模型轉變到新的模型。
接下來討論具體如何創建表、插入數據、刪除表等等。調用 getReadableDatabase() 或 getWriteableDatabase() 方法,你可以得到 SQLiteDatabase 實例,具體調用那個方法,取決於你是否需要改變資料庫的內容:
update()方法有四個參數,分別是表名,表示列名和值的 ContentValues 對象,可選的 WHERE 條件和可選的填充 WHERE 語句的字元串,這些字元串會替換 WHERE 條件中的「?」標記。
update() 根據條件,更新指定列的值,所以用 execSQL() 方法可以達到同樣的目的。 WHERE 條件和其參數和用過的其他 SQL APIs 類似。
delete() 方法的使用和 update() 類似,使用表名,可選的 WHERE 條件和相應的填充 WHERE 條件的字元串。 查詢資料庫 類似 INSERT, UPDATE, DELETE,有兩種方法使用 SELECT 從 SQLite 資料庫檢索數據。
1 .使用 rawQuery() 直接調用 SELECT 語句; 使用 query() 方法構建一個查詢。
Raw Queries 正如 API 名字,rawQuery() 是最簡單的解決方法。通過這個方法你就可以調用 SQL SELECT 語句。
例如: Cursor c=db.rawQuery( 「SELECT name FROM sqlite_master WHERE type=』table』 AND name=』mytable』」, null);
在上面例子中,我們查詢 SQLite 系統表(sqlite_master)檢查 table 表是否存在。返回值是一個 cursor 對象,這個對象的方法可以迭代查詢結果。 如果查詢是動態的,使用這個方法就會非常復雜。
例如,當你需要查詢的列在程序編譯的時候不能確定,這時候使用 query() 方法會方便很多。
Regular Queries query() 方法用 SELECT 語句段構建查詢。SELECT 語句內容作為 query() 方法的參數,比如:要查詢的表名,要獲取的欄位名,WHERE 條件,包含可選的位置參數,去替代 WHERE 條件中位置參數的值,GROUP BY 條件,HAVING 條件。 除了表名,其他參數可以是 null。所以,以前的代碼段可以可寫成:
String[] columns={「ID」, 」inventory」};
Java代碼
String[] parms={"snicklefritz"}; Cursor result=db.query("widgets", columns, "name=?",parms, null, null, null);
使用游標
不管你如何執行查詢,都會返回一個 Cursor,這是 Android 的 SQLite 資料庫游標,
使用游標,你可以:
通過使用 getCount() 方法得到結果集中有多少記錄;
通過 moveToFirst(), moveToNext(), 和 isAfterLast() 方法遍歷所有記錄;
通過 getColumnNames() 得到欄位名;
通過 getColumnIndex() 轉換成欄位號;
通過 getString(),getInt() 等方法得到給定欄位當前記錄的值;
通過 requery() 方法重新執行查詢得到游標;
通過 close() 方法釋放游標資源;
在 Android 中使用 SQLite 資料庫管理工具 在其他資料庫上作開發,一般都使用工具來檢查和處理資料庫的內容,而不是僅僅使用資料庫的 API。
使用 Android 模擬器,有兩種可供選擇的方法來管理資料庫。
首先,模擬器綁定了 sqlite3 控制台程序,可以使用 adb shell 命令來調用他。只要你進入了模擬器的 shell,在資料庫的路徑執行 sqlite3 命令就可以了。
資料庫文件一般存放在: /data/data/your.app.package/databases/your-db-name 如果你喜歡使用更友好的工具,你可以把資料庫拷貝到你的開發機上,使用 SQLite-aware 客戶端來操作它。這樣的話,你在一個資料庫的拷貝上操作,如果你想要你的修改能反映到設備上,你需要把資料庫備份回去。
把資料庫從設備上考出來,你可以使用 adb pull 命令(或者在 IDE 上做相應操作)。
存儲一個修改過的資料庫到設備上,使用 adb push 命令。 一個最方便的 SQLite 客戶端是 FireFox SQLite Manager 擴展,它可以跨所有平台使用。
如果你想要開發 Android 應用程序,一定需要在 Android 上存儲數據,使用 SQLite 資料庫是一種非常好的選擇。
第五種: 網路存儲數據
前面介紹的幾種存儲都是將數據存儲在本地設備上,除此之外,還有一種存儲(獲取)數據的方式,通過網路來實現數據的存儲和獲取。
我們可以調用WebService返回的數據或是解析HTTP協議實現網路數據交互。
Ⅱ 安卓需要存一些參數信息、測量數據和計算結果,File和SQlite哪個好
使用SQLite方式存儲數據
在Android中一共提供了5種數據存儲方式,分別為:
(1)Files:通過FileInputStream和FileOutputStream對文件進行操作。具體使用方法可以參閱博文《Android學習筆記34:使用文件存儲數據》。
(2)Shared Preferences:常用來存儲鍵值對形式的數據,對系統配置信息進行保存。具體使用方法可以參閱博文《Android學習筆記35:使用Shared Preferences方式存儲數據》。
(3)Content Providers:數據共享,用於應用程序之間數據的訪問。
(4)SQLite:Android自帶的輕量級關系型資料庫,支持SQL語言,用來存儲大量的數據,並且能夠對數據進行使用、更新、維護等操作。
(5)Network:通過網路來存儲和獲取數據。
本篇博文介紹第四種方式,通過Android自帶的SQLite資料庫存儲數據。
1.SQLite簡介
SQLite是一款開源的、嵌入式關系型資料庫,第一個版本Alpha發布於2000年。SQLite在便攜性、易用性、緊湊性、高效性和可靠性方面有著突出的表現。
SQLite和C/S模式的資料庫軟體不同,它是一款嵌入式資料庫,沒有獨立運行的進程,與所服務的應用程序在應用程序進程空間內共生共存。它的代碼與應用程序代碼也是在一起的,或者說嵌入其中,作為託管它的程序的一部分。因此不存在資料庫的客戶端和伺服器,使用SQLite一般只需要帶上它的一個動態庫,就可以享受它的全部功能。
資料庫伺服器在程序中的好處是不需要網路配置或管理。將資料庫客戶端與伺服器運行在同一個進程中,可以省去不少的操作及麻煩:不用擔心防火牆或者地址解析;不用浪費時間管理復雜的授權和許可權;可以減少網路調用相關的消耗;可以簡化資料庫管理並使程序更容易部署。
SQLite資料庫通過資料庫級上的獨占性和共享鎖來實現獨立事務處理。這意味著多個進程可以在同一時間從同一資料庫讀取數據,但是只有一個可以寫入數據。在某個進程向資料庫執行寫操作之前,必須獲得獨占鎖定。在發出獨占鎖定後,其他的讀寫操作將不會再發生。
此外,SQLite資料庫中的所有信息(比如表、視圖、觸發器等)都包含在一個文件內,方便管理和維護。SQLite資料庫還支持大部分操作系統,除電腦上使用的操作系統之外,很多手機上使用的操作系統同樣可以運行。同時,SQLite資料庫還提供了多語言的編程介面,供開發者使用。
2.SQL基本命令
SQL是與關系型資料庫通信的唯一方式。它專注於信息處理,是為構建、讀取、寫入、排序、過濾、映射、分組、聚集和通常的管理信息而設計的聲明式語言。
在講解SQL基本命令之前,有必要先了解一下SQLite所支持的數據類型都有哪些。
2.1 SQLite支持的數據類型
SQLite採用動態數據存儲類型,會根據存入的值自動進行判斷。SQLite支持以下5種數據類型:
(1)NULL:空值
(2)INTEGER:帶符號的整型
(3)REAL:浮點型
(4)TEXT:字元串文本
(5)BLOB:二進制對象
2.2 SQL基本命令
表是探索SQLite中SQL的起點,也是關系型資料庫中信息的標准單位,所有的操作都是以表為中心的。那麼如何使用SQL命令創建一張表呢?
2.2.1創建表
表是由行和列組成的,列稱為欄位,行稱為記錄。
使用CREATE命令可以創建表,CREATE命令的一般格式為:
CREATE [TEMP/TEMPORARY] TABLE table_name (column_definitions [, constraints]);
其中,[]中的內容是可選的,用TEMP或TEMPORARY關鍵字聲明的表是臨時表,這種表只存活於當前會話,一旦連接斷開,就會被自動銷毀。如果沒有明確指出創建的表是臨時表,則創建的是基本表,將會在資料庫中持久存在,這也是資料庫中最常見的表。
CREATE TABLE命令至少需要一個表名和一個欄位名,上述命令中的table_name表示表名,表名必須與其他標識符不同。column_definitions由用逗號分隔的欄位列表組成,每個欄位定義包括一個名稱、一個域(類型)和一個逗號分隔的欄位約束。其中,域是指存儲在該列的信息的類型,約束用來控制什麼樣的值可以存儲在表中或特定的欄位中。
一條創建表的命令示例如下:
1 CREATE TABLE tab_student (studentId INTEGER PRIMARY KEY AUTOINCREMENT,
2 studentName VARCHAR(20),
3 studentAge INTEGER);
如上,我們創建了一個名為tab_student的表,該表包含3個欄位:studentId、 studentName和studentAge,其數據類型分別為:INTEGER、VARCHAR和INTEGER。
此外,通過使用關鍵字PRIMARY KEY,我們指定了欄位studentId所在的列是主鍵。主鍵確保了每一行記錄在某種方式上與表中的其他行記錄是不同的(唯一的),進而確保了表中的所有欄位都是可定址的。
SQLite為主鍵提供自增長功能,當定義欄位類型為INTEGER PRIMARY KEY時,SQLite將為該欄位創建默認值,該默認值確保整數值是唯一的。SQLite使用64-bit單符號整數主鍵,因此,該欄位的最大值是9,223,372,036,854,775,807。當達到最大值時,SQLite會自動搜索該欄位還未使用的值,並作為要插入的值。從表中刪除記錄時,rowid可能被回收並在後面的插入中使用。因此,新創建的rowid不一定是按照嚴格順序增長的。如果想要SQLite使用唯一的自動主鍵值,而不是填補空白,可以在主鍵定義INTEGER PRIMARY KEY中加入關鍵字AUTOINCREMENT。AUTOINCREMENT關鍵字阻止rowid回收,它將為新插入的記錄產生新的(不是回收的)rowid。
2.2.2插入記錄
使用INSERT命令可以一次插入一條記錄,INSERT命令的一般格式為:
INSERT INTO tab_name (column_list) VALUES (value_list);
其中,tab_name指明將數據插入到哪個表中,column_list是用逗號分隔的欄位名稱,這些欄位必須是表中存在的,value_list是用逗號分隔的值列表,這些值是與column_list中的欄位一一對應的。
比如,向剛才創建的tab_student表中插入一條記錄,便可以使用如下的語句完成:
INSERT INTO tab_student (studentId, studentName, studentAge) VALUES (1, 「jack」, 23);
通過以上的語句,便插入了一條studentName=」jack」, studentAge=」23」的記錄,該記錄的主鍵為studentId=1。
2.2.3更新記錄
使用UPDATE命令可以更新表中的記錄,該命令可以修改一個表中一行或者多行中的一個或多個欄位。UPDATE命令的一般格式為:
UPDATE tab_name SET update_list WHERE predicate;
其中,update_list是一個或多個欄位賦值的列表,欄位賦值的格式為column_name=value。WHERE子句使用斷言識別要修改的行,然後將更新列應用到這些行。
比如,要更新剛才插入到tab_student表中的記錄,便可以使用如下的語句完成:
UPDATE tab_student SET studentName=」tom」, studentAge=」25」 WHERE studentId=1;
通過以上的語句,便可以將剛才插入的主鍵為studentId=1的記錄更新為studentName=」tom」, studentAge=」25」了。
2.2.4刪除記錄
使用DELETE命令可以刪除表中的記錄,DELETE命令的一般格式為:
DELETE FROM table_name WHERE predicate;
其中,table_name指明所要刪除的記錄位於哪個表中。和UPDATE命令一樣,WHERE子句使用斷言識別要刪除的行。
比如,要刪除剛才插入的記錄,便可以使用如下的語句完成:
DELETE FROM tab_student WHERE studentId=1;
2.2.5查詢記錄
SELECT命令是查詢資料庫的唯一命令。SELECT命令也是SQL命令中最大、最復雜的命令。
SELECT命令的通用形式如下:
SELECT [distinct] heading
FROM tables
WHERE predicate
GROUP BY columns
HAVING predicate
ORDER BY columns
LIMIT count,offset;
其中,每個關鍵字(如FROM、WHERE、HAVING等)都是一個單獨的子句,每個子句由關鍵字和跟隨的參數構成。GROUP BY和HAVING一起工作可以對GROUP BY進行約束。ORDER BY使記錄集在返回之前按一個或多個欄位的值進行排序,可以指定排序方式為ASC(默認的升序)或DESC(降序)。此外,還可以使用LIMIT限定結果集的大小和范圍,count指定返回記錄的最大數量,offset指定偏移的記錄數。
在上述的SELECT命令通用形式中,除了SELECT之外,所有的子句都是可選的。目前最常用的SELECT命令由三個子句組成:SELECT、FROM、WHERE,其基本語法形式如下:
SELECT heading FROM tables WHERE predicate;
比如,要查詢剛才插入的記錄,便可以使用如下的語句完成:
SELECT studentId, studentName, studentAge FROM tab_student WHERE studentId=1;
至此,我們介紹了SQL中最基本和最常用的CREATE、INSERT、UPDATE、DELETE和SELECT命令。當然了,這里只是對其進行了簡單的介紹,有關SQLite中SQL命令的詳細使用方法,可以參閱《SQLite權威指南》一書的第三章和第四章。
3.資料庫操作輔助類SQLiteOpenHelper
Android提供了一個重要的類SQLiteOpenHelper,用於輔助用戶對SQLite資料庫進行操作。
SQLiteOpenHelper的構造函數原型如下:
public SQLiteOpenHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version);
其中,參數context表示應用程序運行的環境,包含應用程序所需的共享資源。參數name表示Android的資料庫名字。參數factory是SQLiteDatabase.CursorFactory類對象,用於存儲查詢Android SQLite資料庫的結果集。參數version表示應用程序所用的資料庫的版本,該版本並非SQLite的真正版本,而是指定應用程序中的SQLite資料庫的版本,當該版本號發生變化時,將會觸發SQLiteOpenHelper類中的onUpgrade()或onDowngrade()方法。
SQLiteOpenHelper類的所有方法如圖1所示。
圖1 SQLiteOpenHelper類的方法
其中,close()方法用於關閉SQLiteOpenHelper對象中的SQLite資料庫;getReadableDatabase()方法和getWriteableDatabase()方法類似,getReadableDatabase()方法以只讀狀態打開SQLiteOpenHelper對象中指定的SQLite資料庫,任何想要修改資料庫的操作都是不允許的;getWriteableDatabase()方法也是打開資料庫,但是允許資料庫正常的讀/寫操作;在一個不存在的資料庫上調用任何方法時,都會隱式的調用SQLiteOpenHelper對象的onCreate()方法;當應用程序第一次訪問資料庫時,則會調用onOpen()方法,但是,如果版本號發生了變化的話,則會調用onUpgrade()或onDowngrade()方法。
4.資料庫類SQLiteDatabase
SQLiteDatabase類用來完成對資料庫的操作任務,比如表的選擇、插入、更新和刪除語句等。
SQLiteDatabase類中常用的用於執行SQL語句的方法有以下一些。
(1)execSQL()方法:
public void execSQL (String sql);
public void execSQL (String sql, Object[] bindArgs);
(2)query()方法:
public Cursor query (String table, String[] columns, String selection, String[] selectionArgs, String
groupBy, String having,String orderBy, String limit);
public Cursor query (boolean distinct, String table, String[] columns, String selection, String[] selectionArgs, String
groupBy, String having, String orderBy, String limit, CancellationSignal cancellationSignal);
public Cursor query (String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String
having,String orderBy);
public Cursor query (boolean distinct, String table, String[] columns, String selection, String[] selectionArgs, String
groupBy, String having, String orderBy, String limit);
(3)queryWithFactory()方法:
public Cursor queryWithFactory (SQLiteDatabase.CursorFactory cursorFactory, boolean distinct, String table, String[]columns, String selection, String[] selectionArgs, String groupBy, String having, String
orderBy, String limit,CancellationSignal cancellationSignal);
public Cursor queryWithFactory (SQLiteDatabase.CursorFactory cursorFactory, boolean distinct, String table, String[]columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy, String limit);
(4)rawQuery()方法:
public Cursor rawQuery (String sql, String[] selectionArgs, CancellationSignal cancellationSignal);
public Cursor rawQuery (String sql, String[] selectionArgs);
(5)rawQueryWithFactory()方法:
public Cursor rawQueryWithFactory (SQLiteDatabase.CursorFactory cursorFactory, String sql, String[]
selectionArgs,String editTable);
public Cursor rawQueryWithFactory (SQLiteDatabase.CursorFactory cursorFactory, String sql, String[]
selectionArgs,String editTable, CancellationSignal cancellationSignal);
其中,execSQL()方法都有一個參數sql,這個參數是一個SQL語句。第二個參數bindArgs接收一個數組,數組中的每個成員捆綁了一個查詢。execSQL()方法用於運行那些沒有返回值的查詢語句,比如創建、插入、更新和修改表。
query()方法和queryWithFactory()方法是在資料庫中運行一些輕量級的單查詢語句,參數包括table、columns、groupBy、having、orderBy、limit等SQL語句關鍵字。這些方法允許將SQL語句傳遞給相關方法,而不必直接使用SQL語句。
rawQuery()方法和rawQueryWithFactory()方法也都有一個參數sql,用於執行SQL查詢語句,返回值是Cursor對象。這兩個方法都有一個版本能夠接收一個字元串數組selectionArgs作為參數,通過這個參數,SQLiteDatabase對象將把捆綁的SQL語句中的問號(?)用這個數組中的值代替,並按照一一對應的位置關系進行取代。
SQLiteDatabase類提供了大約50個方法,除此之外還有一些用於打開資料庫的方法(如openDatabase()、openOrCreateDatabase()等),用於管理SQLite事務的方法(如beginTransaction()、endTransaction()等),用於測試資料庫是否被鎖住的方法(如isDbLockedByCurrentThread()、isDbLockedByOtherThread()等),以及獲取資料庫基本信息的方法(如getMaximumSiza()、getVersion()等)。這里就不一一介紹了,具體可以參閱SQLiteDatabase類的API幫助文檔。
5.游標類Cursor
在Android中,查詢數據是通過Cursor類來實現的,當我們使用SQLiteDatabase.query()或SQLiteDatabase.rawQuery()方法時,會得到一個Cursor對象,Cursor指向的就是每一條記錄,它提供了很多有關查詢的方法,如圖2所示。
http://www.cnblogs.com/menlsh/archive/2013/04/13/3019588.html
Ⅲ Android 中資料庫查詢方法query() 中的selectionArgs 參數只能在編譯之前確定,這怎麼實現動態查詢
你把這參數用一個變數代替唄,用的時候把想查詢的東西賦給這個變數,這不久動態了
Ⅳ android 如何連接資料庫
這種方式通常連接一個外部的資料庫,第一個參數就是資料庫文件,這個資料庫不是當前項目中生成的,通常放在項目的Assets目錄下,當然也可以在手機內,如上面參數那個目錄,前提是那個文件存在且你的程序有訪問許可權。
另一種使用資料庫的方式是,自己創建資料庫並創建相應的資料庫表,參考下面的代碼:
public class DatabaseHelper extends SQLiteOpenHelper {
//構造,調用父類構造,資料庫名字,版本號(傳入更大的版本號可以讓資料庫升級,onUpgrade被調用)
public DatabaseHelper(Context context) {
super(context, DatabaseConstant.DATABASE_NAME, null, DatabaseConstant.DATABASE_VERSION);
}
//資料庫創建時調用,裡面執行表創建語句.
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(createVoucherTable());
}
//資料庫升級時調用,先刪除舊表,在調用onCreate創建表.
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("DROP TABLE IF EXISTS " + DatabaseConstant.TABLE_NAME);
onCreate(db);
}
//生成 創建表的SQL語句
private String createVoucherTable() {
StringBuffer sb = new StringBuffer();
sb.append(" CREATE TABLE ").append(DatabaseConstant.TABLE_NAME).append("( ").append(「ID」)
.append(" TEXT PRIMARY KEY, ")
.append(「USER_ID」).append(" INTEGER, ").append(「SMS_CONTENT」).append(" TEXT ) ");
return sb.toString();
}
} 繼承SQLiteOpenHelper並實現裡面的方法.
之後:
//得到資料庫助手類
helper
=
new
DatabaseHelper(context);
//通過助手類,打開一個可讀寫的資料庫連接
SQLiteDatabase
database
=
helper.getReadableDatabase();
//查詢表中所有記錄
database.query(DatabaseConstant.TABLE_NAME,
null,
null,
null,
null,
null,
null);
Ⅳ 在Android開發中 DatabaseHelper dbHelper = new DatabaseHelper()里方框的這個參數是什麼來的 求詳解
第一個參數是Context context
第二個參數是String name,即資料庫的名字,例如private static final String DATABASE_NAME = "contacts2.db";
這樣app會在/data/data/package包名下,生成相應的名字的資料庫文件
Ⅵ Android里的Activity之間如何傳資料庫對象參數
Android中Intent中如何傳遞對象,有兩種方法,一種是 Bundle.putSerializable(Key,Object);另一種是Bundle.putParcelable(Key, Object);當然這些Object是有一定的條件的,前者是實現了Serializable介面,而後者是實現了Parcelable介面。
還有一個歪招:使用一個單例模式的類。只產生一個對象。
Ⅶ Android資料庫SQLiteDatabase的update方法,whereClause參數怎麼添加多個條件
1. ACID事務
2. 零配置 – 無需安裝和管理配置
3.儲存在單一磁碟文件中的一個完整的資料庫
4.資料庫文件可以在不同位元組順序的機器間自由的共享
5.支持資料庫大小至2TB
6. 足夠小, 大致13萬行C代碼, 4.43M
7. 比一些流行的資料庫在大部分普通資料庫操作要快
8. 簡單, 輕松的API
9. 包含TCL綁定, 同時通過Wrapper支持其他語言的綁定
10. 良好注釋的源代碼, 並且有著90%以上的測試覆蓋率
11. 獨立: 沒有額外依賴
12. 源碼完全的開源, 你可以用於任何用途, 包括出售它
13. 支持多種開發語言,C, C++, PHP, Perl, Java, C#,Python, Ruby等
SQLite雖然很小巧,但是支持的SQL語句不會遜色於其他開源資料庫,它支持的SQL包括:
ATTACH DATABASE
BEGIN TRANSACTION
comment
COMMIT TRANSACTION
COPY
CREATE INDEX
CREATE TABLE
CREATE TRIGGER
CREATE VIEW
DELETE
DETACH DATABASE
DROP INDEX
DROP TABLE
DROP TRIGGER
DROP VIEW
END TRANSACTION
EXPLAIN
expression
INSERT
ON CONFLICT clause
PRAGMA
REPLACE
ROLLBACK TRANSACTION
SELECT
UPDATE
同時它還支持事務處理功能等等。也有人說它象Microsoft的Access,有時候真的覺得有點象,但是事實上它們區別很大。比如SQLite 支持跨平台,操作簡單,能夠使用很多語言直接創建資料庫,而不象Access一樣需要Office的支持。如果你是個很小型的應用,或者你想做嵌入式開發,沒有合適的資料庫系統,那麼你可以考慮使用SQLite。到2013年10月17日最新版本是 3.8.1 。能在上面獲得源代碼和文檔。同時因為資料庫結構簡單,系統源代碼也不是很多,也適合想研究資料庫系統開發的專業人士.
Ⅷ android 怎麼查看資料庫中的數據
android是有自帶的類庫的:sqliteopenhelper,使用的時候繼承這個類,然後寫邏輯就可以,一般使用單例模式:
public
synchronized
static
dbhelper
getdbhelper(context
context)
{
if
(helper
==
null)
{
helper
=
new
dbhelper(context);
}
return
helper;
}
private
dbhelper(context
context)
{
super(context,
"自己的資料庫名",
null,
資料庫版本);
}
使用的時候也很簡單,下面是一個刪除操作:
public
synchronized
void
deletesite(string
packname)
{
sqlitedatabase
db
=
getwritabledatabase();
try
{
db.begintransaction();
db.delete("site",
"packname=?",
new
string[]
{
packname
});
db.settransactionsuccessful();
}
finally
{
db.endtransaction();
if
(db
!=
null)
{
}
}
}
Ⅸ android 怎麼往資料庫裡面添加數據
一、引入
資料庫創建的問題解決了,接下來就該使用資料庫實現應用程序功能的時候了。基
本的操作包括創建、讀取、更新、刪除,即我們通常說的 CRUD(Create, Read, Update, Delete)。
在實現這些操作的時候,我們會使用到兩個比較重要的類 SQLiteDatabase 類和 Cursor 類。
二、創建表
1,execSQL(String sql):執行一條 sql 語句,且執行操作不能為 SELECT
因為它的返回值為 void,所以推薦使用 insert、update 方法等
2.,execSQL (String sql,Object[] bindArgs)
sql:執行一條 sql 語句
bindArgs:為 sql 語句中的?賦值
三、添加數據
1、execSQL(String sql)
2、使用對象的 insert 方法
ContentValues values = new ContentValues();
values.put(USERNAME, user.getUsername());
values.put(PASSWORD, user.getPassword());
db.insert(TABLE_NAME, null, values);
參數:
table:資料庫中的表名
nullColumnHack:指定默認插入欄位,為 null 時能插入數據
values:表示插入欄位所對應的值,使用 put 方法。
四、刪除數據
1、execSQL(String sql)
2、使用對象的 delete 方法
String whereClaues="_id=?";
String [] whereArgs={String.valueOf(id)};
//db.delete(TABLE_NAME, "_id="+id, null);
db.delete(TABLE_NAME, whereClaues, whereArgs);
參數
table:資料庫的表名
whereClause:where 子句,比如:_id=?
whereArgs:where 子句中?的值
五、修改數據
1、execSQL(String sql)
2、使用對象的 delete 方法
ContentValues values = new ContentValues();
values.put(USERNAME, user.getUsername());
values.put(PASSWORD, user.getPassword());
String whereClaues="_id=?";
String [] whereArgs={String.valueOf(user.getId())};
db.update(TABLE_NAME, values, whereClaues, whereArgs);
參數
table:資料庫的表名
values:代表要修改的值,修改方法還是 put(key,values)
whereClause:條件子句,比如 id=?,name=?
whereArgs:為 whereClause 中的?賦值,比如:new String[]{"1","張三"}
圖:
參考代碼:
程序內使用SQLite資料庫是通過SQLiteOpenHelper進行操作
1.自己寫個類繼承SQLiteOpenHelper,重寫以下3個方法
publicvoidonCreate(SQLiteDatabasedb)
{//創建資料庫時的操作,如建表}
publicvoidonUpgrade(SQLiteDatabasedb,intoldVersion,intnewVersion)
{
//版本更新的操作
}
2.通過SQLiteOpenHelper的getWritableDatabase()獲得一個SQLiteDatabase資料庫,以後的操作都是對SQLiteDatabase進行操作。
3.對得到的SQLiteDatabase對象進行增,改,刪,查等操作。
代碼
packagecx.myNote;
importandroid.content.ContentValues;
importandroid.content.Context;
importandroid.content.Intent;
importandroid.database.Cursor;
importandroid.database.sqlite.SQLiteDatabase;
importandroid.database.sqlite.SQLiteOpenHelper;
//DBOptionsforlogin
publicclassDBOptions{
privatestaticfinalStringDB_NAME="notes.db";
privatestaticfinalStringDB_CREATE="createtablelogininf(nametext,pwdtext)";
{
publicDBHelper(Contextcontext){
super(context,DB_NAME,null,1);
}
@Override
publicvoidonCreate(SQLiteDatabasedb){
//TODOAuto-generatedmethodstub
//建表
db.execSQL(DB_CREATE);
}
@Override
publicvoidonUpgrade(SQLiteDatabasedb,intoldVersion,intnewVersion){
//TODOAuto-generatedmethodstub
db.execSQL("droptableifexistslogininf");
onCreate(db);
}
}
privateContextcontext;
privateSQLiteDatabasedb;
privateDBHelperdbHelper;
publicDBOptions(Contextcontext)
{
this.context=context;
dbHelper=newDBHelper(context);
db=dbHelper.getReadableDatabase();
}
//自己寫的方法,對資料庫進行操作
publicStringgetName()
{
Cursorcursor=db.rawQuery("selectnamefromlogininf",null);
cursor.moveToFirst();
returncursor.getString(0);
}
publicintchangePWD(StringoldP,Stringpwd)
{
ContentValuesvalues=newContentValues();
values.put("pwd",pwd);
returndb.update("logininf",values,"pwd="+oldP,null);
}
}
insert方法插入的一行記錄使用ContentValus存放,ContentValues類似於Map,它提供了put(String key, Xxx value)(其中key為數據列的列名)方法用於存入數據、getAsXxxx(String key)方法用於取出數據
Ⅹ android中怎麼在broadcastreceiver中訪問資料庫構造函數的第一個參數應該怎麼寫
public class musicReceiver extends BroadcastReceiver {
public void onReceive(Context context, Intent intent) {
if ("test.android.broadcast".equals(intent.getAction())) {
mSqliteDatabaseTG = SQLiteDatabase.openOrCreateDatabase (PATH2+DATABASENAME3,null);
Cursor cur = mSqliteDatabaseTG.rawQuery("select * from table", null);
......
}
}
}