Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android開發實例 >> Android應用開發入門(五)嵌入式的數據庫引擎SQLite

Android應用開發入門(五)嵌入式的數據庫引擎SQLite

編輯:Android開發實例

  Android系統集成了一個輕量級的數據庫:SQLite,SQLite是一個嵌入式的數據庫引擎,專門適用於資源有限的設備上(手機、PDA)的適量數據存儲。

  Android提供了SQLiteDatabase,它代表了一個SQLite數據庫(底層就是一個數據文件),在個數據庫中理論上是這可以存在無限多個表的。一旦應用程序獲得了代表指定數據庫的SQLiteDatabase對象,就可以通過SQLiteDatabase對象來操作SQLite數據庫。

  SQLiteDatabase提供了幾個靜態的方法來打開一個文件對應的數據庫,此處介紹幾個常用的:

  •   static SQLiteDatabase openDatabase(String path, SQLiteDatabase.CursorFactory factory, int flags):打開path文件所代表的SQLite數據庫。
  •   static SQLiteDatabase openOrCreateDatabase(String path, SQLiteDatabase.CursorFactory factory):打開或創建(如果不存在)path文件所代表的SQLite數據庫。
  •   static SQLiteDatabase openOrCreateDatabase(File file, SQLiteDatabase.CursorFactory factory):打開或創建(如果不存在)file文件所代表的SQLite數據庫。

 

  在得到SQLiteDatabase對象之後,就可以調用方法執行SQL語句了,在此處介紹幾個常用的方法,是直接執行SQL語句的,需要有SQL語法基礎,如果不熟悉SQL語法,SQLiteDatabase還提供了其他代替方法,此處不在此介紹。

  •   void execSQL(String sql):執行無返回值的SQL語句,如:insert、delete、update。
  •   void execSQL(String sql, Object[] bindArgs):執行帶占位符的SQL語句,占位符用?表示。
  •   Cursor rawQuery(String sql, String[] selectionArgs):執行一個帶占位符的查詢,返回一個Cursor對象。
  •   void beginTransaction():開始事務。
  •   void endTransaction ():結束事務。
  •   void close ():關閉數據庫

  對於查詢方法,會返回一個Cursor對象,Cursor提供如下方法來移動查詢結果的記錄指針。

  • abstract boolean move(int offset):將記錄指針向上或向下移動指定的行數。offset為正數就是向下移動;為負數就是向上移動。
  • abstract boolean moveToFirst():將記錄指針移動到第一行,如果移動成功則返回true。
  • abstract boolean moveToLast():將記錄指針移動到最後行,如果移動成功則返回true。
  • abstract boolean moveToNext():將記錄指針移動到下一行,如果移動成功則返回true。
  • abstract boolean moveToPosition(int position):將記錄指針移動到指定的行,如果移動成功則返回true。
  • abstract boolean moveToPrevious():將記錄指針移動到上一行,如果移動成功則返回true。
  • abstract Xxx getXxx(int columnIndex):獲取該行的指定列的數據。

示例:創建一個數據庫並往其中插入數據。

  1. public class main extends Activity {  
  2.     SQLiteDatabase db;  
  3.     Button bn = null;  
  4.     ListView listView;  
  5.     @Override 
  6.     public void onCreate(Bundle savedInstanceState) {  
  7.         super.onCreate(savedInstanceState);  
  8.         setContentView(R.layout.main);  
  9.           
  10.       //創建或打開數據庫(此處需要使用絕對路徑)  
  11.               db = SQLiteDatabase.openOrCreateDatabase(this.getFilesDir()  
  12.                   .toString() + "/my.db3" , null);          
  13.               listView = (ListView)findViewById(R.id.show);  
  14.               bn = (Button)findViewById(R.id.ok);  
  15.               bn.setOnClickListener(new OnClickListener()  
  16.               {  
  17.     
  18.                   public void onClick(View source)  
  19.                   {  
  20.                       //獲取用戶輸入  
  21.                       String title = ((EditText)findViewById(R.id.title))  
  22.                           .getText().toString();  
  23.                       String content = ((EditText)findViewById(R.id.content))  
  24.                           .getText().toString();  
  25.                       try   
  26.                       {  
  27.                           insertData(db , title , content);  
  28.                           Cursor cursor = db.rawQuery("select * from news_inf", null);  
  29.                           inflateList(cursor);  
  30.                       }  
  31.                       catch(SQLiteException  se)  
  32.                       {  
  33.                           //執行DDL創建數據表  
  34.                           db.execSQL("create table news_inf(_id integer primary key autoincrement," 
  35.                               + " news_title varchar(50)," 
  36.                               + " news_content varchar(255))");  
  37.                           //執行insert語句插入數據  
  38.                           insertData(db , title , content);  
  39.                           //執行查詢  
  40.                           Cursor cursor = db.rawQuery("select * from news_inf", null);  
  41.                           inflateList(cursor);  
  42.                       }  
  43.                   }              
  44.               });          
  45.     }  
  46.       
  47.     private void insertData(SQLiteDatabase db  
  48.             , String title , String content)  
  49.         {  
  50.             //執行插入語句  
  51.             db.execSQL("insert into news_inf values(null , ? , ?)" 
  52.                 , new String[]{title , content});  
  53.         }  
  54.         private void inflateList(Cursor cursor)  
  55.         {  
  56.             //填充SimpleCursorAdapter  
  57.             SimpleCursorAdapter adapter = new SimpleCursorAdapter(  
  58.                     main.this , R.layout.line, cursor   
  59.                 , new String[]{"news_title" , "news_content"}  
  60.                 , new int[]{R.id.my_title , R.id.my_content});  
  61.             //顯示數據  
  62.             listView.setAdapter(adapter);  
  63.         }  
  64.         @Override 
  65.         public void onDestroy()  
  66.         {  
  67.             super.onDestroy();  
  68.             //退出程序時關閉SQLiteDatabase  
  69.             if (db != null && db.isOpen())  
  70.             {  
  71.                 db.close();  
  72.             }  
  73.         }  
  74.       

  PS:通過File Explorer查看Android模擬器文件,發現新創建的數據庫文件在data/data/<package name>/files/目錄下面。

  總結起來,使用SQLiteDatabase對象進行SQLite數據庫操作的大致步驟如下:

  1. 獲取SQLiteDatabase對象,它代表了與SQLite數據庫的連接。
  2. 調用SQLiteDatabase對象的方法來執行SQL語句。
  3. 操作SQL語句的執行結果。
  4. 關閉SQLiteDatabase對象,回收資源。

 

  sqlite3

  在Android的SDK中,提供了一個名為sqlite3.exe的工具(在tools文件夾下)。它是一個簡單的SQLite數據庫管理工具,類似於MySQL提供的命令行窗口。

 

  SQLite支持的數據類型

  SQLite內部只支持NULL、INTEGER、REAL(浮點型)、TEXT(文本)、BLOB(大二進制對象)這五種數據類型。但是實際上SQLite完全可以接受varchar、char、decimal等數據類型,只不過SQLite會在運算或保存時將他們轉換為上面5種數據類型中相應的類型,所以開發者可以不關心聲明該字段所使用的數據類型。

  唯一例外的情況是:定義為INTEGER PRIMARY KEY的字段只能存儲64位整數,當向其插入其他類型數據的時候,SQLite會產生錯誤。

 

  SQLite的事務

  SQLite也支持事務機制,前面已經介紹了SQLiteDatabase包含的兩個控制事務的方法:beginTransaction(開始事務)和endTransaction(結束事務)。除此之外SQLiteDatabase對象還提供了inTransaction方法判斷上下文是否處於事務中,處於返回true,否則返回false。

  對於數據庫的操作,SQLiteDatabase如何判斷提交事務還是回滾事務?

  SQLiteDatabase對象中還存在一個方法setTransactionSuccessful,用於設置事務的標識,如果程序事務執行中調用該方法設置了事務成功,則提交事務,否則程序將回滾事務。最好配合try--finally來處理。

示例:

  1. public void insertDB()  
  2.         {  
  3.             db.beginTransaction();//開始事務  
  4.             try 
  5.             {  
  6.                 //執行DDL創建數據表  
  7.                 db.execSQL("create table news_inf(_id integer primary key autoincrement," 
  8.                     + " news_title varchar(50)," 
  9.                     + " news_content varchar(255))");  
  10.                 //執行insert語句插入數據  
  11.                 insertData(db , "title" , "content");  
  12.                 //執行查詢  
  13.                 Cursor cursor = db.rawQuery("select * from news_inf", null);  
  14.                 inflateList(cursor);  
  15.                 db.setTransactionSuccessful();//執行完設置事務成功;否則endTransaction方法將回滾。  
  16.             }  
  17.             finally 
  18.             {  
  19.                 db.endTransaction();//結束事務  
  20.             }  
  21.         } 

 

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved