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


时间: 2024-11-15 03:58:35

Android数据存储 如何搞定SQLite Database的相关文章

从零开始学android&lt;数据存储(4)Sqlite数据库存储.三十八.&gt;

从前几章我们分别学习了属性文件存储输数据,内储存存储数据,和外部储存存储数据,今天我们来学习一下android 轻量级数据库Sqlite数据库的数据存储 首先必须了解SQLiteOpenHelper SQLiteDatabase类本身只是一个数据库的操作类,但是如果要想进行数据库的操作,还需要一个android.database.sqlite.SQLiteOpenHelper类帮助下才可以取得进行,但是,SQLiteOpenHelper类是一个抽象类,所以要使用的时候需要定义其子类,并且在子类中

Android 数据存储 利用SQLiteDatabase实现简单的学生管理

转载请注明出处:明桑Android 这是作为上一篇Android 数据存储 如何搞定SQLite Database的实例练习,之所以单独列出来是因为除了数据库方面的知识,还涉及其它方面的知识,所以就写的详细点,啰嗦点.希望对初学者有所帮助.当然这个Demo比较简单,有很多可以改进的地方,但那不是这里探讨的重点,重点学习如何将SQLiteDatabase数据绑定到我们的界面! 本文代码地址:UseSQLitDatabase 我们要做一个简单的学生管理的demo,创建student.db,包括nam

Android 数据存储——SQLite实例、判断数据库中表是否存在

本文主要记录一下Android SQLiteDatabase中如何判断数据库中表是否存在,以及测试SQLiteDatabase数据库的基本操作.有关SQLite的详细说明,可以查看转载的Android 数据存储--SQLite使用详解 例子: AndroidManifest.xml--没有做任何修改,创建工程默认 <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="

android 数据存储的几种方式

总体的来讲,数据存储方式有三种:一个是文件,一个是数据库,另一个则是网络.其中文件和数据库可能用的稍多一些,文件用起来较为方便,程序可以自己定义格式:数据库用起稍烦锁一些,但它有它的优点,比如在海量数据时性能优越,有查询功能,可以加密,可以加锁,可以跨应用,跨平台等等:网络,则用于比较重要的事情,比如科研,勘探,航空等实时采集到的数据需要马上通过网络传输到数据处理中心进行存储并进行处理. 对于Android平台来讲,它的存储方式也不外乎这几种,按方式总体来分,也是文件,数据库和网络.但从开发者的

10、Android数据存储

课程目标: 掌握Android中数据存储的几种方式 熟练使用PreferenceActivity&PreferenceScreen做专业的Setting功能 熟练使用SQLite3来存储数据 深入研究SQLite3数据库特性,并且比对与大型数据库的包括存储过程,主外键关联等特性 了解文件存储的内外存储分别  了解网络存储C/S结构原理 . 重点难点:SQLiteOpenHelper类的使用   SQLIte数据库的特性掌握 考核目标: 说出Android数据存储的几种形式 ? Sqlite3能支

【Android的从零单排开发日记】之入门篇(八)——Android数据存储(下)

废话不多说了,紧接着来讲数据库的操作吧.Come On! 提到数据存储问题,数据库是不得不提的.数据库是用来存储关系型数据的不二利器.Android为开发者提供了强大的数据库支持,可以用来轻松地构造基于数据库的应用.Android的数据库应用,依托于当下最流行的开源嵌入式数据库SQLite.在Android中,应用的数据库文件是该应用私有的,存储在应用数据目录下的databases子目录内.从代码结构来看,Android的数据库实现可以分成两个层次,在底层通过C++调用SQLite的接口来执行S

android数据存储_SQL数据库

源码下载(免下载积分):下载 对于保存重复或者结构化的数据数据,使用数据库很好的.在android对于数据库的API在 android.database.sqlite包中. 创建并操作数据库: 创建: 1. 继承SQLiteOpenHelper //继承SQLiteOpenHelper类, public class DictionaryOpenHelper extends SQLiteOpenHelper{ 2. 定义相关的成员变量和常量 public static final String D

Android——数据存储(四种方式之一)SharedPrefereces

Android--数据存储(四种方式) 1.SharedPrefereces   轻量级.XML  存储文件名,数据保存在data/data/basepackage/shared_prefs/myopt.xml中   实例-收藏-记住密码自动登录 //一种轻量级的数据存储方式//通过KEY 存入数据--putxxxx(key,value) 取出数据--getxxxx(key  default)   2.读写SD卡  SD的根目录  适用于数据流读写 3.SQLite  轻量级.dp文件多用于手机

Android 数据存储方式分为哪几种?

10道题值得思考 第一道题 1.Android 数据存储方式分为哪几种? SharedPreferences存储数据 2. CotentProvider内容提供者 3. 文件存储 4. 数据库存储(Sqlite) 5.网络存储 2. NDK是什么? 1. 一系列工具类的集合 2. Arm指令集 3. NDK提供了一系列的工具,帮助开发者快速开发C(或C++)的动态库,并能自动将so和java应用一起打包成apk.这些工具对开发者的帮助是巨大的. NDK集成了交叉编译器,并提供了相应的mk文件隔离