Android数据存储 如何搞定SQLite Database

转载请注明出处:明桑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常见的数据库操作按以下步骤做个总结:

  1. 为每一个表创建一个Model类,即对应数据类:
    1. Tips:为每一个表创建一个数据类是很好的建议,而且在表中增设id字段很有必要,因为很多数据库操作方法要依赖他。
  2. 实现DatabaseHandler类

    1. 继承自SQLiteOpenHelper类,实现构造函数(创建表)和覆写onCreate()、onUpgrade()方法
    2. 根据我们的需要封装CRUD方法(增删改查)
    3. 实现具体的CRUD方法
  3. 使用DatabaseHandler类,将数据绑定到界面,通过自定义adapter显示在adapterView(ListView..GridView等)上。


以联系人为例,我们需要创建一个关于Contact的数据库;

1,为Contact建立Model类:

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

        //设置get\set方法
          ...
          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<Contact> getALllContact(){
        List<Contact> contactList=new ArrayList<Contact>();

        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实现简单的学生管理

总结:

这里没有过多讲解SQL语法,只涉及Android中基本的SQLiteDatabase的常见操作,如果你还不太熟悉的话,可以参考下面这篇文章。

参考资料:Android SQLite Database Tutorial


  • 微博: @明桑Android黑历史
  • 邮箱: <[email protected]>
  • 个人主页: 明桑战胜Android汪的黑历史
  • 微信公众号: ITBird

    技术分享

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。