編輯:Android開發實例
Android系統集成了一個輕量級的數據庫:SQLite,SQLite是一個嵌入式的數據庫引擎,專門適用於資源有限的設備上(手機、PDA)的適量數據存儲。
Android提供了SQLiteDatabase,它代表了一個SQLite數據庫(底層就是一個數據文件),在個數據庫中理論上是這可以存在無限多個表的。一旦應用程序獲得了代表指定數據庫的SQLiteDatabase對象,就可以通過SQLiteDatabase對象來操作SQLite數據庫。
SQLiteDatabase提供了幾個靜態的方法來打開一個文件對應的數據庫,此處介紹幾個常用的:
在得到SQLiteDatabase對象之後,就可以調用方法執行SQL語句了,在此處介紹幾個常用的方法,是直接執行SQL語句的,需要有SQL語法基礎,如果不熟悉SQL語法,SQLiteDatabase還提供了其他代替方法,此處不在此介紹。
對於查詢方法,會返回一個Cursor對象,Cursor提供如下方法來移動查詢結果的記錄指針。
示例:創建一個數據庫並往其中插入數據。
- public class main extends Activity {
- SQLiteDatabase db;
- Button bn = null;
- ListView listView;
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- //創建或打開數據庫(此處需要使用絕對路徑)
- db = SQLiteDatabase.openOrCreateDatabase(this.getFilesDir()
- .toString() + "/my.db3" , null);
- listView = (ListView)findViewById(R.id.show);
- bn = (Button)findViewById(R.id.ok);
- bn.setOnClickListener(new OnClickListener()
- {
- public void onClick(View source)
- {
- //獲取用戶輸入
- String title = ((EditText)findViewById(R.id.title))
- .getText().toString();
- String content = ((EditText)findViewById(R.id.content))
- .getText().toString();
- try
- {
- insertData(db , title , content);
- Cursor cursor = db.rawQuery("select * from news_inf", null);
- inflateList(cursor);
- }
- catch(SQLiteException se)
- {
- //執行DDL創建數據表
- db.execSQL("create table news_inf(_id integer primary key autoincrement,"
- + " news_title varchar(50),"
- + " news_content varchar(255))");
- //執行insert語句插入數據
- insertData(db , title , content);
- //執行查詢
- Cursor cursor = db.rawQuery("select * from news_inf", null);
- inflateList(cursor);
- }
- }
- });
- }
- private void insertData(SQLiteDatabase db
- , String title , String content)
- {
- //執行插入語句
- db.execSQL("insert into news_inf values(null , ? , ?)"
- , new String[]{title , content});
- }
- private void inflateList(Cursor cursor)
- {
- //填充SimpleCursorAdapter
- SimpleCursorAdapter adapter = new SimpleCursorAdapter(
- main.this , R.layout.line, cursor
- , new String[]{"news_title" , "news_content"}
- , new int[]{R.id.my_title , R.id.my_content});
- //顯示數據
- listView.setAdapter(adapter);
- }
- @Override
- public void onDestroy()
- {
- super.onDestroy();
- //退出程序時關閉SQLiteDatabase
- if (db != null && db.isOpen())
- {
- db.close();
- }
- }
- }
PS:通過File Explorer查看Android模擬器文件,發現新創建的數據庫文件在data/data/<package name>/files/目錄下面。
總結起來,使用SQLiteDatabase對象進行SQLite數據庫操作的大致步驟如下:
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來處理。
示例:
- public void insertDB()
- {
- db.beginTransaction();//開始事務
- try
- {
- //執行DDL創建數據表
- db.execSQL("create table news_inf(_id integer primary key autoincrement,"
- + " news_title varchar(50),"
- + " news_content varchar(255))");
- //執行insert語句插入數據
- insertData(db , "title" , "content");
- //執行查詢
- Cursor cursor = db.rawQuery("select * from news_inf", null);
- inflateList(cursor);
- db.setTransactionSuccessful();//執行完設置事務成功;否則endTransaction方法將回滾。
- }
- finally
- {
- db.endTransaction();//結束事務
- }
- }
JSON代表JavaScript對象符號。它是一個獨立的數據交換格式,是XML的最佳替代品。本章介紹了如何解析JSON文件,並從中提取所需的信息。Android提供了四個
Android通用流行框架大全 1. 緩存 DiskLruCacheJava實現基於LRU的磁盤緩存 2.圖片加載 Android Univer
如上一節中所講的那樣創建了ApiDemo工程後,我們就可以進行每個示例代碼的分
前言 SQLite是一種輕量級的小型數據庫,雖然比較小,但是功能相對比較完善,一些常見的數據庫基本功能也具有,在現在的嵌入式系統中使用該數據庫的比較多,因為