Android SQLite 基本使用方法

354 阅读4分钟

SQLite 简介

SQLite 是一种 Android 原生小型数据库,可以用来存储重复数据或结构化数据(例如联系信息)。将数据保存在SQLite数据库中后,Android 会将这些数据存储在你的应用的私人文件夹内,设备中的其他应用未经授权无法访问这些私人文件夹。

不要在主线程进行数据库操作,会造成程序长时间相应,弹出dialog关闭程序 在SQLite的操作语句字符串中不要乱加符号,会导致程序崩溃。

SQLite 基本结构

合同类:

  • 合同类是定义 URI、表和列名称的常量的容器。通过合同类,我们可以在同一软件包的所有其他类中使用相同的常量。这样一来,就可以在一个位置集中更改列名称并将其传播到整个代码中。同时由于表名,列名这些常量使用频率很高,将这些常量集中存储在一个容器中并给予独特、易联想的标记名,可以大大提高效率。

  • 组织合同类的一个好方法是将对整个数据库全局可见的定义添加到类的根级别。然后,为每个表创建一个内部类。每个内部类都枚举相应表的列。这样就可以全局访问这些常量。例如:

public final class ContactContract {

    private ContactContract(){}

    public static class ContactEntry{
        public static final String TABLE_NAME = "contact_name";
        public static final String CONTACT_ID = "contact_id";
        public static final String NAME = "name";
        public static final String EMAIL = "email";
    }

}

Database Helper 类

  • SQLiteOpenHelper 类提供了一组API以实现数据库的 read、write、delete、update等基础操作,所以需要设置一个 SQLiteOpenHelper 的子类,通过调用子类的onCreate() onUpgrade() 回调方法实现 SQLite 的创建和更新(drop当前数据库,生成新的数据库),自定义 SQLiteOpenHelper 子类例子:
public class ContactDatabaseHelper extends SQLiteOpenHelper {

    private static final int VERSION = 1;
    private static final String DATABASE_NAME = "Contact_db";

    public static final String CREATE_TABLE = "create table " + ContactContract.ContactEntry.TABLE_NAME + "("
            + ContactContract.ContactEntry.CONTACT_ID + " number," + ContactContract.ContactEntry.NAME + " text,"
            + ContactContract.ContactEntry.EMAIL + " text);";

    public static final String DROP_TABLE = "drop table if exists " + ContactContract.ContactEntry.TABLE_NAME;

    //SQLiteOpenHelper的子类必须有此构造函数
    public ContactDatabaseHelper(@Nullable Context context, @Nullable String name, @Nullable SQLiteDatabase.CursorFactory factory, int version) {
        //此构造函数中必须调用父类的构造函数
        super(context, name, factory, version);
        Log.d("Database operations","Database created...");
    }

    public ContactDatabaseHelper(Context context){
        this(context,DATABASE_NAME);  //此构造函数调用下面一个构造函数,形成迭代调用
    }

    public ContactDatabaseHelper(Context context,String name){
        this(context,name,VERSION);
    }


    public ContactDatabaseHelper(Context context, String name, int version){
        this(context,name,null,version);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL(CREATE_TABLE);
        Log.d("Database operations","Table created...");
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        db.execSQL(DROP_TABLE);
        onCreate(db);
    }
    }

SQLite 使用方法

SQLite的创建

  • 基本数据库创建语句:
    public static final String CREATE_TABLE = "create table " + ContactContract.ContactEntry.TABLE_NAME + "("
            + ContactContract.ContactEntry.CONTACT_ID + " number," + ContactContract.ContactEntry.NAME + " text,"
            + ContactContract.ContactEntry.EMAIL + " text);";

    public static final String DROP_TABLE = "drop table if exists " + ContactContract.ContactEntry.TABLE_NAME;
  • 在Database Helper 子类中的回调方法中调用上述语句即可创建一个数据库
 @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL(CREATE_TABLE);
        Log.d("Database operations","Table created...");
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        db.execSQL(DROP_TABLE);
        onCreate(db);
    }

SQLite 访问及数据操作的前提

