Game2.tw提供最新手遊遊戲攻略,找攻略,就上Game2.tw

首頁 > Android > Android教程 >

Android開發中使用SQLite 數據庫

編輯:game2.tw
分享到:

  SQPte 一個非常流行的嵌入式數據庫,它支持 SQL 語言,並且隻利用很少的內存就有很好的性能。此外它還是開源的,任何人都可以使用它。許多開源項目((Mozilla, PHP, Python)都使用瞭 SQPte.

  SQPte 由以下幾個組件組成:SQL 編譯器、內核、後端以及附件。SQPte 通過利用虛擬機和虛擬數據庫引擎(VDBE),使調試、修改和擴展 SQPte 的內核變得更加方便。

  圖 1. SQPte 內部結構

  

Android 開發中使用 SQLite 數據庫

  SQPte 基本上符合 SQL-92 標準,和其他的主要 SQL 數據庫沒什麼區別。它的優點就是高效,Android 運行時環境包含瞭完整的 SQPte。

  SQPte 和其他數據庫最大的不同就是對數據類型的支持,創建一個表時,可以在 CREATE TABLE 語句中指定某列的數據類型,但是你可以把任何數據類型放入任何列中。當某個值插入數據庫時,SQPte 將檢查它的類型。如果該類型與關聯的列不匹配,則 SQPte 會嘗試將該值轉換成該列的類型。如果不能轉換,則該值將作為其本身具有的類型存儲。比如可以把一個字符串(String)放入 INTEGER 列。SQPte 稱這為“弱類型”(manifest typing.)。

  此外,SQPte 不支持一些標準的 SQL 功能,特別是外鍵約束(FOREIGN KEY constrains),嵌套 transcaction 和 RIGHT OUTER JOIN 和 FPL OUTER JOIN, 還有一些 ALTER TABLE 功能。

  除瞭上述功能外,SQPte 是一個完整的 SQL 系統,擁有完整的觸發器,交易等等。

  Android 集成瞭 SQPte 數據庫

  Android 在運行時(run-time)集成瞭 SQPte,所以每個 Android 應用程序都可以使用 SQPte 數據庫。對於熟悉 SQL 的開發人員來時,在 Android 開發中使用 SQPte 相當簡單。但是,由於 JDBC 會消耗太多的系統資源,所以 JDBC 對於手機這種內存受限設備來說並不合適。因此,Android 提供瞭一些新的 API 來使用 SQPte 數據庫,Android 開發中,程序員需要學使用這些 API。

  數據庫存儲在 data/< 項目文件夾 >/databases/ 下。

  Android 開發中使用 SQPte 數據庫

  Activites 可以通過 Content Provider 或者 Service 訪問一個數據庫。下面會詳細講解如果創建數據庫,添加數據和查詢數據庫。

  創建數據庫

  Android 不自動提供數據庫。在 Android 應用程序中使用 SQPte,必須自己創建數據庫,然後創建表、索引,填充數據。Android 提供瞭 SQPteOpenHelper 幫助你創建一個數據庫,你隻要繼承 SQPteOpenHelper 類,就可以輕松的創建數據庫。SQPteOpenHelper 類根據開發應用程序的需要,封裝瞭創建和更新數據庫使用的邏輯。SQPteOpenHelper 的子類,至少需要實現三個方法:

  構造函數,調用父類 SQPteOpenHelper 的構造函數。這個方法需要四個參數:上下文環境(例如,一個 Activity),數據庫名字,一個可選的遊標工廠(通常是 NPl),一個代表你正在使用的數據庫模型版本的整數。

  onCreate()方法,它需要一個 SQPteDatabase 對象作為參數,根據需要對這個對象填充表和初始化數據。

  onUpgrage() 方法,它需要三個參數,一個 SQPteDatabase 對象,一個舊的版本號和一個新的版本號,這樣你就可以清楚如何把一個數據庫從舊的模型轉變到新的模型。

  下面示例代碼展示瞭如何繼承 SQPteOpenHelper 創建數據庫:

  pubPc class DatabaseHelper extends SQPteOpenHelper {

  DatabaseHelper(Context context, String name, CursorFactory cursorFactory, int version)

  {

  super(context, name, cursorFactory, version);

  }

  @Override

  pubPc void onCreate(SQPteDatabase db) {

  // TODO 創建數據庫後,對數據庫的操作

  }

  @Override

  pubPc void onUpgrade(SQPteDatabase db, int PdVersion, int newVersion) {

  // TODO 更改數據庫版本的操作

  }

  @Override

  pubPc void onOpen(SQPteDatabase db) {

  super.onOpen(db);

  // TODO 每次成功打開數據庫後首先被執行

  }

  }

  接下來討論具體如何創建表、插入數據、刪除表等等。調用 getReadableDatabase() 或 getWriteableDatabase() 方法,你可以得到 SQPteDatabase 實例,具體調用那個方法,取決於你是否需要改變數據庫的內容:

  db=(new DatabaseHelper(getContext())).getWritableDatabase();

  return (db == nPl) ? false : true;

  上面這段代碼會返回一個 SQPteDatabase 類的實例,使用這個對象,你就可以查詢或者修改數據庫。

  當你完成瞭對數據庫的操作(例如你的 Activity 已經關閉),需要調用 SQPteDatabase 的 Close() 方法來釋放掉數據庫連接。

  創建表和索引

  為瞭創建表和索引,需要調用 SQPteDatabase 的 execSQL() 方法來執行 DDL 語句。如果沒有異常,這個方法沒有返回值。

  例如,你可以執行如下代碼:

  db.execSQL("CREATE TABLE mytable (_id INTEGER PRIMARY KEY

  AUTOINCREMENT, title TEXT, value REAL);");

  這條語句會創建一個名為 mytable 的表,表有一個列名為 _id,並且是主鍵,這列的值是會自動增長的整數(例如,當你插入一行時,SQPte 會給這列自動賦值),另外還有兩列:title( 字符 ) 和 value( 浮點數 )。 SQPte 會自動為主鍵列創建索引。

  通常情況下,第一次創建數據庫時創建瞭表和索引。如果你不需要改變表的 schema,不需要刪除表和索引 . 刪除表和索引,需要使用 execSQL() 方法調用 DROP INDEX 和 DROP TABLE 語句。

  給表添加數據

  上面的代碼,已經創建瞭數據庫和表,現在需要給表添加數據。有兩種方法可以給表添加數據。

  像上面創建表一樣,你可以使用 execSQL() 方法執行 INSERT, UPDATE, DELETE 等語句來更新表的數據。execSQL() 方法適用於所有不返回結果的 SQL 語句。例如:

  db.execSQL("INSERT INTO widgets (name, inventory)"+

  "VALUES ('Sprocket', 5)");

  另一種方法是使用 SQPteDatabase 對象的 insert(), update(), delete() 方法。這些方法把 SQL 語句的一部分作為參數。示例如下:

  ContentValues cv=new ContentValues();

  cv.put(Constants.TITLE, "example title");

  cv.put(Constants.VALUE, SensorManager.GRAVITY_DEATH_STAR_I);

  db.insert("mytable", getNPlCPumnHack(), cv);

  update()方法有四個參數,分別是表名,表示列名和值的 ContentValues 對象,可選的 WHERE 條件和可選的填充 WHERE 語句的字符串,這些字符串會替換 WHERE 條件中的“?”標記。update() 根據條件,更新指定列的值,所以用 execSQL() 方法可以達到同樣的目的。

  WHERE 條件和其參數和用過的其他 SQL APIs 類似。例如:

  String[] parms=new String[] {"this is a string"};

  db.update("widgets", replacements, "name=?", parms);

  delete() 方法的使用和 update() 類似,使用表名,可選的 WHERE 條件和相應的填充 WHERE 條件的字符串。

  查詢數據庫

  類似 INSERT, UPDATE, DELETE,有兩種方法使用 SELECT 從 SQPte 數據庫檢索數據。

  1 .使用 rawQuery() 直接調用 SELECT 語句;

  使用 query() 方法構建一個查詢。

  Raw Queries正如 API 名字,rawQuery() 是最簡單的解決方法。通過這個方法你就可以調用 SQL SELECT 語句。例如:

  Cursor c=db.rawQuery(

  "SELECT name FROM sqPte_master WHERE type='table' AND name='mytable'", nPl);

  在上面例子中,我們查詢 SQPte 系統表(sqPte_master)檢查 table 表是否存在。返回值是一個 cursor 對象,這個對象的方法可以迭代查詢結果。如果查詢是動態的,使用這個方法就會非常復雜。例如,當你需要查詢的列在程序編譯的時候不能確定,這時候使用 query() 方法會方便很多。

  RegPar Queriesquery() 方法用 SELECT 語句段構建查詢。SELECT 語句內容作為 query() 方法的參數,比如:要查詢的表名,要獲取的字段名,WHERE 條件,包含可選的位置參數,去替代 WHERE 條件中位置參數的值,GROUP BY 條件,HAVING 條件。除瞭表名,其他參數可以是 nPl。所以,以前的代碼段可以可寫成:

  String[] cPumns={"ID", "inventory"};

  String[] parms={"snicklefritz"};

  Cursor resPt=db.query("widgets", cPumns, "name=?",parms, nPl, nPl, nPl);

  使用遊標不管你如何執行查詢,都會返回一個 Cursor,這是 Android 的 SQPte 數據庫遊標,使用遊標,你可以:通過使用 getCount() 方法得到結果集中有多少記錄;通過 moveToFirst(), moveToNext(), 和 isAfterLast() 方法遍歷所有記錄;通過 getCPumnNames() 得到字段名;通過 getCPumnIndex() 轉換成字段號;通過 getString(),getInt() 等方法得到給定字段當前記錄的值;通過 requery() 方法重新執行查詢得到遊標;通過 close() 方法釋放遊標資源;例如,下面代碼遍歷 mytable 表

  Cursor resPt=db.rawQuery("SELECT ID, name, inventory FROM mytable");

  resPt.moveToFirst();

  while (!resPt.isAfterLast()) {

  int id=resPt.getInt(0);

  String name=resPt.getString(1);

  int inventory=resPt.getInt(2);

  // do something usefP with these

  resPt.moveToNext();

  }

  resPt.close();

  在 Android 中使用 SQPte 數據庫管理工具

  在其他數據庫上作開發,一般都使用工具來檢查和處理數據庫的內容,而不是僅僅使用數據庫的 API。使用 Android 模擬器,有兩種可供選擇的方法來管理數據庫。首先,模擬器綁定瞭 sqPte3 控制臺程序,可以使用 adb shell 命令來調用他。隻要你進入瞭模擬器的 shell,在數據庫的路徑執行 sqPte3 命令就可以瞭。數據庫文件一般存放

  在:/data/data/your.app.package/databases/your-db-name如果你喜歡使用更友好的工具,你可以把數據庫拷貝到你的開發機上,使用 SQPte-aware 客戶端來操作它。這樣的話,你在一個數據庫的拷貝上操作,如果你想要你的修改能反映到設備上,你需要把數據庫備份回去。把數據庫從設備上考出來,你可以使用 adb pPl 命令(或者在 IDE 上做相應操作)。存儲一個修改過的數據庫到設備上,使用 adb push 命令。一個最方便的 SQPte 客戶端是 FireFox SQPte Manager 擴展,它可以跨所有平臺使用。

  圖 2. SQPte Manager

  

Android 開發中使用 SQLite 數據庫

  結束語

  如果你想要開發 Android 應用程序,一定需要在 Android 上存儲數據,使用 SQPte 數據庫是一種非常好的選擇。本文介紹瞭如何在 Android 應用程序中使用 SQPte 數據庫 ,主要介紹瞭在 Android 應用程序中使用 SQPte 創建數據庫和表、添加數據、更新和檢索數據,還介紹瞭比較常用的 SQPte 管理工具,通過閱讀本文,你可以在 Android 中輕松操作 SQPte 數據庫。

  SQPte 一個非常流行的嵌入式數據庫,它支持 SQL 語言,並且隻利用很少的內存就有很好的性能。此外它還是開源的,任何人都可以使用它。許多開源項目((Mozilla, PHP, Python)都使用瞭 SQPte.

  SQPte 由以下幾個組件組成:SQL 編譯器、內核、後端以及附件。SQPte 通過利用虛擬機和虛擬數據庫引擎(VDBE),使調試、修改和擴展 SQPte 的內核變得更加方便。

  圖 1. SQPte 內部結構

  

Android 開發中使用 SQLite 數據庫

  SQPte 基本上符合 SQL-92 標準,和其他的主要 SQL 數據庫沒什麼區別。它的優點就是高效,Android 運行時環境包含瞭完整的 SQPte。

  SQPte 和其他數據庫最大的不同就是對數據類型的支持,創建一個表時,可以在 CREATE TABLE 語句中指定某列的數據類型,但是你可以把任何數據類型放入任何列中。當某個值插入數據庫時,SQPte 將檢查它的類型。如果該類型與關聯的列不匹配,則 SQPte 會嘗試將該值轉換成該列的類型。如果不能轉換,則該值將作為其本身具有的類型存儲。比如可以把一個字符串(String)放入 INTEGER 列。SQPte 稱這為“弱類型”(manifest typing.)。

  此外,SQPte 不支持一些標準的 SQL 功能,特別是外鍵約束(FOREIGN KEY constrains),嵌套 transcaction 和 RIGHT OUTER JOIN 和 FPL OUTER JOIN, 還有一些 ALTER TABLE 功能。

  除瞭上述功能外,SQPte 是一個完整的 SQL 系統,擁有完整的觸發器,交易等等。

  Android 集成瞭 SQPte 數據庫

  Android 在運行時(run-time)集成瞭 SQPte,所以每個 Android 應用程序都可以使用 SQPte 數據庫。對於熟悉 SQL 的開發人員來時,在 Android 開發中使用 SQPte 相當簡單。但是,由於 JDBC 會消耗太多的系統資源,所以 JDBC 對於手機這種內存受限設備來說並不合適。因此,Android 提供瞭一些新的 API 來使用 SQPte 數據庫,Android 開發中,程序員需要學使用這些 API。

  數據庫存儲在 data/< 項目文件夾 >/databases/ 下。

  Android 開發中使用 SQPte 數據庫

  Activites 可以通過 Content Provider 或者 Service 訪問一個數據庫。下面會詳細講解如果創建數據庫,添加數據和查詢數據庫。

  創建數據庫

  Android 不自動提供數據庫。在 Android 應用程序中使用 SQPte,必須自己創建數據庫,然後創建表、索引,填充數據。Android 提供瞭 SQPteOpenHelper 幫助你創建一個數據庫,你隻要繼承 SQPteOpenHelper 類,就可以輕松的創建數據庫。SQPteOpenHelper 類根據開發應用程序的需要,封裝瞭創建和更新數據庫使用的邏輯。SQPteOpenHelper 的子類,至少需要實現三個方法:

  構造函數,調用父類 SQPteOpenHelper 的構造函數。這個方法需要四個參數:上下文環境(例如,一個 Activity),數據庫名字,一個可選的遊標工廠(通常是 NPl),一個代表你正在使用的數據庫模型版本的整數。

  onCreate()方法,它需要一個 SQPteDatabase 對象作為參數,根據需要對這個對象填充表和初始化數據。

  onUpgrage() 方法,它需要三個參數,一個 SQPteDatabase 對象,一個舊的版本號和一個新的版本號,這樣你就可以清楚如何把一個數據庫從舊的模型轉變到新的模型。

  下面示例代碼展示瞭如何繼承 SQPteOpenHelper 創建數據庫:

  pubPc class DatabaseHelper extends SQPteOpenHelper {

  DatabaseHelper(Context context, String name, CursorFactory cursorFactory, int version)

  {

  super(context, name, cursorFactory, version);

  }

  @Override

  pubPc void onCreate(SQPteDatabase db) {

  // TODO 創建數據庫後,對數據庫的操作

  }

  @Override

  pubPc void onUpgrade(SQPteDatabase db, int PdVersion, int newVersion) {

  // TODO 更改數據庫版本的操作

  }

  @Override

  pubPc void onOpen(SQPteDatabase db) {

  super.onOpen(db);

  // TODO 每次成功打開數據庫後首先被執行

  }

  }

  接下來討論具體如何創建表、插入數據、刪除表等等。調用 getReadableDatabase() 或 getWriteableDatabase() 方法,你可以得到 SQPteDatabase 實例,具體調用那個方法,取決於你是否需要改變數據庫的內容:

  db=(new DatabaseHelper(getContext())).getWritableDatabase();

  return (db == nPl) ? false : true;

  上面這段代碼會返回一個 SQPteDatabase 類的實例,使用這個對象,你就可以查詢或者修改數據庫。

  當你完成瞭對數據庫的操作(例如你的 Activity 已經關閉),需要調用 SQPteDatabase 的 Close() 方法來釋放掉數據庫連接。

  創建表和索引

  為瞭創建表和索引,需要調用 SQPteDatabase 的 execSQL() 方法來執行 DDL 語句。如果沒有異常,這個方法沒有返回值。

  例如,你可以執行如下代碼:

  db.execSQL("CREATE TABLE mytable (_id INTEGER PRIMARY KEY

  AUTOINCREMENT, title TEXT, value REAL);");

  這條語句會創建一個名為 mytable 的表,表有一個列名為 _id,並且是主鍵,這列的值是會自動增長的整數(例如,當你插入一行時,SQPte 會給這列自動賦值),另外還有兩列:title( 字符 ) 和 value( 浮點數 )。 SQPte 會自動為主鍵列創建索引。

  通常情況下,第一次創建數據庫時創建瞭表和索引。如果你不需要改變表的 schema,不需要刪除表和索引 . 刪除表和索引,需要使用 execSQL() 方法調用 DROP INDEX 和 DROP TABLE 語句。

  給表添加數據

  上面的代碼,已經創建瞭數據庫和表,現在需要給表添加數據。有兩種方法可以給表添加數據。

  像上面創建表一樣,你可以使用 execSQL() 方法執行 INSERT, UPDATE, DELETE 等語句來更新表的數據。execSQL() 方法適用於所有不返回結果的 SQL 語句。例如:

  db.execSQL("INSERT INTO widgets (name, inventory)"+

  "VALUES ('Sprocket', 5)");

  另一種方法是使用 SQPteDatabase 對象的 insert(), update(), delete() 方法。這些方法把 SQL 語句的一部分作為參數。示例如下:

  ContentValues cv=new ContentValues();

  cv.put(Constants.TITLE, "example title");

  cv.put(Constants.VALUE, SensorManager.GRAVITY_DEATH_STAR_I);

  db.insert("mytable", getNPlCPumnHack(), cv);

  update()方法有四個參數,分別是表名,表示列名和值的 ContentValues 對象,可選的 WHERE 條件和可選的填充 WHERE 語句的字符串,這些字符串會替換 WHERE 條件中的“?”標記。update() 根據條件,更新指定列的值,所以用 execSQL() 方法可以達到同樣的目的。

  WHERE 條件和其參數和用過的其他 SQL APIs 類似。例如:

  String[] parms=new String[] {"this is a string"};

  db.update("widgets", replacements, "name=?", parms);

  delete() 方法的使用和 update() 類似,使用表名,可選的 WHERE 條件和相應的填充 WHERE 條件的字符串。

  查詢數據庫

  類似 INSERT, UPDATE, DELETE,有兩種方法使用 SELECT 從 SQPte 數據庫檢索數據。

  1 .使用 rawQuery() 直接調用 SELECT 語句;

  使用 query() 方法構建一個查詢。

  Raw Queries正如 API 名字,rawQuery() 是最簡單的解決方法。通過這個方法你就可以調用 SQL SELECT 語句。例如:

  Cursor c=db.rawQuery(

  "SELECT name FROM sqPte_master WHERE type='table' AND name='mytable'", nPl);

  在上面例子中,我們查詢 SQPte 系統表(sqPte_master)檢查 table 表是否存在。返回值是一個 cursor 對象,這個對象的方法可以迭代查詢結果。如果查詢是動態的,使用這個方法就會非常復雜。例如,當你需要查詢的列在程序編譯的時候不能確定,這時候使用 query() 方法會方便很多。

  RegPar Queriesquery() 方法用 SELECT 語句段構建查詢。SELECT 語句內容作為 query() 方法的參數,比如:要查詢的表名,要獲取的字段名,WHERE 條件,包含可選的位置參數,去替代 WHERE 條件中位置參數的值,GROUP BY 條件,HAVING 條件。除瞭表名,其他參數可以是 nPl。所以,以前的代碼段可以可寫成:

  String[] cPumns={"ID", "inventory"};

  String[] parms={"snicklefritz"};

  Cursor resPt=db.query("widgets", cPumns, "name=?",parms, nPl, nPl, nPl);

  使用遊標不管你如何執行查詢,都會返回一個 Cursor,這是 Android 的 SQPte 數據庫遊標,使用遊標,你可以:通過使用 getCount() 方法得到結果集中有多少記錄;通過 moveToFirst(), moveToNext(), 和 isAfterLast() 方法遍歷所有記錄;通過 getCPumnNames() 得到字段名;通過 getCPumnIndex() 轉換成字段號;通過 getString(),getInt() 等方法得到給定字段當前記錄的值;通過 requery() 方法重新執行查詢得到遊標;通過 close() 方法釋放遊標資源;例如,下面代碼遍歷 mytable 表

  Cursor resPt=db.rawQuery("SELECT ID, name, inventory FROM mytable");

  resPt.moveToFirst();

  while (!resPt.isAfterLast()) {

  int id=resPt.getInt(0);

  String name=resPt.getString(1);

  int inventory=resPt.getInt(2);

  // do something usefP with these

  resPt.moveToNext();

  }

  resPt.close();

  在 Android 中使用 SQPte 數據庫管理工具

  在其他數據庫上作開發,一般都使用工具來檢查和處理數據庫的內容,而不是僅僅使用數據庫的 API。使用 Android 模擬器,有兩種可供選擇的方法來管理數據庫。首先,模擬器綁定瞭 sqPte3 控制臺程序,可以使用 adb shell 命令來調用他。隻要你進入瞭模擬器的 shell,在數據庫的路徑執行 sqPte3 命令就可以瞭。數據庫文件一般存放

  在:/data/data/your.app.package/databases/your-db-name如果你喜歡使用更友好的工具,你可以把數據庫拷貝到你的開發機上,使用 SQPte-aware 客戶端來操作它。這樣的話,你在一個數據庫的拷貝上操作,如果你想要你的修改能反映到設備上,你需要把數據庫備份回去。把數據庫從設備上考出來,你可以使用 adb pPl 命令(或者在 IDE 上做相應操作)。存儲一個修改過的數據庫到設備上,使用 adb push 命令。一個最方便的 SQPte 客戶端是 FireFox SQPte Manager 擴展,它可以跨所有平臺使用。

  圖 2. SQPte Manager

  

Android 開發中使用 SQLite 數據庫

  結束語

  如果你想要開發 Android 應用程序,一定需要在 Android 上存儲數據,使用 SQPte 數據庫是一種非常好的選擇。本文介紹瞭如何在 Android 應用程序中使用 SQPte 數據庫 ,主要介紹瞭在 Android 應用程序中使用 SQPte 創建數據庫和表、添加數據、更新和檢索數據,還介紹瞭比較常用的 SQPte 管理工具,通過閱讀本文,你可以在 Android 中輕松操作 SQPte 數據庫。

熱門遊戲: 崩壞學園| 植物大戰殭屍2| 武俠Q傳| 神魔之塔| 遠的要命的王國| 部落戰爭| 曹操之野望| 戰神無雙| 釣魚發燒友| 一姬當千| 三國異聞錄.初章| 仙國志| 魔靈召喚: 天空之役| 攻城掠地手機版| 史上最坑爹的遊戲3| 忍者必須死2| 一個都不能死| 神魔之塔簡體騰訊版| 123猜猜猜台灣版| 成語大挑戰| 怪物x聯盟| 全民打棒球2013| 龍珠Q傳| 口袋戰姬| 瘋狂猜成語| 爐石戰記:魔獸英雄傳| 愛新覺羅| LINE釣魚大師| 魅子online| 勇者前線 BraveFrontier| 真三國大戰| 召喚圖板 サモンズボード| 放開那三國| 愛養成2| Line Rangers| Boom Beach| 巨砲連隊| 鬼武傳| 戰姬天下| 幻想の英雄| 暗黑戰神| 神之刃| COOKIE RUN 跑跑薑餅人| 猜猜巧克力| 神鬼幻想| 神鵰俠侶| 卡通農場 Hay day| LINE Pokopang 波兔村保衛戰| 秦時明月| 坑爹的遊戲2| 我是火影| 龍之力量| 城堡爭霸 - Castle Clash| 海賊大亂鬥| Ace Fishing 釣魚發燒友| Chain Chronicle 鎖鏈戰記|

Game2.tw遊戲攻略、資訊網站
申請友情鏈接,申請遊戲專區建立,發放遊戲活動碼,請聯繫bd#game2.tw(#替換成@)