Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> 跟我學Android之十三 SQLite數據庫操作

跟我學Android之十三 SQLite數據庫操作

編輯:關於Android編程

本章內容

第1節 SQLite數據庫概述

第2節 SQLite建庫建表

第3節管理數據庫連接

第4節 操作數據庫數據

第5節 數據綁定

本章目標

掌握SQLite數據的基本特點與工具使用。

熟練掌握SQLite建庫建表的方法。

熟練掌握連接SQLite數據庫的方法。

熟悉SQLite數據庫的升級與建立方法。

掌握通過數據綁定完成數據顯示的方法。

SQLite數據庫簡介

SQLite是一種非常流行的嵌入式數據庫,是由C語言編寫而成,是一款輕型關系型數據庫,支持SQL,支持多種操作系統,完全獨立運行,沒有依賴性,Android內嵌了SQLite數據庫。


SQLite數據庫工具是用來操作數據庫文件的工具,官方網站提供了命令行工具的下載。


http://www.sqlite.org/download.html


下載sqlite-shell-******.zip文件

解壓縮後只有一個文件sqlite3,將sqlite3所在的路徑加入path環境變量,Sqlite3工具的使用,連接數據庫文件。


$ sqlite3<數據庫文件路徑>

SQLite數據庫工具是用來操作數據庫文件的工具

uSqlite3工具的使用

?數據庫的相關管理命令都是以.開頭,常用命令如下

\

SQLite數據庫工具是用來操作數據庫文件的工具

sqlite3工具的使用,在sqlite3的命令行下可以直接輸入標准sql語句,除了sqlite3以外,還有很多非官方的可視化管理工具

SQLite Database Browser

SQLite Expert Professional

SQLite Develope

SQLite與大型數據庫的區別

兩者都是支持關系的關系型數據庫,SQLite是一個嵌入型的輕量級數據庫,適合小數據量,大型數據庫獨立運行在數據庫服務器上,適合大數據量級別,大型數據庫通常以網絡的方式對外提供服務。


*創建SQLite數據庫


$ sqlite3 test.db


直接在命令行輸入上面的命令,如果test.db不存在,則預創建(直到執行相關sql才創建文件),如果test.db存在,則連接數據庫


$ sqlite3 test.db

上述命令可以在創建數據庫的同時使用sql.script進行初始化


SQLite數據庫的數據類型

SQLite數據中的列可以存儲任意數據類型的數據

為了與其他數據庫兼容,可以為字段指定默認的類型

NULL:空值

INTEGER: 帶符號的整數,具體取決於存入數字的范圍大小

REAL:浮點數,存儲為8-bytes的浮點數

TEXT:字符串文本

BLOB:二進制對象

同時還接受如下一些類型:

smallint16位整數

int32位整數

float 32位浮點數

double 64位浮點數

SQLite數據庫的數據類型

為了與其他數據庫兼容,可以為字段指定默認的類型

同時還接受如下一些類型:

char(n)n不能炒作254

varchar(n)n不能超過4000

date

time

limestamp

創建SQLite數據表,通過SQL語句創建表


create table books (
        id integer primary key autoincrement,
        name varchar(128) not null unique,
        author varchar(128) not null,
        price double not null
);

*創建表間關聯(也就是通過外鍵建立關系)


create table groups(
        id integer primary key autoincrement,
        name varchar(128) not null unique
);

crate table users(
        id integer primary key autoincrement,
        group_id integer constraint fk_users_group_id references groups(id),
        username varchar(128) not null
        password varchar(128) not null
);

事務控制

SQLite支持數據庫事務

sqlite> begin;
sqlite> insert into ……
sqlite> commit;
sqlite> rollabck;

 

Android系統中SQLite數據庫文件的保存位置

默認情況下,數據庫文件保存在如下目錄中:

/data/data/<應用程序包>/databases

用戶也可以指定將文件保存在任意有權限的目錄中,通常SD卡中的目錄都可以,在Android系統中連接數據庫,使用SQLiteDatabase類連接數據庫

SQLiteDatabase  db = SQLiteDatabase.openOrCreateDatabase(dbFile, null);

通過SQLiteOpenHelper類來連接數據庫

public class MyHelper extends SQLiteOpenHelper {
        public static final int VERSION = 1;
        public static final String DATABASE_NAME = “test.db”;
        public MyHelper(Context context) {
                super(context, DATABASE_NAME, null, VERSION);
        }
}

SQLiteDatabase  db = helper.getWritableDatabase();


數據庫升級與存在性檢測,當應用升級的時候,需要檢測數據庫是否存在,或者是否要升級,SQLiteOpenHelper提供了創建與升級的能力


public MyHelper(Context context) {
        super(context, DATABASE_NAME, null, VERSION);
}

覆蓋onCreate(SQLiteDatabase db)方法,完成創建任務


 public void onCreate(SQLiteDatabase db) {  
       String str_sql = "CREATE TABLE " + TABLE_NAME
                + "(” + ID 
                + " INTEGER PRIMARY KEYAUTOINCREMENT,”
                + TEXT + " text);"; 
       db.execSQL(str_sql); 
} 

數據庫升級與存在性檢測,覆蓋onUpdate方法,完成升級任務


 public void onUpgrade(SQLiteDatabase db, int oldVersion, 
                int newVersion) { 
        //這裡填寫數據庫升級操作的代碼
}

合理關閉數據庫連接

不再使用或長時間不用時,應關閉數據庫連接

程序退出時

程序暫停時

不再需要操作數據庫時

使用SQLiteDatabase類中的close方法關閉連接


執行查詢(假設已經存在了數據庫連接句柄db)

在SQLiteDatabase中提供了如下方法用於查詢

execSQL

insert、insertOrThrow、insertWithOnConflict

query、rawQuery

replace、replaceOrThrow

update、updateWithOnConflict

delete

執行查詢(假設已經存在了數據庫連接句柄db),插入記錄示例


//將一條新記錄的各個字段內容裝入一個ContentValues對象
ContentValues cv = new ContentValues();
cv.put("name",user.getName());
cv.put("age",user.getAge());
cv.put("remark",user.getRemark());
//插入一條新記錄
db.insert("users",null, cv);

執行查詢(假設已經存在了數據庫連接句柄db)

u刪除記錄示例


//第一個參數為表名
//第二個參數表示where後的條件表達式,可以使用?
//第三個參數則是一個對應每一個?值的數組
db.delete("users", "id=?", new String[]{String.valueOf(userId)});

更新記錄示例

ContentValues cv = new ContentValues();
cv.put("name", user.getName());
cv.put("age", user.getAge());
cv.put("remark", user.getRemark());

db.update("users", cv, "id=?", 
        new String[]{String.valueOf(userId)});

執行查詢(假設已經存在了數據庫連接句柄db)

u單表查詢所有記錄示例

Cursor c = db.query("users", null, null, null, null, null, "name");
List users = null;
if(c != null) {
        users = new ArrayList();
        while(c!=null && c.moveToNext()) {
                User u = new User();
                u.setId(c.getInt(0));
                u.setName(c.getString(1));
                u.setAge(c.getInt(2));
                u.setRemark(c.getString(3));
                users.add(u);
        }
        c.close();
}

執行查詢(假設已經存在了數據庫連接句柄db)

單表條件查詢記錄示例


Cursor c = db.query(
        “users”,  //表名
        new String[]{“name”, “age”}, //select包含的字段 
        “age > ?”,  //where條件表達式
        new String[]{“10”},  //條件值
        null,  //group子句
        null,  //having子句
        “name desc” //排序字段
);


執行查詢(假設已經存在了數據庫連接句柄db)

任意SQL條件查詢記錄示例

String sql = “select name, age from users where age > ?”
Cursor c = db.query(
        sql
        new String[]{“10”}
);

事務是確保數據庫操作原子性的保障

SQLiteDatabase提供了如下方法用於事務處理

beginTransaction開啟事務

setTransactionSuccessful 提交事務

endTransaction 關閉事務,如果未提交事務,則自動rollback

db.beginTransaction(); //開始事務
try {
        …… //這裡填寫數據庫操作代碼
        db.setTransactionSuccessful();  //提交事務
} finally {
        db.endTransaction(); //關閉事務
}
數據綁定的必要性

數據綁定是指將界面和數據進行綁定,在界面和數據之間建立綁定模式有助於數據的呈現

Adapter其實就是界面和數據之間綁定的橋梁,將視圖和數據綁定後將會降低維護數據的復雜度

SimpleCursorAdapter提供了數據層的數據綁定橋梁

SimpleCursorAdapter可以將數據庫層的數據提供給列表

1、准備一個列表項的布局用於ListView的展現


    
        



SimpleCursorAdapter可以將數據庫層的數據提供給列表

2、使用SimpleCursorAdapter展現數據


ListView bookListView = (ListView)findViewById(R.id.booklist);
String [] from = new String[] { "_name", "_age“ };
int [] to = new int[] { R.id.nametextview, R.id.agetextview };

Cursor cursor = db.rawQuery(“select * from books”, null);
SimpleCursorAdapter adapter = new 
        SimpleCursorAdapter(MainActivity.this, 
                R.layout.book_list_item, cursor, from, to, 0);
bookListView.setAdapter(adapter);

修改綁定數據

有時候直接展現的數據可能不符合要求,需要轉變後展示,可以通過SimpleCursorAdapter.ViewBinder接口來實現

修改的步驟如下:

1、編寫一個類實現SimpleCursorAdapter.ViewBinder接口

 

 

SimpleCursorAdapter.ViewBinder viewBinder = new 
        SimpleCursorAdapter.ViewBinder() {
        public boolean setViewValue(View view, Cursor cursor, 
                int columnIndex) {
                if(cursor.getColumnIndex("_name") == columnIndex) {
                        TextView v = (TextView)view;
                        v.setText("N:" + cursor.getString(columnIndex));
                        return true;
                }
                return false;
        }
};

修改綁定數據

修改的步驟如下:

2、使用ViewBinder修改數據

ListView bookListView = (ListView)findViewById(R.id.booklist);
String [] from = new String[] { "_name", "_age“ };
int [] to = new int[] { R.id.nametextview, R.id.agetextview };

Cursor cursor = db.rawQuery(“select * from books”, null);
SimpleCursorAdapter adapter = new 
        SimpleCursorAdapter(MainActivity.this, 
                R.layout.book_list_item, cursor, from, to, 0);
adapter.setViewBinder(viewBinder);
bookListView.setAdapter(adapter);
  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved