Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android數據存儲 如何搞定SQLite Database

Android數據存儲 如何搞定SQLite Database

編輯:關於Android編程

轉載請注明出處:明桑Android

在Android平台下有各種不同方法可以實現應用程序數據的存儲和管理(SharedPerferences,File,SQLiteDatabase,網絡存儲),方法的選擇依賴於需要存儲的數據類型和數據結構。SQLite數據庫能夠安全而有效地解決結構化數據的存儲問題;

這裡主要介紹SQLite相關的用法,以及對數據庫常見操作的封裝。

最後,作為一個綜合案例,做一個簡單的學生管理的demo,創建student.db,包括name,grade字段,實現增、刪、改、查的功能;Android 數據存儲 利用SQLiteDatabase實現簡單的學生管理

1,SQLite Database簡介

1,什麼是SQLite

SQLite是開源的,支持標准SQL語法的關系型數據庫,支持事務,運行時需要很小的內存(250k);
支持的數據類型包括:Text,INTEGER,REAL(like double in Java),其他的所有數據類型必須轉換成以上數據類型才能被存儲在數據庫中,

SQLite是嵌入在每一個Android設備中的,所以使用SQLite並不需要去安裝和管理數據庫

你所需要做的僅僅是定義SQL語句用來創建和管理數據表

訪問一個SQLite數據庫可能要訪問文件系統,所以建議異步執行數據庫操作;
創建一個數據庫後,默認是存在DATA/APP_NAME/databases/FILENAME下的。

2, SQLite 結構:

在SDK中,android.database包中含數據庫所需要的操作類,android.database.sqlite包含所有關於SQLite數據庫的操作

3,SQLiteOpenHelper類的使用:

創建一個持久化的數據庫,可以通過繼承SQLiteOpenHelper,然後在構造方法中調用

    super(context, DATABASE_NAME, null, VERSION);//傳入定義好的數據庫名和版本;

你還需要覆寫兩個方法:

     @Override
    public void onCreate(SQLiteDatabase sqLiteDatabase) {
        //創建
        sqLiteDatabase.execSQL(CREATE_TABLE);
    }

    @Override
    public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {
        //更新
        sqLiteDatabase.execSQL(DROP TABLE IF EXISTS  + TABLE_NAME);
        onCreate(sqLiteDatabase);
    }

以上兩個方法均接受一個SQLiteDatabase db對象,SQLiteOpenHelper還提供了兩個方法getWritableDatabase(),getReadableDatabase()用來得到SQLiteDatabase對象,

4,SQLiteDatabase

SQLiteDatabase是一個基本數據庫類,用於在Android中提供增刪改查等基礎操作。insert(),update(),delete();另外它還提供了execSQL()方法來直接執行SQL語句;

當我們需要插入或更新數據表時,需要使用ContentValues,ContentValues對象允許定義鍵值對,key指向數據表中的字段,value指向表記錄的內容。

查詢可以通過rawQuery()或者query()方法或者 SQLiteQueryBuilder()方法

rawQuery()直接接受一個SQL select語句作為輸入

Cursor cursor= getReadableDatabase().rawQuery(Select * from TABLE where id=?,new String[]{id});

query()提供了一個結構化的指定接口用於SQL查詢

    Cursor cursor=getReadableDatabase().query(DATABASE_TABE,new String[]{KEY_ROAB,KEY_ID,KEY_NAME,KEY_HH},null,null,null,null);

SQLiteQueryBuilder()用於構建復雜的SQL查詢,比如當有多個數據表且它們之間關系比較復雜時使用。

5, Cursor:

一條查詢返回一個Cursor對象, Cursor主要指向查詢結果的一行,這樣Android可以緩沖查詢結果,而不用將所有數據全部加載到內存;

為了得到查詢結果的數目,可以使用getCount();

為了在查詢的結果上移動,你可以使用moveToFirst(), moveToNext();

isAfterLast()則返回是否已經到達查詢結果的末尾。

Cursor提供get*(),方法比如getLong(columnIndex),getString(columnIndex)獲取查詢結果列的數據,columnIndex代表列數,Cursor還提供了getColumnIndexorThrow(String name)獲取一個表中字段名為name的列的number。

2,Android數據庫操作常用步驟

了解了相關的概念,我們對Android常見的數據庫操作按以下步驟做個總結:

為每一個表創建一個Model類,即對應數據類:
Tips:為每一個表創建一個數據類是很好的建議,而且在表中增設id字段很有必要,因為很多數據庫操作方法要依賴他。

實現DatabaseHandler類

繼承自SQLiteOpenHelper類,實現構造函數(創建表)和覆寫onCreate()、onUpgrade()方法 根據我們的需要封裝CRUD方法(增刪改查) 實現具體的CRUD方法

使用DatabaseHandler類,將數據綁定到界面,通過自定義adapter顯示在adapterView(ListView..GridView等)上。


以聯系人為例,我們需要創建一個關於Contact的數據庫;

1,為Contact建立Model類:

    public class Contact{
          private int id;
          private String name;
          private String number;

        //設置getset方法
          ...
          get()
          set()
        //提供構造函數
          Contact(int id,String name, String number){}
     }

2,創建DatabaseHandler類:

private static final String DATABASE_NAME=Contact;
    private static final String TABLE_NAME=contact;
    private static final int VERSION=1;
    private static final String KEY_ID=id;
    private static final String KEY_NAME=name;
    private static final String KEY_NUMBER=number;

    private static final String CREATE_TABLE=create table +TABLE_NAME+(+KEY_ID+
             integer primary key autoincrement,+KEY_NAME+ text not null,+
            KEY_NUMBER+ text not null);;
    public DatabaseHandler(Context context) {
        super(context, DATABASE_NAME, null, VERSION);
    }

    @Override
    public void onCreate(SQLiteDatabase sqLiteDatabase) {
        sqLiteDatabase.execSQL(CREATE_TABLE);
    }

    @Override
    public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {
        sqLiteDatabase.execSQL(DROP TABLE IF EXISTS  + TABLE_NAME);
        onCreate(sqLiteDatabase);
    }

3,在DatabaseHandler類中封裝增刪改查方法:

public void addContact(Contact Contact){
        SQLiteDatabase db=this.getWritableDatabase();

        //使用ContentValues添加數據
        ContentValues values=new ContentValues();
        values.put(KEY_NAME,student.getName());
        values.put(KEY_GRADE,student.getGrade());
        db.insert(TABLE_NAME, null, values);
        db.close();
    }
    public Contact getContact(String name){
        SQLiteDatabase db=this.getWritableDatabase();

        //Cursor對象返回查詢結果
        Cursor cursor=db.query(TABLE_NAME,new String[]{KEY_ID,KEY_NAME,KEY_NUMBER},
                KEY_NAME+=?,new String[]{name},null,null,null,null);


        Contact contact=null;
        //注意返回結果有可能為空
        if(cursor.moveToFirst()){
            student=new Contact(cursor.getInt(0),cursor.getString(1), cursor.getString(2));
        }
        return contact;
    }
    public int getContactCounts(){
        String selectQuery=SELECT * FROM +TABLE_NAME;
        SQLiteDatabase db=this.getReadableDatabase();
        Cursor cursor=db.rawQuery(selectQuery,null);
        cursor.close();
        return cursor.getCount();
    }
    public List getALllContact(){
        List contactList=new ArrayList();

        String selectQuery=SELECT * FROM +TABLE_NAME;
        SQLiteDatabase db=this.getReadableDatabase();
        Cursor cursor=db.rawQuery(selectQuery,null);
        if(cursor.moveToFirst()){
            do{
                Contact contact=new Contact();
                contact.setId(Integer.parseInt(cursor.getString(0)));
                contact.setName(cursor.getString(1));
                contact.setNumber(cursor.getString(2));
                contactList.add(contact);
            }while(cursor.moveToNext());
        }
        return contactList;
    }
    public int updateContact(Contact contact){
        SQLiteDatabase db=this.getWritableDatabase();
        ContentValues values=new ContentValues();
        values.put(KEY_NAME,contact.getName());
        values.put(KEY_GRADE,contact.getNumber());

        return db.update(TABLE_NAME,values,KEY_ID+=?,new String[]{String.valueOf(contact.getId())});
    }
    public void deleteStudent(Contact contact){
        SQLiteDatabase db=this.getWritableDatabase();
        db.delete(TABLE_NAME,KEY_ID+=?,new String[]{String.valueOf(contact.getId())});
        db.close();
    }

4,在Activity中相關Event Method中調用相應DatabaseHandler中的方法即可


現在已經掌握了基本的數據庫操作,作為練習,實現簡單的學生管理,限於篇幅就放到下篇文章了Android 數據存儲 利用SQLiteDatabase實現簡單的學生管理

 

 

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved