Android开发中SQLite数据库操作(一)

最近看了网上的关于Android SQLite数据库的视频教程,在这里做个笔记记录一下一些常用的操作,在文章最后会给出源码。

孙子兵法有言:知己知彼方能百战不殆,既然用sqlite,那我们首先先来了解一下什么是sqlite?

首先嵌入式数据库是不需要独立运行有专门的数据库引擎的,由程序直接调用相应的API实现对数据库的存取操作,它是程序驱动式的,不同于SQLServer、DB2、MySQL、Oracle这些引擎响应式的。sqlite就是一款开源的轻量级的可嵌入的关系型数据库,特点是系统开销小(通常只需要几百KB的内存就足够了)、检索效率高、应用范围广,sqlite不仅支持标准的SQL语法,还遵循了数据库的ACID事务,保证了数据的完整性,同时也提高了运行的速度。下面先来看一些基础知识:

1.sqlite数据库的数据类型:Integer、varchar(10)、float、double、char(10)、text 

2.日常开发中较为常用的sql语句:

创建表:create table 表名(字段名称 数据类型 约束条件,字段名称 数据类型 约束条件......) 

例如:create table person(_id Integer primary key,name varchar(10),age Integer not null)

删除表:drop table 表名

例如:drop table person

插入数据:insert into 表名[字段,字段] values(值1,值2......)

例如:insert into person(_id,age) values(1,20)  表名后面指定了要插入的字段名称,则values中根据字段名对应赋值即可

       insert into person values(2,"archie",24)   表名后面没有指定具体要插入的字段名,则values中要根据表结构一一给出相应的值

修改表:update 表名 set 字段=新值 where 修改的条件

例如:update person set name="jarchie",age=23 where _id=2

删除数据:delete from 表名 where 删除的条件

例如:delete from person where _id=2

查询语句:select 字段 from 表名 where 查询条件 group by 分组的字段 having 筛选条件 order by 排序字段

例如:查询所有:select * from person 

   模糊查询:select * from person where name like "%小%"      select * from person where name like "_小%"

   排序:select * from person where age>18 order by _id

好了,了解了以上的知识点之后,我们一起来看一下sqlite数据库在android中具体该如何使用呢?

首先来看如何创建数据库?

Android底层为我们提供了一个SQLiteOpenHelper的帮助类,里面封装了创建和使用数据库的各种方法,我们只需要定义自己的类去继承SQLiteOpenHelper,实现里面的方法即可。

public class MySqliteHelper extends SQLiteOpenHelper
其中,onCreate()方法是在数据库创建时回调的函数:

/**
 * 当数据库创建时回调的函数
 * @param db 数据库对象
 */
@Override
public void onCreate(SQLiteDatabase db) {
    Log.e(TAG, "onCreate: " + "------onCreate-----" );
}

然后,我们在我们的活动页中首先需要拿到我们的MySqliteHelper对象,然后通过调用helper.getWriteableDatabase()方法就可以创建数据库了:

helper = DbManager.getInstance(this);
/**
 * getReadableDatabase()和getWritableDatabase()创建或者打开数据库
 * 如果数据库不存在则创建数据库,如果数据库存在直接打开数据库
 * 默认情况下两个函数都表示打开或者创建可读可写的数据库对象,如果磁盘已满或者数据库
 * 本身权限等情况下getReadableDatabase()打开的是只读数据库
 */
SQLiteDatabase db = helper.getWritableDatabase();

接下来我们来看一下对数据库的一些常用操作,在本篇中先来看一下sqlite的增删改操作,对于这部分我们有两种实现方式,一种是直接通过执行sql语句进行相关的操作,另一种是通过android中的api进行操作,下面先来看一下第一种实现方式:

首先定义一个数据库的操作类,在该类中我们定义一个数据库的公共的执行方法,便于调用:

/**
 * 根据sql语句在数据库中执行语句
 * @param db 数据库对象
 * @param sql sql语句
 */
public static void execSql(SQLiteDatabase db,String sql){
    if (db != null){
        if (!TextUtils.isEmpty(sql)){
            db.execSQL(sql);
        }
    }
}

然后在我们的页面中开始进行相关的操作,分别是插入数据,修改数据,删除数据等操作:

插入操作:

db = helper.getWritableDatabase();
String sql = "insert into "+ Constant.TABLE_NAME+" values(1,'Archie',24)";
DbManager.execSql(db,sql);
String sql1 = "insert into "+ Constant.TABLE_NAME+" values(2,'Jackson',25)";
DbManager.execSql(db,sql1);
db.close();

修改数据:

db = helper.getWritableDatabase();
String sql2 = "update "+Constant.TABLE_NAME+" set "+Constant.NAME
        +"='angel' where "+Constant._ID+"=1";
DbManager.execSql(db,sql2);
db.close();

删除数据:

db = helper.getWritableDatabase();
String sql3 = "delete from "+Constant.TABLE_NAME+" where "+Constant._ID+"=2";
DbManager.execSql(db,sql3);
db.close();

通过这些操作我们就可以完成数据的增删改功能,但是这种方式有个前提条件是我们得熟练的去运用sql语句。所以,下面我们来看看使用第二种方式该如何实现?

插入数据:

db = helper.getWritableDatabase();
/**
 * insert(String table, String nullColumnHack, ContentValues values)
 * table:表名 nullColumnHack:一般指定为null values:键为String的HashMap集合
 * return long 表示插入数据的列数
 */
ContentValues values = new ContentValues();
values.put(Constant._ID,3); //put(字段名,字段值)
values.put(Constant.NAME,"安奇");
values.put(Constant.AGE,24);
long result = db.insert(Constant.TABLE_NAME, null, values);
if (result > 0){
    DbManager.toastMessage(this,"插入数据成功!");
}else {
    DbManager.toastMessage(this,"插入数据失败!");
}
db.close();
修改数据:

db = helper.getWritableDatabase();
/**
 * update(String table, ContentValues values, String whereClause, String[] whereArgs)
 * table:表名 values:键为String的HashMap集合
 * whereClause:表示当前修改的条件 whereArgs:修改条件的占位符
 * return int 修改的条数
 */
ContentValues values1 = new ContentValues();
values1.put(Constant.NAME,"哈哈"); //put(需要修改的字段名,修改后的字段值)
int count = db.update(Constant.TABLE_NAME, values1, Constant._ID + "=?",
        new String[]{"3"});
if (count > 0){
    DbManager.toastMessage(this,"修改数据成功!");
}else {
    DbManager.toastMessage(this,"修改数据失败!");
}
db.close();

删除数据:

db = helper.getWritableDatabase();
/**
 * delete(String table, String whereClause, String[] whereArgs)
 * table:删除的表名 whereClause:删除的条件 whereArgs:删除条件的占位符
 * return int 删除条数
 */
int size = db.delete(Constant.TABLE_NAME, Constant._ID + "=?", new String[]{"1"});
if (size > 0){
    DbManager.toastMessage(this,"删除数据成功!");
}else {
    DbManager.toastMessage(this,"删除数据失败!");
}
db.close();
附项目源码如下:

activity_main.xml




    
Constant.java

package com.jarchie.sqliteproject.db;

/**
 * Created by Jarchie on 17/1/7.
 * 创建数据库参数的常量类
 */

public class Constant {
    public static final String DATABASE_NAME = "info.db"; //数据库名称
    public static final int DATABASE_VERSION = 1; //数据库的版本号
    public static final String TABLE_NAME = "person"; //表名
    public static final String _ID = "_id";
    public static final String NAME = "name";
    public static final String AGE = "age";
}
MySqliteHelper.java

package com.jarchie.sqliteproject.db;

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;

/**
 * Created by Jarchie on 17/1/7.
 * 本类提供了创建数据库和更新数据库的方法
 * 提供了获取数据库对象的函数
 */

public class MySqliteHelper extends SQLiteOpenHelper{
    private static final String TAG = "MySqliteHelper";

    /**
     * 构造函数
     * @param context 上下文对象
     * @param name 表示创建的数据库的名称
     * @param factory 游标工厂
     * @param version 当前创建数据库的版本,要求>=1
     */
    public MySqliteHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
        super(context, name, factory, version);
    }

    public MySqliteHelper(Context context){
        super(context,Constant.DATABASE_NAME,null,Constant.DATABASE_VERSION);
    }

    /**
     * 当数据库创建时回调的函数
     * @param db 数据库对象
     */
    @Override
    public void onCreate(SQLiteDatabase db) {
        Log.e(TAG, "onCreate: " + "------onCreate-----" );
        String sql = "create table "+Constant.TABLE_NAME+"("+
                Constant._ID+" Integer primary key,"+Constant.NAME+
                " varchar(10),"+Constant.AGE+" Integer)";
        db.execSQL(sql); //执行sql语句
    }

    /**
     * 当数据库版本更新时回调的函数
     * @param db 数据库对象
     * @param oldVersion 数据库旧版本
     * @param newVersion 数据库新版本
     */
    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        Log.e(TAG, "onUpgrade: " + "------onUpgrade-----" );
    }

    /**
     * 当数据库打开时回调的函数
     * @param db 数据库对象
     */
    @Override
    public void onOpen(SQLiteDatabase db) {
        super.onOpen(db);
        Log.e(TAG, "onOpen: " + "------onOpen-----" );
    }

}
DbManager.java

package com.jarchie.sqliteproject.utils;

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.text.TextUtils;
import android.widget.Toast;
import com.jarchie.sqliteproject.db.MySqliteHelper;

/**
 * Created by Jarchie on 17/1/7.
 * 对数据库操作的工具类,降低代码的耦合度
 */

public class DbManager {
    /**
     * 采用单例模式构建helper对象
     */
    private static MySqliteHelper helper;
    public static MySqliteHelper getInstance(Context context){
        if (helper == null){
            helper = new MySqliteHelper(context);
        }
        return helper;
    }

    /**
     * 根据sql语句在数据库中执行语句
     * @param db 数据库对象
     * @param sql sql语句
     */
    public static void execSql(SQLiteDatabase db,String sql){
        if (db != null){
            if (!TextUtils.isEmpty(sql)){
                db.execSQL(sql);
            }
        }
    }

    /**
     * 定义公共的吐司方法
     * @param context 上下文对象
     * @param message 吐司信息
     */
    public static void toastMessage(Context context,String message){
        Toast.makeText(context,message,Toast.LENGTH_SHORT).show();
    }

}
MainActivity.java

package com.jarchie.sqliteproject;

import android.app.Activity;
import android.content.ContentValues;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import com.jarchie.sqliteproject.db.Constant;
import com.jarchie.sqliteproject.db.MySqliteHelper;
import com.jarchie.sqliteproject.utils.DbManager;

