android學習---SQLite方式存儲數據

SQLitehtml

  Android對SQLite數據庫,提供了徹底的支持,而全部建立的SQLite數據庫,僅限於當前應用訪問,若是其餘應用須要訪問,則必須提供的Content Provider的支持,而且SQLite數據庫會隨着Android應用的卸載而被刪除。SQLite是一個嵌入式的數據庫引擎,最後是以文件的形式保存數據的。從本質上來看,SQLite的操做方式只是一種更爲便捷的文件操做,當應用程序建立或打開一個SQLite數據庫時,其實只是打開一個文件準備讀寫。由於SQLite僅適用於資源有限的小型設備,因此自己就不該該把大量數據存儲在設備的SQLite數據庫裏,SQLite只適合存儲一些小型的數據。java

   爲了使SQLite和其餘數據庫間的兼容性最大化,SQLite支持對列上類型進行「類型近似」,列的類型近似指的是存儲在列上的數據進行推薦類型存儲。因此雖然SQLite內部只支持NULL、INTEGER、REAL(浮點書)、TEXT(文本)和BLOB(大二進制對象)這五種數據類型,但實際上SQLite徹底能夠接受varchar(n)、char(n)、decimal(p,s)、date等類型數據,只不過SQLite會在運算或保存時將它們轉換爲上面五種數據類型中相應的類型。大多數數據庫的引擎都是使用靜態的、強類型的數據類型,數據的類型是由它的容器決定的,這個容器是指被存放的特定列。而SQLite使用的是動態類型,在SQLite中,值的數據類型跟值自己相關,而不是與它的容器相關,因此SQLite容許把各類類型的數據保存到任何類型字段中,開發者能夠不用關心聲明該字段說使用的數據類型。可是有一種狀況例外,定義爲INTEGER PRIMARY KEY的字段只能存儲64位整數,當向這種字段保存除整數意外的其餘類型的數據時,SQLite會產生錯誤。android

SQLite數據庫建立與維護sql

  從官方文檔上了解到,在Android項目中,建立SQLite數據庫推薦繼承SQLiteOpenHelper類,而後重寫其中的onCreate()方法,在onCreate()方法中,對執行數據庫建立的SQL語句。而SQLiteOpenHelper不單單用於SQLite數據的建立,還能夠對其進行維護,以及得到SQLiteDatabase這個數據庫操做對象。數據庫

  SQLiteOpenHelper提供了兩個構造器,用於傳遞當前上下文對象以及SQLite數據庫版本信息,在SQLiteOpenHelper的繼承類的構造函數中,會調用它,構造器的簽名以下:ide

  • SQLiteOpenHelper(Context context,String name,SQLiteDatabase.CursorFactory factory,int version).
  • SQLiteOpenHelper(Context context,String name,SQLiteDatabase.CursorFactroy factory,int version,DatabaseErrorHandler errorHandler).

  上面的構造函數中,都是用於建立一個SQLite數據庫,context爲一個當前應用的上下文對象;name是數據庫名稱;factory是一個容許子類在查詢時使用的遊標,通常不用傳Null;version是數據庫版本號;errorHandler是一個接口,傳遞當數據庫錯誤的時候,執行的補救方法。函數

  在SQLiteOpenHelper中,能夠進行SQLite數據庫的建立、維護、日誌以及獲取可讀寫的數據庫對象,經過下面幾個經常使用方法獲得支持:測試

  • String getDatabaseName():獲取數據庫名。
  • SQLiteDatabase getReadableDatabase():建立或者打開一個可讀的數據庫對象。
  • SQLiteDatabase getWritableDatabase():建立或者打開一個可讀/寫的數據庫對象。
  • abstract void onCreate(SQLiteDatabase db):當第一次調用SQLiteOpenHelper的時候執行,以後再次調用將再也不執行,通常用於完成數據庫初始化的工做。
  • void onUpgrade(SQLiteDatabase db,int oldVersion,int newVersion):當數據庫版本號發生向上更新時,被執行。
  • void onDowngrade(SQLiteDatabase db,int oldVersion,int newVersion):當數據庫版本號發生向下更新時,被執行。

  下面提供一個簡單的SQLiteOpenHelper的繼承類代碼,用於建立數據庫以及表結構:spa

package com.leaf.android.db;

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

public class DbOpenHelp extends SQLiteOpenHelper {

    private static String name = "mydb.db";// 表示數據庫名稱
    private static int version = 1;// 表示數據庫的版本號碼

    public DbOpenHelp(Context context) {
        super(context, name, null, version);
    }

    // 當數據庫建立的時候,是第一次被執行,完成對數據庫的表的建立
    @Override
    public void onCreate(SQLiteDatabase db) {
        // 支持的數據類型:整型數據,字符串類型,日期類型,二進制的數據類型,
        String sql = "create table person(id integer primary key autoincrement,name varchar(64), address varchar(64))";
        db.execSQL(sql);
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        String sql = "alter table person add sex varcha(8)";
        db.execSQL(sql);
    }

}

Tips:當建立好SQLite數據庫的以後,能夠在/data/data/<package name>/databases目錄下找到SQLite數據庫文件。日誌

執行CRUD操做

  當使用SQLiteOpenHelper的getReadableDatabase()或者getWritableDatabase()方法獲取到SQLiteDatabase對象,就能夠對這個數據庫進行操做了。

  對於熟悉SQL語句的開發者而言,其實只須要使用兩個方法,便可執行全部CRUD操做,如下方法提供多個重載方法:

  • void execSQL():經過SQL語句執行一條非查詢語句。
  • Cursor rawQuery():經過SQL語句執行一條查詢語句。

  下面以一個示例講解一下單純使用SQL語句實現CRUD操做:

  接口代碼:

package com.leaf.android.service;

import java.util.List;
import java.util.Map;

public interface PersonService {

    public boolean addPerson(Object[] params);

    public boolean deletePerson(Object[] params);

    public boolean updatePerson(Object[] params);

    public Map<String, String> viewPerson(String[] selectionArgs);

    public List<Map<String, String>> listPersonMaps(String[] selectionArgs);
}

接口的實現代碼:

package com.leaf.android.dao;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;

import com.leaf.android.db.DbOpenHelp;
import com.leaf.android.service.PersonService;

public class PersonDao implements PersonService {

    private DbOpenHelp helper = null;

    public PersonDao(Context context) {
        helper = new DbOpenHelp(context);
    }

    public boolean addPerson(Object[] params) {
        boolean flag = false;
        // 實現對數據庫的添加刪除和修改查詢的功能
        SQLiteDatabase database = null;
        try {
            String sql = "insert into person(name, address, sex) value(?,?,?) ";
            database = helper.getWritableDatabase();// 實現對數據庫的寫的操做
            // 執行SQL
            database.execSQL(sql, params);
            flag = true;
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (database != null) {
                // finally中關閉數據庫
                database.close();
            }
        }
        return flag;
    }

    public boolean deletePerson(Object[] params) {
        boolean flag = false;
        SQLiteDatabase database = null;
        try {
            // 刪除一條數據
            String sql = "delete from person where id = ?";
            database = helper.getWritableDatabase();
            database.execSQL(sql, params);
            flag = true;
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (database != null) {
                database.close();
            }
        }
        return flag;
    }

    public boolean updatePerson(Object[] params) {
        boolean flag = false;
        SQLiteDatabase database = null;
        try {
            String sql = "update person set name = ? , address = ?, sex = ?, where id = ?";
            database = helper.getWritableDatabase();
            database.execSQL(sql, params);
            flag = true;
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (database != null) {
                database.close();
            }
        }
        return flag;
    }

    public Map<String, String> viewPerson(String[] selectionArgs) {
        Map<String, String> map = new HashMap<String, String>();
        SQLiteDatabase database = null;
        try {
            String sql = "select * from person where id = ?";
            database = helper.getWritableDatabase();
            Cursor cursor = database.rawQuery(sql, selectionArgs);
            // 得到數據庫的列的個數
            int colums = cursor.getColumnCount();
            while (cursor.moveToNext()) {
                for (int i = 0; i < colums; i++) {
                    String cols_name = cursor.getColumnName(i);
                    String cols_value = cursor.getString(cursor
                            .getColumnIndex(cols_name));
                    if (cols_value == null) {
                        cols_value = "";
                    }
                    map.put(cols_name, cols_value);
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (database != null) {
                database.close();
            }
        }
        return map;
    }

    public List<Map<String, String>> listPersonMaps(String[] selectionArgs) {
        List<Map<String, String>> list = new ArrayList<Map<String, String>>();
        String sql = "selece * from person";
        SQLiteDatabase database = null;
        try {
            database = helper.getWritableDatabase();
            Cursor cursor = database.rawQuery(sql, selectionArgs);
            int colums = cursor.getColumnCount();
            while (cursor.moveToNext()) {
                Map<String, String> map = new HashMap<String, String>();
                for (int i = 0; i < colums; i++) {
                    String cols_name = cursor.getColumnName(i);
                    String cols_value = cursor.getString(cursor
                            .getColumnIndex(cols_name));
                    if (cols_value == null) {
                        cols_value = "";
                    }
                    map.put(cols_name, cols_value);
                }
                list.add(map);
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (database != null) {
                database.close();
            }
        }
        return null;
    }

}

再寫一個測試類測試這個數據操做類是否有效

package com.leaf.android.test;

import java.util.List;
import java.util.Map;

import android.test.AndroidTestCase;
import android.util.Log;

import com.leaf.android.dao.PersonDao;
import com.leaf.android.db.DbOpenHelp;
import com.leaf.android.service.PersonService;

public class MyTest extends AndroidTestCase {

    private final String TAG = "main";

    public MyTest() {
    }

    public void createDb() {
        DbOpenHelp helper = new DbOpenHelp(getContext());
        helper.getWritableDatabase();
    }

    public void insertDb() {
        PersonService service = new PersonDao(getContext());
        Object[] params1 = { "張龍", "beijing", "male" };
        boolean flag = service.addPerson(params1);
        Object[] params2 = { "趙虎", "shanghai", "male" };
        flag = flag && service.addPerson(params2);
        Object[] params3 = { "王朝", "HK", "male" };
        flag = flag && service.addPerson(params3);
        Object[] params4 = { "馬漢", "beijing", "female" };
        flag = flag && service.addPerson(params4);
        Log.i(TAG, "-----插入數據----->>" + flag);
    }

    public void deleteDb() {
        PersonService service = new PersonDao(getContext());
        Object[] params = { 1 };
        boolean flag = service.deletePerson(params);
        Log.i(TAG, "-----刪除數據----->>" + flag);
    }

    public void updateDb() {
        PersonService service = new PersonDao(getContext());
        Object[] params = { "張三", "上海", "男", "2" };
        boolean flag = service.updatePerson(params);
        Log.i(TAG, "---------->>" + flag);
    }

    public void getDb() {
        PersonService service = new PersonDao(getContext());
        Map<String, String> map = service.viewPerson(new String[] { "2" });
        Log.i(TAG, "---------->>" + map.toString());
    }

    public void listDb() {
        PersonService service = new PersonDao(getContext());
        List<Map<String, String>> list = service.listPersonMaps(null);
        Log.i(TAG, "---------->>" + list.toString());
    }

}

 

原文連接:http://www.cnblogs.com/plokmju/p/android_SQLite.html

相關文章
相關標籤/搜索