要实现对 SQLite 的访问和数据操作,首先要实例化 SQLiteOpenHelper子类: 此子类会获得两个方法:

getReadableDatabase() 
getWritableDatabase()

两个方法分别可以获得一个可读取的数据库对象 和一个可写入的数据库对象,这是其他访问的基础。

向数据库中写入信息

调用 SQLiteOpenHelper 的子类的 getWritableDatabase 方法,获取一个可写入的数据库对象,然后定义一个ContentValues类的对象,调用该类的put()方法,向该对象中加入键值对类型的数据(键的值就是表中列的名字),最后调用database的insert(表名,null,ContenValue对象)方法将ContentValue对象作为参数插入到数据库中。将上述思路封装为方法:

public void addContact(int id,String name,String email,SQLiteDatabase database){
        ContentValues contentValues = new ContentValues();
        contentValues.put(ContactContract.ContactEntry.CONTACT_ID,id);
        contentValues.put(ContactContract.ContactEntry.NAME,name);
        contentValues.put(ContactContract.ContactEntry.EMAIL,email);
        database.insert(ContactContract.ContactEntry.TABLE_NAME,null,contentValues);
        Log.d("Database operations","One raw inserted...");
    }

更新数据库信息

和写入类似,生成一个可写入数据库对象,定义一个ContentValue对象,调用database的update(表名,ContentValue对象,"id=?", new String[] {"1"})方法更新数据。

public void updateContact(int id,String name,String email,SQLiteDatabase database){
        ContentValues contentValues = new ContentValues();
        contentValues.put(ContactContract.ContactEntry.NAME,name);
        contentValues.put(ContactContract.ContactEntry.EMAIL,email);
        String selection = ContactContract.ContactEntry.CONTACT_ID + " = " + id;
        database.update(ContactContract.ContactEntry.TABLE_NAME,contentValues,selection,null);
    }

查询数据库信息

生成一个ReadableDatabase对象,调用该对象的query()方法,该方法需要如下参数:

String 表名

String[] 需要查询的列名

String Selection("XXX = ?")

String[] SelectionArgs

String groupby

String having

String orderby

此方法会返回一个Cursor类的对象,该对象存储着从database中读取出的数据,为了获取这些数据,需要调用该类的下述方法:

Boolean moveToNext():移动游标(初始值为-1)到下一位,若游标所指位置有值,return true

get'T'(): 从当前游标所指位置开始的一行的指定位置获取T类型的数据

getColumnIndex() getColumnIndexOrThrow(): 通过列名获取指定位置标号,常在get'T'()方法内调用,并将返回值作为参数

close():完成对Cursor对象的遍历后,调用此方法释放Cursor对象的资源。

// 获取Cursor
public Cursor readContact(SQLiteDatabase database){
        String[] projections = {ContactContract.ContactEntry.CONTACT_ID, ContactContract.ContactEntry.NAME, ContactContract.ContactEntry.EMAIL};
        Cursor cursor = database.query(ContactContract.ContactEntry.TABLE_NAME,projections,null,null,null,null,null);
        return cursor;
    }
    
// 从Cursor 读取数据
String info = "";
        while (cursor.moveToNext()){
            String id = Integer.toString(cursor.getInt(cursor.getColumnIndex(ContactContract.ContactEntry.CONTACT_ID)));
            String name = cursor.getString(cursor.getColumnIndex(ContactContract.ContactEntry.NAME));
            String email = cursor.getString(cursor.getColumnIndex(ContactContract.ContactEntry.EMAIL));
            info = info +"\n\n ID : " + id + "\n NAME : " + name + "\n EMAIL : " + email;
        }
        mTv_show_info.setText(info);
        cursor.close();
        contactDatabaseHelper.close();

从数据库删除数据

调用Database的delete(表名,String selection,String[] selectionArgs)方法即可

public void deleteContact(int id,SQLiteDatabase database){
        String selection = ContactContract.ContactEntry.CONTACT_ID + "=" + id;
        database.delete(ContactContract.ContactEntry.TABLE_NAME,selection,null);
    }

本文中的源代码可以访问我的代码仓库以获取 github.com/Free-Geter/…