public class MainActivity extends Activity implements View.OnClickListener{
    private Button createBtn,insertBtn,updateBtn,deleteBtn,apiinsertBtn,apiupdateBtn,apideleteBtn;
    private MySqliteHelper helper;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        helper = DbManager.getInstance(this);
        initView();
        initWidgetListener();
    }

    /**
     * 初始化控件
     */
    private void initView(){
        createBtn = (Button) findViewById(R.id.create_db);
        insertBtn = (Button) findViewById(R.id.insert_db);
        updateBtn = (Button) findViewById(R.id.update_db);
        deleteBtn = (Button) findViewById(R.id.delete_db);
        apiinsertBtn = (Button) findViewById(R.id.insertapi_db);
        apiupdateBtn = (Button) findViewById(R.id.updateapi_db);
        apideleteBtn = (Button) findViewById(R.id.deleteapi_db);
    }

    /**
     * 初始化监听事件
     */
    private void initWidgetListener(){
        createBtn.setOnClickListener(this);
        insertBtn.setOnClickListener(this);
        updateBtn.setOnClickListener(this);
        deleteBtn.setOnClickListener(this);
        apiinsertBtn.setOnClickListener(this);
        apiupdateBtn.setOnClickListener(this);
        apideleteBtn.setOnClickListener(this);
    }

    @Override
    public void onClick(View view) {
        switch (view.getId()){
            case R.id.create_db:
                createDb();
                break;
            case R.id.insert_db:
                insertData();
                break;
            case R.id.update_db:
                updateData();
                break;
            case R.id.delete_db:
                deleteData();
                break;
            case R.id.insertapi_db:
                apiInsertData();
                break;
            case R.id.updateapi_db:
                apiUpdateData();
                break;
            case R.id.deleteapi_db:
                apiDeleteData();
                break;
        }
    }

    //创建数据库
    private void createDb(){
        /**
         * getReadableDatabase()和getWritableDatabase()创建或者打开数据库
         * 如果数据库不存在则创建数据库,如果数据库存在直接打开数据库
         * 默认情况下两个函数都表示打开或者创建可读可写的数据库对象,如果磁盘已满或者数据库
         * 本身权限等情况下getReadableDatabase()打开的是只读数据库
         */
        SQLiteDatabase db = helper.getWritableDatabase();
    }

    //sql语句插入数据
    private void insertData(){
        SQLiteDatabase db = helper.getWritableDatabase();
        String sql = "insert into "+ Constant.TABLE_NAME+" values(1,'Archie',24)";
        DbManager.execSql(db,sql);
        String sql1 = "insert into "+ Constant.TABLE_NAME+" values(2,'Jackson',25)";
        DbManager.execSql(db,sql1);
        db.close();
    }

    //sql语句修改数据
    private void updateData(){
        SQLiteDatabase db = helper.getWritableDatabase();
        String sql2 = "update "+Constant.TABLE_NAME+" set "+Constant.NAME
                +"='angel' where "+Constant._ID+"=1";
        DbManager.execSql(db,sql2);
        db.close();
    }

    //sql语句删除数据
    private void deleteData(){
        SQLiteDatabase db = helper.getWritableDatabase();
        String sql3 = "delete from "+Constant.TABLE_NAME+" where "+Constant._ID+"=2";
        DbManager.execSql(db,sql3);
        db.close();
    }

    //api插入数据
    private void apiInsertData(){
        SQLiteDatabase db = helper.getWritableDatabase();
        /**
         * insert(String table, String nullColumnHack, ContentValues values)
         * table:表名 nullColumnHack:一般指定为null values:键为String的HashMap集合
         * return long 表示插入数据的列数
         */
        ContentValues values = new ContentValues();
        values.put(Constant._ID,3); //put(字段名,字段值)
        values.put(Constant.NAME,"安奇");
        values.put(Constant.AGE,24);
        long result = db.insert(Constant.TABLE_NAME, null, values);
        if (result > 0){
            DbManager.toastMessage(this,"插入数据成功!");
        }else {
            DbManager.toastMessage(this,"插入数据失败!");
        }
        db.close();
    }

    //api修改数据
    private void apiUpdateData(){
        SQLiteDatabase db = helper.getWritableDatabase();
        /**
         * update(String table, ContentValues values, String whereClause, String[] whereArgs)
         * table:表名 values:键为String的HashMap集合
         * whereClause:表示当前修改的条件 whereArgs:修改条件的占位符
         * return int 修改的条数
         */
        ContentValues values1 = new ContentValues();
        values1.put(Constant.NAME,"哈哈"); //put(需要修改的字段名,修改后的字段值)
//                int count = db.update(Constant.TABLE_NAME, values1,
//                      Constant._ID + "=3", null);
        int count = db.update(Constant.TABLE_NAME, values1, Constant._ID + "=?",
                new String[]{"3"});
        if (count > 0){
            DbManager.toastMessage(this,"修改数据成功!");
        }else {
            DbManager.toastMessage(this,"修改数据失败!");
        }
        db.close();
    }

    //api删除数据
    private void apiDeleteData(){
        SQLiteDatabase db = helper.getWritableDatabase();
        /**
         * delete(String table, String whereClause, String[] whereArgs)
         * table:删除的表名 whereClause:删除的条件 whereArgs:删除条件的占位符
         * return int 删除条数
         */
        int size = db.delete(Constant.TABLE_NAME, Constant._ID + "=?", new String[]{"1"});
        if (size > 0){
            DbManager.toastMessage(this,"删除数据成功!");
        }else {
            DbManager.toastMessage(this,"删除数据失败!");
        }
        db.close();
    }

}
好了,本篇就先写到这里,未完待续哦!

你可能感兴趣的:(数据库)