標籤:
Android作為一個應用在行動裝置上的作業系統,自然也就少不了資料的儲存。然而SQLite作為一個輕型的關係型資料庫,基於其輕量、跨平台、多語言介面及安全性等諸多因數考慮,因而Android較大的資料存放區採用了SQLite。SQLite與大多數關係型資料庫一樣都遵循ACID,文法也非常相似。只要您懂得mysql、sqlserver等關係型資料庫的操作,只要查看下SQLite的官方文檔便可快速上手。SQLite文法您可通過http://sqlite.org/lang.html進行查看。
接下來看看Android是怎樣操作SQLite的吧。Android下只要擴充SQLiteOpenHelper介面,並實現其Create和update方法便可以便捷地對SQLite進行管理。下面看下資料庫管理類。
package com.example.ibm.myappsqllite;import android.content.Context;import android.database.sqlite.SQLiteDatabase;import android.database.sqlite.SQLiteOpenHelper;/** * Created by ibm on 2015/9/11. */public class Db extends SQLiteOpenHelper { public Db(Context context, int version) { super(context, "db", null, version);//可以根據最後一個參數的version來完成表的自動建立和升級 } @Override public void onCreate(SQLiteDatabase db) { String sql = "CREATE TABLE user(" + "id integer primary key autoincrement, " + "name TEXT DEFAULT \"\"," + "sex TEXT DEFAULT \"\")"; System.out.println("建立資料庫:" + sql); db.execSQL(sql); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {//更新資料庫 String sql = "ALTER TABLE user ADD COLUMN mark TEXT DEFAULT \"\""; System.out.println("更新資料庫:" + sql); db.execSQL(sql); }}
在MainActivity.java中的onCreate方法添加如下代碼。
Db db = new Db(this, 1); //清空資料 SQLiteDatabase sqLiteDb = db.getWritableDatabase(); System.out.println("------------清空表資料------------"); sqLiteDb.delete("user", null, null); System.out.println("------------儲值表自增ID------------"); sqLiteDb.execSQL("update sqlite_sequence SET seq = 0 where name =‘user‘;");//重設id sqLiteDb.close();// 寫入資料 System.out.println("------------寫入資料------------"); sqLiteDb = db.getWritableDatabase(); ContentValues cv = new ContentValues(); cv.put("name", "王五"); cv.put("sex", "男"); sqLiteDb.insert("user", null, cv); cv = new ContentValues(); cv.put("name", "李利"); cv.put("sex", "女"); sqLiteDb.insert("user", null, cv); sqLiteDb.close();// 查詢資料 db = new Db(this, 2); System.out.println("------------查詢資料1------------"); SQLiteDatabase sqLiteDbup = db.getReadableDatabase(); Cursor c = sqLiteDbup.query("user", new String[]{"id", "name", "sex"}, null, null, null, null, null); while (c.moveToNext()) { Integer id = c.getInt(c.getColumnIndex("id")); String name = c.getString(c.getColumnIndex("name")); String sex = c.getString(c.getColumnIndex("sex")); System.out.println(String.format("id: %d, name: %s, sex: %s", id, name, sex)); } sqLiteDbup.close();//更新資料 System.out.println("------------更新資料------------"); SQLiteDatabase sqldb = db.getWritableDatabase(); ContentValues contentValues = new ContentValues(); contentValues.put("sex", "gay"); contentValues.put("mark", "wang wu is gay"); String[] whereValues = {"王五"}; sqldb.update("user", contentValues, "name = ?", whereValues); sqldb.close();// 查詢資料 System.out.println("------------查詢資料2------------"); sqLiteDbup = db.getReadableDatabase(); c = sqLiteDbup.query("user", new String[]{"id", "name", "sex", "mark"}, null, null, null, null, null); while (c.moveToNext()) { Integer id = c.getInt(c.getColumnIndex("id")); String name = c.getString(c.getColumnIndex("name")); String sex = c.getString(c.getColumnIndex("sex")); String mark = c.getString(c.getColumnIndex("mark")); System.out.println(String.format("id: %d, name: %s, sex: %s, mark: %s", id, name, sex, mark)); } sqLiteDbup.close(); //刪除資料 System.out.println("------------刪除資料------------"); sqldb = db.getWritableDatabase(); String[] delWhere = {"李利"}; sqldb.delete("user", "name = ?", delWhere); sqldb.close();// 查詢資料 System.out.println("------------查詢資料3------------"); sqLiteDbup = db.getReadableDatabase(); c = sqLiteDbup.query("user", new String[]{"id", "name", "sex", "mark"}, null, null, null, null, null); while (c.moveToNext()) { Integer id = c.getInt(c.getColumnIndex("id")); String name = c.getString(c.getColumnIndex("name")); String sex = c.getString(c.getColumnIndex("sex")); String mark = c.getString(c.getColumnIndex("mark")); System.out.println(String.format("id: %d, name: %s, sex: %s, mark: %s", id, name, sex, mark)); } sqLiteDbup.close(); db.close();
將應用運行到虛擬機器後,你可以看到如下結果
09-11 18:58:29.460 6647-6647/com.example.ibm.myappsqllite I/System.out﹕ 建立資料庫:CREATE TABLE user(id integer primary key autoincrement, name TEXT DEFAULT "",sex TEXT DEFAULT "")09-11 18:58:29.500 6647-6647/com.example.ibm.myappsqllite I/System.out﹕ ------------清空表資料------------09-11 18:58:29.532 6647-6647/com.example.ibm.myappsqllite I/System.out﹕ ------------儲值表自增ID------------09-11 18:58:29.532 6647-6647/com.example.ibm.myappsqllite I/System.out﹕ ------------寫入資料------------09-11 18:58:29.616 6647-6647/com.example.ibm.myappsqllite I/System.out﹕ ------------查詢資料1------------09-11 18:58:29.628 6647-6647/com.example.ibm.myappsqllite I/System.out﹕ 更新資料庫:ALTER TABLE user ADD COLUMN mark TEXT DEFAULT ""09-11 18:58:29.640 6647-6647/com.example.ibm.myappsqllite I/System.out﹕ id: 1, name: 王五, sex: 男09-11 18:58:29.644 6647-6647/com.example.ibm.myappsqllite I/System.out﹕ id: 2, name: 李利, sex: 女09-11 18:58:29.644 6647-6647/com.example.ibm.myappsqllite I/System.out﹕ ------------更新資料------------09-11 18:58:29.668 6647-6647/com.example.ibm.myappsqllite I/System.out﹕ ------------查詢資料2------------09-11 18:58:29.684 6647-6647/com.example.ibm.myappsqllite I/System.out﹕ id: 1, name: 王五, sex: gay, mark: wang wu is gay09-11 18:58:29.684 6647-6647/com.example.ibm.myappsqllite I/System.out﹕ id: 2, name: 李利, sex: 女, mark:09-11 18:58:29.688 6647-6647/com.example.ibm.myappsqllite I/System.out﹕ ------------刪除資料------------09-11 18:58:29.708 6647-6647/com.example.ibm.myappsqllite I/System.out﹕ ------------查詢資料3------------09-11 18:58:29.716 6647-6647/com.example.ibm.myappsqllite I/System.out﹕ id: 1, name: 王五, sex: gay, mark: wang wu is gay
此時可以查看下模擬器中的/data/data/項目包/databases/目錄下,已經存在了一個db資料庫(名字為前面定義的資料庫名)。
Android資料存放區之SQLite的操作