Android之SqlLite數據庫使用


  

  每個應用程序都要使用數據,Android應用程序也不例外,Android使用開源的、與操作系統無關的SQL數據庫—SQLite。SQLite第一個Alpha版本誕生於2000年5月,它是一款輕量級數據庫,它的設計目標是嵌入式的,占用資源非常的低,只需要幾百K的內存就夠了。SQLite已經被多種軟件和產品使用,Mozilla FireFox就是使用SQLite來存儲配置數據的,Android和iPhone都是使用SQLite來存儲數據的。

  SQLite數據庫是D.Richard Hipp用C語言編寫的開源嵌入式數據庫,支持的數據庫大小為2TB。它具有如下特征:

  1、輕量級

    SQLite和C\S模式的數據庫軟件不同,它是進程內的數據庫引擎,因此不存在數據庫的客戶端和服務器。使用SQLite一般只需要帶上它的一個動態庫,就可以享受它的全部功能。而且那個動態庫的尺寸也相當小。

  2、獨立性

    SQLite數據庫的核心引擎本身不依賴第三方軟件,使用它也不需要“安裝”,所以在使用的時候能夠省去不少麻煩。

  3、隔離性

    SQLite數據庫中的所有信息(比如表、視圖、觸發器)都包含在一個文件內,方便管理和維護。

  4、跨平台

    SQLite數據庫支持大部分操作系統,除了我們在電腦上使用的操作系統之外,很多手機操作系統同樣可以運行,比如Android、Windows Mobile、Symbian、Palm等。

  5、多語言接口

    SQLite數據庫支持很多語言編程接口,比如C\C++、Java、Python、dotNet、Ruby、Perl等,得到更多開發者的喜愛。

  6、安全性

    SQLite數據庫通過數據庫級上的獨占性和共享鎖來實現獨立事務處理。這意味着多個進程可以在同一時間從同一數據庫讀取數據,但只有一個可以寫入數據。在某個進程或線程向數據庫執行寫操作之前,必須獲得獨占鎖定。在發出獨占鎖定后,其他的讀或寫操作將不會再發生。

  下面介紹一下如何在Android平台創建SQLite數據庫,方法很簡單,我們需要繼承這個接口類SQLiteOpenHelper,並實現其中的onCreate與onUpgrade方法:

public class MyDatabaseHelper extends SQLiteOpenHelper {
    
    private static final String db_name = "SQLite_db.db";//數據文件的名字
    private static int NUMBER = 1;//當前數據庫版本,用於升級
    private static final String table_name = "students";//表名
    private static String sql = null;//sql語句
    
    public MyDatabaseHelper(Context context) {
        super(context, db_name, null, NUMBER);//數據庫文件保存在當前應用所在包名:<包>/database/
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        sql = "CREATE TABLE " + table_name + " (" + 
                "id            INTEGER         PRIMARY KEY ," + 
                "name        VARCHAR(50)        NOT NULL)";//創建數據庫的SQL語句
        
        db.execSQL(sql);//執行SQL語句
    }

    /**
     * 當數據庫進行升級是調用,這里通過NUMBER值來進行判斷,數據庫是否升級
     */
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        
        //第一種寫法
        sql = "ALTER TABLE " + table_name + " ADD sex VARCHAR(2) NULL"; 
        Log.i("sql", sql);
        db.execSQL(sql);
        
        //第二種寫法
        //db.execSQL("ALTER TABLE students ADD sex VARCHAR(10) NULL");
    }
}

  下面我們在主Activity中創建這個類,然后進行數據的生成:

public class Activityone extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_one);
        
        //創建SqlLite數據庫
        SQLiteOpenHelper helper = new MyDatabaseHelper(this);
        helper.getWritableDatabase();
    }
}

  到這里我們關於SQLite的創建就為大家分享完畢,需要提示的就是onUpgrade()方法,這個方法一般不執行,當我們的數據庫版本發生變化時,才會被執行。


  下面我們來一起學習一下如何在Android中來使用SQLite數據庫,來完成對數據的增、刪、改、查、統計。

  我們通過創建一個管理學生信息的數據庫來完成對SQLite功能的介紹展示,首先為了方便對學生類進行管理,我們先創建一個學生類:

public class tab_students {
    
    public Integer id;//學生Id
    public String name;//學生姓名
    public String password;//學生密碼
    public String school;//學生學校
    
    public tab_students(){
        
    }
    
    public tab_students(int _id,String _name,String _password){
        id=_id;
        name=_name;
        password=_password;
    }
    
    public Integer getId() {
        return id;
    }
    
    public void setId(int id) {
        this.id = id;
    }
    
    public String getName() {
        return name;
    }
    
    public void setName(String _name) {
        name = _name;
    }
    
    public String getPassword() {
        return password;
    }
    
    public void setPassword(String _password) {
        password = _password;
    }
    
    public String getSchool() {
        return school;
    }
    
    public void setSchool(String _school) {
        school = _school;
    }

    @Override
    public String toString() {
        return "id:"+this.getId()+"  name:"+this.getName()+"  password:"+this.getPassword();
    }
    
}

  有了學生類,下面我們創建數據庫配置文件:

public class MyTabOpen extends SQLiteOpenHelper{
    
    private static final String db_sql = "SQLiter.db"; 
    private static int NUMBER = 1;
    private static final String tab_name = "students";
    private static String sql = null;
    
    public MyTabOpen(Context context) {
        super(context, db_sql, null, NUMBER);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        sql = "CREATE TABLE " + tab_name + " (" + 
                "id            INTEGER         PRIMARY KEY ," + 
                "name        VARCHAR(20)        NOT NULL ," +
                "password   VARCHAR(20)     NOT NULL)";
        db.execSQL(sql);
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        
        //在更新數據庫時,因原先數據庫表中已有數據,所以新增加的列屬性只能設置為“可以為空”
        db.execSQL("ALTER TABLE students ADD school VARCHAR(10) NULL");
        
    }

}

  對於這個文件,大家有什么疑問請看上面的SQLite數據庫創建講解。

  這里我們的主Activity的代碼如下,對於主Activity的布局文件,就不在粘代碼了,布局文件全是Button按鈕:

public class Activityone extends Activity {
    
    private static tab_students stu = null;
    private static tab_service ser = null;
    private static int conn = 1;

    private TextView mytext = null;
    private Button mybutton1 = null;//添加數據
    private Button mybutton2 = null;//刪除數據
    private Button mybutton3 = null;//修改數據
    private Button mybutton4 = null;//查詢數據
    private Button mybutton5 = null;//分頁獲取數據
    private Button mybutton6 = null;//獲取數據總數
    private Button mybutton7 = null;//普通頁面跳轉
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_one);
        mytext = (TextView)findViewById(R.id.textview);
        mytext.setText("增刪改查序"+"("+"sql語句"+")");
        
        mybutton1 = (Button)findViewById(R.id.button1);
        mybutton2 = (Button)findViewById(R.id.button2);
        mybutton3 = (Button)findViewById(R.id.button3);
        mybutton4 = (Button)findViewById(R.id.button4);
        mybutton5 = (Button)findViewById(R.id.button5);
        mybutton6 = (Button)findViewById(R.id.button6);
        mybutton7 = (Button)findViewById(R.id.button7);
        
        mybutton1.setOnClickListener(new mybuttonlistener());
        mybutton2.setOnClickListener(new mybuttonlistener());
        mybutton3.setOnClickListener(new mybuttonlistener());
        mybutton4.setOnClickListener(new mybuttonlistener());
        mybutton5.setOnClickListener(new mybuttonlistener());
        mybutton6.setOnClickListener(new mybuttonlistener());
        mybutton7.setOnClickListener(new mybuttonlistener());
        
    }
    
    class mybuttonlistener implements OnClickListener{

        @Override
        public void onClick(View v) {
            switch (v.getId()) {
            case R.id.button1://添加數據
                ser =new tab_service(getApplicationContext());                
                stu = new tab_students(conn++,"小米","abc123");
                ser.save(stu);
                break;

            case R.id.button2://刪除數據
                ser =new tab_service(getApplicationContext());                
                ser.del(1);
                break;
                
            case R.id.button3://修改數據
                ser =new tab_service(getApplicationContext());                
                stu = new tab_students(1,"HTC","acm123");
                ser.update(stu);
                break;
                
            case R.id.button4://查詢數據
                ser =new tab_service(getApplicationContext());                
                stu=ser.find(1);
                System.out.println(stu.toString());                
                break;
                
            case R.id.button5://分頁獲取數據
                ser =new tab_service(getApplicationContext());
                List<tab_students> list = ser.getScrollDate(0,5);
                for(tab_students stu : list){
                    System.out.println(stu.toString());    
                }
                break;
                
            case R.id.button6://獲取數據總數
                long number = 0;
                ser =new tab_service(getApplicationContext());                
                number=ser.gettab();
                System.out.println("數據庫中共有:"+number+"條記錄.");                
                break;

            default:
                Activityone.this.startActivity(new Intent(Activityone.this,Activitytwo.class));//普通跳轉
                break;
            }
        }
    }
}

  大家可能已經看到了,這里我們對SQLite的操作,都是通過tab_service.java類完成了,下面就為大家揭曉如何對SQLite進行操作:

public class tab_service {
    
    private MyTabOpen mytabopen = null;
    private static SQLiteDatabase db = null;
    private static String sql = null;
    private static final String tab_name = "students";
    
    public tab_service(Context context) {
        this.mytabopen = new MyTabOpen(context);//獲得數據庫操作實例
    }

    //添加數據
    public void save(tab_students students){
        db = mytabopen.getWritableDatabase();
        sql = "insert into "+tab_name+"(id,name,password) values(?,?,?)";
        db.execSQL(sql, new Object[]{students.getId(),students.getName(),students.getPassword()});
        db.close();            //為了提高性能sqliter數據庫可以不關閉
    }
    
    //刪除數據
    public void del(Integer id){
        db = mytabopen.getWritableDatabase();
        sql = "delete from "+tab_name+" where id = ?";
        db.execSQL(sql, new Object[]{id});
        db.close();
    }
    
    //更新數據
    public void update(tab_students students){
        db = mytabopen.getWritableDatabase();
        sql = "update "+tab_name+" set name=?,password=? where id=?";
        db.execSQL(sql, new Object[]{students.getName(), students.getPassword(), students.getId()});
        db.close();
    }
    
    //查詢數據
    public tab_students find(Integer id){
        
        //getReadableDatabase()與getWritableDatabase()通過查看源代碼知道,getReadableDatabase()方法在磁盤空間滿的時候,仍能返回數據庫操作實例,不過此時的實例只能用於讀不能寫
        db = mytabopen.getReadableDatabase();
        sql = "select * from "+tab_name+ " where id=?";
        Cursor cur = db.rawQuery(sql, new String[]{id.toString()});
        if(cur.moveToFirst()){
            String name = cur.getString(cur.getColumnIndex("name"));
            String password = cur.getString(cur.getColumnIndex("password"));
            return new tab_students(id,name,password);
        }
        cur.close();
        db.close();
        return null;
    }
    
    //分頁獲取數據
    public List<tab_students> getScrollDate(int again,int last){
        
        List<tab_students> list = new ArrayList<tab_students>();
        db = mytabopen.getReadableDatabase();
        sql = "select * from "+tab_name+ "limit ?,? order by id asc";//根據查詢結果的id對數據進行升序排列
        //sql = "select * from " +tab_name+ " limit ?,?";
        Cursor cur = db.rawQuery(sql, new String[]{String.valueOf(again), String.valueOf(last)});
        while (cur.moveToNext()) {
            int id = cur.getInt(cur.getColumnIndex("id"));
            String name = cur.getString(cur.getColumnIndex("name"));
            String password = cur.getString(cur.getColumnIndex("password"));
            
            tab_students stu = new tab_students(id, name, password);
            list.add(stu);
        }
        cur.close();
        db.close();
        return list;
    }

    //獲取數據總數目
    public long gettab(){
        db = mytabopen.getReadableDatabase();
        sql = "select count(*) from "+tab_name;
        Cursor cur = db.rawQuery(sql, null);
        cur.moveToFirst();
        long result = cur.getLong(0);
        return result;
    }
}

  是不是感覺和我們的SQL數據庫操作一樣,sql語句沒有什么區別,是的,他們完全一致。沒學過數據庫的小朋友是不是已經抓狂啦,不要擔心,Android工程師想到了你們,Android為我們封裝好了一套對SQLite數據庫進行操作的規范,下面我們就一起來學習一下,如何通過Android提供的規范晚場上面的操作。

  這里我們只需要修改一下,我們上面對數據庫操作的類:

public class tab_service_two {
    
    private MyTabOpen mytabopen = null;
    private static SQLiteDatabase db = null;
    private static final String tab_name = "students";
    
    public tab_service_two(Context context) {
        this.mytabopen = new MyTabOpen(context);//獲得數據庫操作實例
    }

    //添加數據
    public void save(tab_students students){
        db = mytabopen.getWritableDatabase();         
        ContentValues values = new ContentValues();
        values.put("id", students.getId());
        values.put("name", students.getName());
        values.put("password", students.getPassword());
        db.insert(tab_name, null, values);
        db.close();
    }
    
    //刪除數據
    public void del(Integer id){
        db = mytabopen.getWritableDatabase();
        db.delete(tab_name, "id=?", new String[]{id.toString()});
        db.close();
    }
    
    //修改數據
    public void update(tab_students students){
        db = mytabopen.getWritableDatabase();
        ContentValues values = new ContentValues();
        values.put("name", students.getName());
        values.put("password", students.getPassword());
        db.update(tab_name, values, "id=?", new String[]{students.getId().toString()});
        db.close();
    }
    
    //查詢數據
    public tab_students find(Integer id){
        //getReadableDatabase()與getWritableDatabase()通過查看源代碼知道,getReadableDatabase()方法在磁盤空間滿的時候,仍能返回數據庫操作實例,不過此時的實例只能用於讀不能寫
        db = mytabopen.getReadableDatabase();
        //當要查詢數據庫表中的所以信息時,第二個參數可以使用設置為空來代替數組
        Cursor cur = db.query(tab_name, new String[]{"name","password"}, "id=?", new String[]{id.toString()}, null, null, null);
        
        if(cur.moveToFirst()){
            String name = cur.getString(cur.getColumnIndex("name"));
            String password = cur.getString(cur.getColumnIndex("password"));
            return new tab_students(id,name,password);
        }
        cur.close();
        db.close();
        return null;
    }
    
    //分頁獲取數據
    public List<tab_students> getScrollDate(int again,int last){
        List<tab_students> list = new ArrayList<tab_students>();
        db = mytabopen.getReadableDatabase();
        
        Cursor cur = db.query(tab_name, null, null, null, null, null, "id asc", again+","+last);
        while (cur.moveToNext()) {
            int id = cur.getInt(cur.getColumnIndex("id"));
            String name = cur.getString(cur.getColumnIndex("name"));
            String password = cur.getString(cur.getColumnIndex("password"));
            
            tab_students stu = new tab_students(id, name, password);
            list.add(stu);
        }
        cur.close();
        db.close();
        return list;
    }

    //獲取數據總數
    public long gettab(){
        db = mytabopen.getReadableDatabase();
        Cursor cur = db.query(tab_name, new String[]{"count(*)"}, null, null, null, null, null);
        cur.moveToFirst();
        long result = cur.getLong(0);
        return result;
    }
}

  好了關於SQLite在Android平台的使用,就為大家介紹完畢,內容很簡單,沒有太大的難度,相信小伙伴一定能理解。新手學習,高手交流。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM