乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      android中的數(shù)據(jù)庫(kù)操作

       香山早秋 2012-02-14
       

      android中的數(shù)據(jù)庫(kù)操作  

      2011-06-22 16:06:27|  分類: android |字號(hào) 訂閱

      android中的數(shù)據(jù)庫(kù)操作

            android中的應(yīng)用開(kāi)發(fā)很難避免不去使用數(shù)據(jù)庫(kù),這次就和大家聊聊android中的數(shù)據(jù)庫(kù)操作。

       

      一、android內(nèi)的數(shù)據(jù)庫(kù)的基礎(chǔ)知識(shí)介紹

       

             1.用了什么數(shù)據(jù)庫(kù)


                  android中采用的數(shù)據(jù)庫(kù)是SQLite這個(gè)輕量級(jí)的嵌入式開(kāi)源數(shù)據(jù)庫(kù),它是用c語(yǔ)言構(gòu)建的。相關(guān)簡(jiǎn)介可以從鏈接查看。

       

             2.數(shù)據(jù)庫(kù)基本知識(shí)觀花


                  對(duì)于一些和我一樣還沒(méi)有真正系統(tǒng)學(xué)習(xí)數(shù)據(jù)庫(kù)技術(shù)的同學(xué)來(lái)說(shuō),把SQL92標(biāo)準(zhǔn)中的一些基本概念、基本語(yǔ)句快速的了解一下,是很有必要的,這樣待會(huì)用Android的database相關(guān)方法去執(zhí)行一些數(shù)據(jù)庫(kù)語(yǔ)句時(shí)就不會(huì)茫然了。

       

             ①數(shù)據(jù)庫(kù)的基本結(jié)構(gòu)——表格

       

             表格是數(shù)據(jù)庫(kù)中儲(chǔ)存資料的基本架構(gòu)。表格被分為欄位 (column) 及列位 (row)。每一列代表一筆資料,而每一欄代表一筆資料的一部份。舉例來(lái)說(shuō),如果我們有一個(gè)記載顧客資料的表格,那欄位就有可能包括姓、名、地址、城市、 國(guó)家、生日...等等。每一個(gè)表格擁有一個(gè)獨(dú)一無(wú)二的名字(Table Name)以便能夠讓用戶定位到它上面。一個(gè)典型的表格結(jié)構(gòu)如下:

       

         Store_Information 表格

      store_name Sales Date
      Los Angeles $1500 Jan-05-1999
      San Diego $250 Jan-07-1999
      Los Angeles $300 Jan-08-1999
      Boston $700 Jan-08-1999
       該表格的表格名字為Store_Information,一共有三個(gè)欄位,分別為store_name , Sales , Data ,已經(jīng)錄入了四筆數(shù)據(jù)所以有四個(gè)列位。

       

             ②關(guān)于數(shù)據(jù)類型

       

             和其他的數(shù)據(jù)庫(kù)不同的是,sqlite是無(wú)類型的。也就是當(dāng)你創(chuàng)建一個(gè)表格時(shí),無(wú)需對(duì)每一個(gè)欄位要存儲(chǔ)的數(shù)據(jù)的類型進(jìn)行聲明,當(dāng)你在給表格增加數(shù)據(jù)條目時(shí),sqlite會(huì)自動(dòng)找到存入的數(shù)據(jù)的類型。

       

             SQLite允許忽略數(shù)據(jù)類型,但是,仍然建議在Create Table語(yǔ)句中指定數(shù)據(jù)類型,因?yàn)閿?shù)據(jù)類型有利于增強(qiáng)程序的可讀性。SQLite支持常見(jiàn)的數(shù)據(jù)類型,如VARCHAR、NVARCHAR、TEXT、 INTEGER、FLOAT、BOOLEAN、CLOB、BLOB、TIMESTAMP、NUMERIC、VARYING、CHARACTER、 NATl0NAI, VARYINGCHARACTER。這些數(shù)據(jù)類型都是SQL92標(biāo)準(zhǔn)中規(guī)定的標(biāo)準(zhǔn)數(shù)據(jù)庫(kù)數(shù)據(jù)類型,想要有更近一步了解,請(qǐng)參看下表。

       

      SQL數(shù)據(jù)庫(kù)數(shù)據(jù)類型詳解

      數(shù)據(jù)類型
      類型
      描             述
      bit
      整型
      bit 數(shù)據(jù)類型是整型,其值只能是0、1或空值。這種數(shù)據(jù)類型用于存儲(chǔ)只有兩種可能值的數(shù)據(jù),如Yes 或No、True 或Fa lse 、On 或Off
      int
      整型
      int 數(shù)據(jù)類型可以存儲(chǔ)從- 231(-2147483648)到231 (2147483 647)之間的整數(shù)。存儲(chǔ)到數(shù)據(jù)庫(kù)的幾乎所有數(shù)值型的數(shù)據(jù)都可以用這種數(shù)據(jù)類型。這種數(shù)據(jù)類型在數(shù)據(jù)庫(kù)里占用4個(gè)字節(jié)
      smallint
      整型
      smallint 數(shù)據(jù)類型可以存儲(chǔ)從- 215(-32768)到215(32767)之間的整數(shù)。這種數(shù)據(jù)類型對(duì)存儲(chǔ)一些常限定在特定范圍內(nèi)的數(shù)值型數(shù)據(jù)非常有用。這種數(shù)據(jù)類型在數(shù)據(jù)庫(kù)里占用2 字節(jié)空間
      tinyint
      整型
      tinyint 數(shù)據(jù)類型能存儲(chǔ)從0到255 之間的整數(shù)。它在你只打算存儲(chǔ)有限數(shù)目的數(shù)值時(shí)很有用。 這種數(shù)據(jù)類型在數(shù)據(jù)庫(kù)中占用1 個(gè)字節(jié)
      numeric
      精確數(shù)值型
      numeric數(shù)據(jù)類型與decimal 型相同
      decimal
      精確數(shù)值型
      decimal 數(shù)據(jù)類型能用來(lái)存儲(chǔ)從-1038-1到1038-1的固定精度和范圍的數(shù)值型數(shù)據(jù)。使用這種數(shù)據(jù)類型時(shí),必須指定范圍和精度。 范圍是小數(shù)點(diǎn)左右所能存儲(chǔ)的數(shù)字的總位數(shù)。精度是小數(shù)點(diǎn)右邊存儲(chǔ)的數(shù)字的位數(shù)
      money
      貨幣型
      money 數(shù)據(jù)類型用來(lái)表示錢和貨幣值。這種數(shù)據(jù)類型能存儲(chǔ)從-9220億到9220 億之間的數(shù)據(jù),精確到貨幣單位的萬(wàn)分之一
      smallmoney
      貨幣型
      smallmoney 數(shù)據(jù)類型用來(lái)表示錢和貨幣值。這種數(shù)據(jù)類型能存儲(chǔ)從-214748.3648 到214748.3647 之間的數(shù)據(jù),精確到貨幣單位的萬(wàn)分之一
      float
      近似數(shù)值型
      float 數(shù)據(jù)類型是一種近似數(shù)值類型,供浮點(diǎn)數(shù)使用。說(shuō)浮點(diǎn)數(shù)是近似的,是因?yàn)樵谄浞秶鷥?nèi)不是所有的數(shù)都能精確表示。浮點(diǎn)數(shù)可以是從-1.79E+308到1.79E+308 之間的任意數(shù)
      real
      近似數(shù)值型
      real 數(shù)據(jù)類型像浮點(diǎn)數(shù)一樣,是近似數(shù)值類型。它可以表示數(shù)值在-3.40E+38到3.40E+38之間的浮點(diǎn)數(shù)
      datetime
      日期時(shí)間型
      datetime數(shù)據(jù)類型用來(lái)表示日期和時(shí)間。這種數(shù)據(jù)類型存儲(chǔ)從1753年1月1日到9999年12月3 1日間所有的日期和時(shí)間數(shù)據(jù), 精確到三百分之一秒或3.33毫秒
      Smalldatetime
      日期時(shí)間型
      smalldatetime 數(shù)據(jù)類型用來(lái)表示從1900年1月1日到2079年6月6日間的日期和時(shí)間,精確到一分鐘
      cursor
      特殊數(shù)據(jù)型
      cursor 數(shù)據(jù)類型是一種特殊的數(shù)據(jù)類型,它包含一個(gè)對(duì)游標(biāo)的引用。這種數(shù)據(jù)類型用在存儲(chǔ)過(guò)程中,而且創(chuàng)建表時(shí)不能用
      timestamp
      特殊數(shù)據(jù)型
      timestamp 數(shù)據(jù)類型是一種特殊的數(shù)據(jù)類型,用來(lái)創(chuàng)建一個(gè)數(shù)據(jù)庫(kù)范圍內(nèi)的唯一數(shù)碼。 一個(gè)表中只能有一個(gè)timestamp列。每次插入或修改一行時(shí),timestamp列的值都會(huì)改變。盡管它的名字中有“time”, 但timestamp列不是人們可識(shí)別的日期。在一個(gè)數(shù)據(jù)庫(kù)里,timestamp值是唯一的
      Uniqueidentifier
      特殊數(shù)據(jù)型
      Uniqueidentifier數(shù)據(jù)類型用來(lái)存儲(chǔ)一個(gè)全局唯一標(biāo)識(shí)符,即GUID。GUID確實(shí)是全局唯一的。這個(gè)數(shù)幾乎沒(méi)有機(jī)會(huì)在另一個(gè)系統(tǒng)中被重建。可以使用NEWID 函數(shù)或轉(zhuǎn)換一個(gè)字符串為唯一標(biāo)識(shí)符來(lái)初始化具有唯一標(biāo)識(shí)符的列
      char
      字符型
      char 數(shù)據(jù)類型用來(lái)存儲(chǔ)指定長(zhǎng) 度的定長(zhǎng)非統(tǒng)一編碼型的數(shù)據(jù)。當(dāng)定義一列為此類型時(shí),你必須指定列長(zhǎng)。當(dāng)你總能知道要存儲(chǔ)的數(shù)據(jù)的長(zhǎng)度時(shí),此數(shù)據(jù)類型很有用。例如,當(dāng)你按郵政編碼加4個(gè) 字符格式來(lái)存儲(chǔ)數(shù)據(jù)時(shí),你知道總要用到10個(gè)字符。此數(shù)據(jù)類型的列寬最大為8000 個(gè)字符
      varchar
      字符型
      varchar數(shù)據(jù)類型,同char類型一樣,用來(lái)存儲(chǔ)非統(tǒng)一編碼型字符數(shù)據(jù)。與char 型不一樣,此數(shù)據(jù)類型為變長(zhǎng)。當(dāng)定義一列為該數(shù)據(jù)類型時(shí),你要指定該列的最大長(zhǎng)度。 它與char數(shù)據(jù)類型最大的區(qū)別是,存儲(chǔ)的長(zhǎng)度不是列長(zhǎng),而是數(shù)據(jù)的長(zhǎng)度
      text
      字符型
      text 數(shù)據(jù)類型用來(lái)存儲(chǔ)大量的非統(tǒng)一編碼型字符數(shù)據(jù)。這種數(shù)據(jù)類型最多可以有231-1或20億個(gè)字符
      nchar
      統(tǒng)一編碼字符型
      nchar 數(shù)據(jù)類型用來(lái)存儲(chǔ)定長(zhǎng)統(tǒng)一編碼字符型數(shù)據(jù)。統(tǒng)一編碼用雙字節(jié)結(jié)構(gòu)來(lái)存儲(chǔ)每個(gè)字符,而不是用單字節(jié)(普通文本中的情況)。它允許大量的擴(kuò)展字符。此數(shù)據(jù)類型能存儲(chǔ)4000種字符,使用的字節(jié)空間上增加了一倍
      nvarchar
      統(tǒng)一編碼字符型
      nvarchar 數(shù)據(jù)類型用作變長(zhǎng)的統(tǒng)一編碼字符型數(shù)據(jù)。此數(shù)據(jù)類型能存儲(chǔ)4000種字符,使用的字節(jié)空間增加了一倍
      ntext
      統(tǒng)一編碼字符型
      ntext 數(shù)據(jù)類型用來(lái)存儲(chǔ)大量的統(tǒng)一編碼字符型數(shù)據(jù)。這種數(shù)據(jù)類型能存儲(chǔ)230 -1或?qū)⒔?0億個(gè)字符,且使用的字節(jié)空間增加了一倍
      binary
      二進(jìn)制數(shù)據(jù)類型
      binary數(shù)據(jù)類型用來(lái)存儲(chǔ)可達(dá)8000 字節(jié)長(zhǎng)的定長(zhǎng)的二進(jìn)制數(shù)據(jù)。當(dāng)輸入表的內(nèi)容接近相同的長(zhǎng)度時(shí),你應(yīng)該使用這種數(shù)據(jù)類型
      varbinary
      二進(jìn)制數(shù)據(jù)類型
      varbinary 數(shù)據(jù)類型用來(lái)存儲(chǔ)可達(dá)8000 字節(jié)長(zhǎng)的變長(zhǎng)的二進(jìn)制數(shù)據(jù)。當(dāng)輸入表的內(nèi)容大小可變時(shí),你應(yīng)該使用這種數(shù)據(jù)類型
      image
      二進(jìn)制數(shù)據(jù)類型
      image 數(shù)據(jù)類型用來(lái)存儲(chǔ)變長(zhǎng)的二進(jìn)制數(shù)據(jù),最大可達(dá)231-1或大約20億字節(jié)

       

      你或許已經(jīng)在納悶了,為什么之前的數(shù)據(jù)類型是大寫的,而到了這個(gè)表格就變成了小寫的。其實(shí)這是sqlite的一個(gè)不得不提的特性:sqlite是大小寫不敏感的!這一特性對(duì)于很多c語(yǔ)言fans來(lái)說(shuō)是很不習(xí)慣的。

       

              ③數(shù)據(jù)庫(kù)的基本操作語(yǔ)句


             其實(shí)這個(gè)還是SQL92標(biāo)準(zhǔn)中的一部分,只是不同的數(shù)據(jù)庫(kù)會(huì)有一點(diǎn)點(diǎn)的不同而已,下面就對(duì)在android中最常用的幾個(gè)操作語(yǔ)句給以概述,詳細(xì)介紹請(qǐng)參看SQL語(yǔ)句簡(jiǎn)單介紹。

       

      (1)CREATE TABLE

             由于創(chuàng)建一個(gè)表格,基本使用語(yǔ)法結(jié)構(gòu)是:

      CREATE TABLE "表格名" ("欄位1" 保存資料類型 , "欄位3"  保存資料類型  , "欄位2" 保存資料類型 .....);

             例如我要?jiǎng)?chuàng)建剛才的Store_Information表格,就可以這樣:

      CREATE TABLE  Store_Information (Store_Name char[50] , Sales long , Date date );  

             需要提示的是,這里還是聲明了數(shù)據(jù)類型。而且不難發(fā)現(xiàn),c語(yǔ)言構(gòu)建的sqlite自身也有一些c語(yǔ)言的性格(例如一個(gè)完整語(yǔ)句后的分號(hào))。

       

       

      (2)SELECT

      用于將資料從數(shù)據(jù)庫(kù)中的表格內(nèi)選出,基本語(yǔ)法結(jié)構(gòu)為:

      SELECT "欄位名" FROM "表格名" ;

      例如我想將 Store_Information 里面的store_name 選出,則可以這樣:

      SELECT store_name FROM Store_Information ;

       

      這句執(zhí)行后就會(huì)顯示如下的信息:

       

       

      store_name
      Los Angeles
      San Diego
      Los Angeles
      Boston

      好了,效果一目了然。

      (3)SELECT語(yǔ)句可以添加條件來(lái)縮小選擇結(jié)果:

      去掉重復(fù)的結(jié)果:

      SELECT DISTINCT "欄位名" FROM "表格名" 

      例如將剛才的語(yǔ)句改為:

      SELECT DISTINCT store_name FROM Store_Information ;

       

      則顯示的結(jié)果為:


      store_name

      Los Angeles
      San Diego
      Boston

       

      實(shí)現(xiàn)有條件的篩選:

       

      SELECT "欄位名" FROM "表格名" WHERE "條件語(yǔ)句" ;

       

      條件語(yǔ)句和c語(yǔ)言中的類似,只不過(guò)用AND表示“且”,OR表示“或”。

       

      例如對(duì)表執(zhí)行如下語(yǔ)句:

       

      SELECT store_name FROM Store_Information WHERE Sales > 1000 ;

       

      則顯示結(jié)果為:

       

      store_name

      Los Angeles

       

      其中WHERE語(yǔ)句用的較多,因?yàn)樗梢詫?shí)現(xiàn)自定義條件的使用和多條件的組合。

       

      (4)INSERT INTO

       

      在表格中加入資料——可以實(shí)現(xiàn)一筆的加入和多筆的加入。

       

      加入一筆:

      INSERT INTO "表格名" ("欄位1", "欄位2", ...) VALUES ("值1", "值2", ...);


      加入多筆:

      INSERT INTO "待加入數(shù)據(jù)的表格" ("欄位1", "欄位2", ...) SELECT "欄位3", "欄位4", ... FROM "被加入的表格" ;

       

      加入多筆其實(shí)就是將另一個(gè)表格加入到現(xiàn)有表格中。

       

      (5)UPDATE

       

      用于修改表格中的數(shù)據(jù),語(yǔ)法結(jié)構(gòu)為:

       

      UPDATE "表格名" SET "欄位1" = [新值] WHERE {條件};

       

      例如:

       

      UPDATE Store_Information SET Sales = 500 WHERE store_name = "Los Angeles" AND Date = "Jan-08-1999" ;

       

      具體是什么意思的話就不說(shuō)了,你懂的~~~

       

      (6)DELETE FROM

       

      刪除表格中的某些數(shù)據(jù),語(yǔ)法結(jié)構(gòu)為:

       

      DELETE FROM "表格名" WHERE {條件} ;

       

      滿足條件的所有資料都會(huì)被刪除掉。

       

       

       

      二、如何在android中調(diào)用數(shù)據(jù)庫(kù)資源


      在android中主要有兩種方法來(lái)實(shí)現(xiàn)對(duì)數(shù)據(jù)庫(kù)的訪問(wèn),一種是adb shell方式,另一種是通過(guò)相關(guān)的android 的java類來(lái)間接的對(duì)數(shù)據(jù)庫(kù)來(lái)進(jìn)行操作。其中前者主要用于在開(kāi)發(fā)過(guò)程中進(jìn)行調(diào)試等工作,后者則為android中主要的使用數(shù)據(jù)庫(kù)的方式。

      下面就對(duì)這兩種方式進(jìn)行一個(gè)簡(jiǎn)要的介紹。

       

      1.adb shell方式

       

      說(shuō)白了,adb shell 就是一個(gè)android模擬器的后臺(tái)資源調(diào)用器(個(gè)人理解啦~~)。它的操作方式和命令提示符差不多——以命令行的方式進(jìn)行。

       

      既然是模擬器的后臺(tái)資源調(diào)用器,那當(dāng)然得先打開(kāi)android模擬器了。

       

      打開(kāi)模擬器后,再打開(kāi)命令提示符,在里面輸入adb shell,這時(shí)會(huì)出現(xiàn)一個(gè)#號(hào)(懂linux的同學(xué)懂的),具體效果如下:

       

      然后你就可以像在linux下進(jìn)行shell命令的執(zhí)行了。

       

      接著輸入 cd data/data/ 并執(zhí)行,再執(zhí)行l(wèi)s,則會(huì)顯示一些安裝的軟件的工程包名,效果如下:

       

       

      其實(shí)這在模擬器中是以一個(gè)個(gè)文件夾的形式存在的,所以你可以用cd命令進(jìn)入它。例如我進(jìn)入一個(gè)后,再用ls命令顯示里面的內(nèi)容:

       

       

      該文件夾內(nèi)又存在databases、 lib等文件夾(如果沒(méi)有databases的話可以自己手動(dòng)用mkdir命令創(chuàng)建一個(gè))。而這個(gè)databases文件夾就是這個(gè)應(yīng)用的數(shù)據(jù)庫(kù)文件的所 在地,cd進(jìn)入后,應(yīng)該會(huì)看到里面有一個(gè)或多個(gè).db格式的文件(其實(shí)sqlite對(duì)文件的名字沒(méi)有特殊要求,你用.txt等其他的格式也可以,但推 薦.db)。如果沒(méi)有db文件的話,可以用如下命令創(chuàng)建:sqlite3 mydata.db。這樣就會(huì)在databases里面生成了一個(gè)數(shù)據(jù)庫(kù)文件。如果已存在,可以直接用sqlite3命令調(diào)用該數(shù)據(jù)庫(kù)文件,命令為 sqlite3 mydata.db(其實(shí)就是和剛才的命令一個(gè)樣)。接下來(lái)你就會(huì)看到:

       

      “正品完美蘆薈膠價(jià)格”淘寶價(jià)格,評(píng)價(jià),熱銷,爆款,推薦:完美蘆薈膠 - khmdrqgvetduqi - khmdrqgvetduqi的博客

       

      在sqlite>后面就可以執(zhí)行你的sql語(yǔ)句了。下面執(zhí)行了一些簡(jiǎn)單的語(yǔ)句:

       

       

      好了,adb shell的方式介紹到這里。

      2.通過(guò)android中的相關(guān)java類

       

            Android中對(duì)數(shù)據(jù)庫(kù)進(jìn)行操作的相關(guān)的借口、類等都在andorid.database和android.database.sqlite兩個(gè)包里 面。里面存在著很多的與數(shù)據(jù)庫(kù)操作相關(guān)的類,但是在平時(shí)普通的開(kāi)發(fā)中最經(jīng)常遇到的僅僅就是那幾個(gè)類而已,所以在這里我就省去通篇的介紹,對(duì)一些常用的接 口、類做一下簡(jiǎn)介。

       

      SQLiteDatabase(android.database.sqlite.SQLiteDatabase)

       

      文檔信息:

      public class

      SQLiteDatabase

       

      Exposes methods to manage a SQLite database.SQLiteDatabase has methods to create, delete, execute SQLcommands, and perform other common database management tasks.atabase names must be unique within an application, not across all applications.

       

       

      簡(jiǎn)介:

      這個(gè)是在android中數(shù)據(jù)庫(kù)操作使用最頻繁的一個(gè)類。通過(guò)它可以實(shí)現(xiàn)數(shù)據(jù)庫(kù)的創(chuàng)建或打開(kāi)、創(chuàng)建表、插入數(shù)據(jù)、刪除數(shù)據(jù)、查詢數(shù)據(jù)、修改數(shù)據(jù)等操作。

       

      重要方法介紹:

       

      (1)public static SQLiteDatabase openOrCreateDatabase (File file, SQLiteDatabase.CursorFactory factory)

           public static SQLiteDatabase openOrCreateDatabase (String path, SQLiteDatabase.CursorFactory factory)

      這個(gè)方法用于打開(kāi)或創(chuàng)建一個(gè)數(shù)據(jù)庫(kù)(對(duì)于sqlite來(lái)說(shuō),就是打開(kāi)或產(chǎn)生一個(gè)數(shù)據(jù)庫(kù)文件),參數(shù)中的File類就是java中表示系統(tǒng)文件路徑的File類,而SQLiteDatabase.CursorFactory則是一個(gè)產(chǎn)生Cursor對(duì)象的工廠類(Cursor接口將在后面介紹到)。


      (2)public long insert (String table, String nullColumnHack, ContentValues values)

      看到它的名字以及sql中的相關(guān)語(yǔ)句你不難猜到這個(gè)方法用于在數(shù)據(jù)庫(kù)中加入數(shù)據(jù)。ContentValue類似于java中HashMap類,用于以鍵值對(duì)的方式保存數(shù)據(jù)。


      (3)public int delete (String table, String whereClause, String[] whereArgs)

      不用說(shuō)了,用于刪除表中的數(shù)據(jù)。


      (4)public Cursor query (booleandistinct, String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy, String limit)

      名字很長(zhǎng)是吧,它的功能也很強(qiáng)大,用于查詢數(shù)據(jù)庫(kù)中的數(shù)據(jù)。


      (5)public int update (String table, ContentValues values, String whereClause, String[] whereArgs)

      用于修改數(shù)據(jù)。根據(jù)傳入?yún)?shù)的名字可以對(duì)使用方法略知一二。


      (6)public void execSQL (String sql, Object[] bindArgs)

           public void execSQL (String sql)

      這是我個(gè)人認(rèn)為最為重要的方法。這個(gè)方法用于執(zhí)行你用String表示的非查詢(因?yàn)樗粫?huì)返回一個(gè)Cursor對(duì)象)的sql語(yǔ)句,例如CREATE,SELECT等。遺憾的是現(xiàn)在尚無(wú)法一次調(diào)用該方法來(lái)執(zhí)行用“;”分開(kāi)的多條sql語(yǔ)句。第二個(gè)重寫方法使用的更多些。

      另外在此提問(wèn):第一個(gè)重寫方法中bindArgs表示的是一些什么,用來(lái)做什么用,知道的同學(xué)可以告訴我下,謝謝!


      (7)public void close ()

      用來(lái)關(guān)閉數(shù)據(jù)庫(kù)并釋放數(shù)據(jù)庫(kù)占用的相關(guān)資源。


       

      SQLiteOpenHelper (android.database.sqlite.SQLiteOpenHelper)

       

      文檔信息:

      public abstract class

      SQLiteOpenHelper

      A helper class to manage database creation and version management. You create a subclass implementingonCreate(SQLiteDatabase), onUpgrade(SQLiteDatabase, int, int) and optionally onOpen(SQLiteDatabase), and this class takes care of opening the database if it exists, creating it if it does not, and upgrading it as necessary. Transactions are used to make sure the database is always in a sensible state.

       

      簡(jiǎn)介:

      正如它的名字所表述的一樣,這個(gè)抽象類是一個(gè)輔助類(Helper),用來(lái)打開(kāi)(若數(shù)據(jù)庫(kù)已存在)或創(chuàng)建數(shù)據(jù)庫(kù)的。關(guān)于抽象類我們都知道,如果要使用它,一定是繼承它。所以使用它都是通過(guò)自己定義一個(gè)類繼承于它,并實(shí)現(xiàn)onCreate(SQLiteDatabase) onUpgrade(SQLiteDatabase, int, int) onOpen(SQLiteDatabase)三個(gè)方法。

      在我看來(lái),所謂的輔助類,其實(shí)就是充當(dāng)了一個(gè)封裝器——也就是說(shuō)用于對(duì)其輔助的類實(shí)現(xiàn)一個(gè)java上的封裝。在這里,SQLiteOpenHelper就是用來(lái)對(duì)SQLiteDatabase進(jìn)行一個(gè)封裝處理。初學(xué)的同學(xué)想要進(jìn)一步理解的話可以先看看什么是封裝。

       

      它包含的方法如下:

       

      (1)synchronized void close()

            關(guān)閉任何已開(kāi)啟的數(shù)據(jù)庫(kù)對(duì)象。

      (2)synchronized SQLiteDatabase getReadableDatabase()

            創(chuàng)建或打開(kāi)一個(gè)僅僅可讀的(read-only)數(shù)據(jù)庫(kù)。

      (3)synchronized SQLiteDatabase getWritableDatabase()

            創(chuàng)建或打開(kāi)一個(gè)可讀可寫的數(shù)據(jù)庫(kù)。
      (4)abstract void onCreate(SQLiteDatabase db)
            當(dāng)數(shù)據(jù)庫(kù)被第一次創(chuàng)建時(shí)被調(diào)用的的方法(類似于Activity的onCreate())。
      (5)void onOpen(SQLiteDatabase db)
            數(shù)據(jù)庫(kù)已經(jīng)被成打開(kāi)后被調(diào)用。
      (6)abstract void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)
            當(dāng)數(shù)據(jù)庫(kù)需要被更改(更新)時(shí)被調(diào)用。
       

       

      Cursor(android.database.Cursor)

       

      文檔信息:

      public interface

      Cursor

      This interface provides random read-write access to the result set returned by a database query.

       

      簡(jiǎn)介:

      Cursor沒(méi)有構(gòu)造方法,只能通過(guò)query方法獲得。

      前面提到了,execSQL方法無(wú)法執(zhí)行與查詢相關(guān)的sql語(yǔ)句,是因?yàn)闊o(wú)法返回一個(gè)Cursor對(duì)象——查詢需要將查到的結(jié)果(就是表中的哪一行滿足查詢條件)返回,execSQL是返回void的,所以無(wú)法操作查詢語(yǔ)句。從這里可以了解到,Cursor接口從某種意義上說(shuō)就是為了彌補(bǔ)這一點(diǎn)的——query方法就是返回了一個(gè)Cursor對(duì)象。從名字上看,它的意思是游標(biāo),所以大概可以猜到他起到了一個(gè)指代的作用(事實(shí)上就是的,它指代數(shù)據(jù)庫(kù)中保存數(shù)據(jù)的表的一行,并且還可以簡(jiǎn)單的處理該行數(shù)據(jù)項(xiàng)的信息)。從類的描述看,Cursor提供了對(duì)一個(gè)數(shù)據(jù)庫(kù)查詢動(dòng)作返回結(jié)果束的隨機(jī)讀寫途徑,也就是說(shuō),它是一個(gè)對(duì)查詢操作返回結(jié)果進(jìn)行進(jìn)一步處理的類,而這些處理就是用Cursor里的方法實(shí)現(xiàn)的。

      結(jié)合SimpleCursorAdapter這個(gè)適配器類,你可以很方便的將數(shù)據(jù)庫(kù)中的數(shù)據(jù)顯示到AdapterView(例如ListView,GridView)中——這也是Cursor的另一大用處。

      如果你了解java中的迭代器(Iterator)的話你就會(huì)發(fā)現(xiàn)其實(shí)Cursor和迭代器有些相似,這樣你可能會(huì)更快的了解Cursor。

       

      一些常用的方法有:

      (1)public abstract boolean moveToPosition (int position)

          public abstract boolean moveToFirst ()

          public abstract boolean moveToLast ()

          public abstract boolean moveToNext ()

          public abstract boolean moveToPrevious ()

      把這些方法放在一起的目的很明顯:它們都是對(duì)Cursor指向的位置進(jìn)行操作的方法——移到某個(gè)指定的位置、移到第一行、移到最后一行、移向下一行、移向上一行等等。

       

      (2)public abstract int getCount ()

      返回Cursor指向的表含有的總數(shù)據(jù)項(xiàng)數(shù)。

       

      (3)public abstract boolean requery ()

      Cursor是被一個(gè)query方法產(chǎn)生的,而這個(gè)方法就是將那個(gè)query方法所做的查詢動(dòng)作再執(zhí)行一遍——這將會(huì)改變調(diào)用該方法的Cursor對(duì)象的值,也就是說(shuō),Cursor使用了該方法后就復(fù)位了。

       

      (4)public abstract boolean isClosed ()

          public abstract boolean isFirst ()

          public abstract boolean isLast ()

          public abstract boolean isNull (int columnIndex)

          public abstract boolean isClosed ()

          public abstract boolean isAfterLast ()

          public abstract boolean isBeforeFirst ()

      在java中,類似于isWhatever形式的方法大都是對(duì)對(duì)象狀態(tài)進(jìn)行判斷的方法——Whatever成立則返回true,不成立則返回false。這些方法也不例外。

      值得提一下的是isNull方法,該方法測(cè)試某個(gè)欄位所保存的信息是否為NULL。參數(shù)columnIndex代表了那個(gè)欄位的代號(hào)。

       

      ④另外建議各位了解一下SimpleCursorAdapter(android.widget.SimpleCursorAdapter)這個(gè)適配器類。

       

       

       

      好了,介紹這么多了,該上源碼了。這個(gè)源碼很簡(jiǎn)單,但代表一種使用模式,所以還是值得仔細(xì)研究的。

       

      1.實(shí)現(xiàn)一個(gè)繼承SQLiteOpenHelper的類

      1. import android.content.ContentValues;  
      2. import android.content.Context;  
      3. import android.database.Cursor;  
      4. import android.database.sqlite.SQLiteDatabase;  
      5. import android.database.sqlite.SQLiteOpenHelper;  
      6. public class DBHelper extends SQLiteOpenHelper {  
      7.     private static final String DB_NAME = "coll.db";  
      8.     private static final String TBL_NAME = "CollTbl";  
      9.     private static final String CREATE_TBL = " create table "  
      10.             + " CollTbl(_id integer primary key autoincrement,name text,url text, desc text) ";  
      11.       
      12.     private SQLiteDatabase db;  
      13.     DBHelper(Context c) {  
      14.         super(c, DB_NAME, null2);  
      15.     }  
      16.     @Override  
      17.     public void onCreate(SQLiteDatabase db) {  
      18.         this.db = db;  
      19.         db.execSQL(CREATE_TBL);  
      20.     }  
      21.     public void insert(ContentValues values) {  
      22.         SQLiteDatabase db = getWritableDatabase();  
      23.         db.insert(TBL_NAME, null, values);  
      24.         db.close();  
      25.     }  
      26.     public Cursor query() {  
      27.         SQLiteDatabase db = getWritableDatabase();  
      28.         Cursor c = db.query(TBL_NAME, nullnullnullnullnullnull);  
      29.         return c;  
      30.     }  
      31.     public void del(int id) {  
      32.         if (db == null)  
      33.             db = getWritableDatabase();  
      34.         db.delete(TBL_NAME, "_id=?"new String[] { String.valueOf(id) });  
      35.     }  
      36.     public void close() {  
      37.         if (db != null)  
      38.             db.close();  
      39.     }  
      40.     @Override  
      41.     public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {  
      42.     }  
      43. }  

       

      2.創(chuàng)建一個(gè)錄入數(shù)據(jù)的類

       

      1. import android.app.Activity;  
      2. import android.content.ContentValues;  
      3. import android.content.Intent;  
      4. import android.os.Bundle;  
      5. import android.view.View;  
      6. import android.view.View.OnClickListener;  
      7. import android.widget.Button;  
      8. import android.widget.EditText;  
      9. public class AddActivity extends Activity {  
      10.     private EditText et1, et2, et3;  
      11.     private Button b1;  
      12.     @Override  
      13.     public void onCreate(Bundle savedInstanceState) {  
      14.         super.onCreate(savedInstanceState);  
      15.         setContentView(R.layout.add);  
      16.         this.setTitle("添加收藏信息");  
      17.         et1 = (EditText) findViewById(R.id.EditTextName);  
      18.         et2 = (EditText) findViewById(R.id.EditTextUrl);  
      19.         et3 = (EditText) findViewById(R.id.EditTextDesc);  
      20.         b1 = (Button) findViewById(R.id.ButtonAdd);  
      21.         b1.setOnClickListener(new OnClickListener() {  
      22.             public void onClick(View v) {  
      23.                 String name = et1.getText().toString();  
      24.                 String url = et2.getText().toString();  
      25.                 String desc = et3.getText().toString();  
      26.                 ContentValues values = new ContentValues();  
      27.                 values.put("name", name);  
      28.                 values.put("url", url);  
      29.                 values.put("desc", desc);  
      30.                 DBHelper helper = new DBHelper(getApplicationContext());  
      31.                 helper.insert(values);  
      32.                 Intent intent = new Intent(AddActivity.this,  
      33.                         QueryActivity.class);  
      34.                 startActivity(intent);  
      35.             }  
      36.         });  
      37.     }  
      38. }  

       

      3.創(chuàng)建一個(gè)顯示數(shù)據(jù)庫(kù)數(shù)據(jù)的類

      1. import android.app.AlertDialog;  
      2. import android.app.ListActivity;  
      3. import android.content.DialogInterface;  
      4. import android.database.Cursor;  
      5. import android.os.Bundle;  
      6. import android.view.View;  
      7. import android.widget.AdapterView;  
      8. import android.widget.ListView;  
      9. import android.widget.SimpleCursorAdapter;  
      10. import android.widget.AdapterView.OnItemClickListener;  
      11. public class QueryActivity extends ListActivity {  
      12.     @Override  
      13.     public void onCreate(Bundle savedInstanceState) {  
      14.         super.onCreate(savedInstanceState);  
      15.         this.setTitle("瀏覽收藏信息");  
      16.         final DBHelper helpter = new DBHelper(this);  
      17.         Cursor c = helpter.query();  
      18.         String[] from = { "_id""name""url""desc" };  
      19.         int[] to = { R.id.text0, R.id.text1, R.id.text2, R.id.text3 };  
      20.         SimpleCursorAdapter adapter = new SimpleCursorAdapter(this,  
      21.                 R.layout.row, c, from, to);  
      22.         ListView listView = getListView();  
      23.         listView.setAdapter(adapter);  
      24.           
      25.           
      26.         final AlertDialog.Builder builder = new AlertDialog.Builder(this);  
      27.         listView.setOnItemClickListener(new OnItemClickListener() {  
      28.             @Override  
      29.             public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,  
      30.                     long arg3) {  
      31.                 final long temp = arg3;  
      32.                 builder.setMessage("真的要?jiǎng)h除該記錄嗎?").setPositiveButton("是",  
      33.                         new DialogInterface.OnClickListener() {  
      34.                             public void onClick(DialogInterface dialog,  
      35.                                     int which) {  
      36.                                 helpter.del((int)temp);  
      37.                                 Cursor c = helpter.query();  
      38.                                 String[] from = { "_id""name""url""desc" };  
      39.                                 int[] to = { R.id.text0, R.id.text1, R.id.text2, R.id.text3 };  
      40.                                 SimpleCursorAdapter adapter = new SimpleCursorAdapter(getApplicationContext(),  
      41.                                         R.layout.row, c, from, to);  
      42.                                 ListView listView = getListView();  
      43.                                 listView.setAdapter(adapter);  
      44.                             }  
      45.                         }).setNegativeButton("否",  
      46.                         new DialogInterface.OnClickListener() {  
      47.                             public void onClick(DialogInterface dialog,  
      48.                                     int which) {  
      49.                                   
      50.                             }  
      51.                         });  
      52.                 AlertDialog ad = builder.create();  
      53.                 ad.show();  
      54.             }  
      55.         });  
      56.         helpter.close();  
      57.     }  
      58. }  

       

       

      在這些代碼中,關(guān)鍵理解第一個(gè)的思想以及形式即可,其他都是基于它進(jìn)行的一些操作而已。另外布局的代碼就不加了,沒(méi)啥技術(shù)含量。

        本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
        轉(zhuǎn)藏 分享 獻(xiàn)花(0

        0條評(píng)論

        發(fā)表

        請(qǐng)遵守用戶 評(píng)論公約

        類似文章 更多