Android 中使用 SQLite 数据库

版权声明:https://blog.csdn.net/weixin_40811410 https://blog.csdn.net/weixin_40811410/article/details/81949856

一、Android 中SQLite 介绍

Android 在运行时(run-time)集成了 SQLite,所以每个 Android 应用程序都可以使用 SQLite 数据库。

由于JDBC(Java DataBase Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,会消耗太多的系统资源,对于手机这种内存受限设备来说并不合适。因此Android 提供了一些新的 API 来使用 SQLite 数据库。

数据库存储在 data/data/< 项目文件夹 >/databases/ 下。

二、Android 中SQLite数据库使用

2.1 创建数据库

在 Android 应用程序中使用 SQLite,必须自己创建数据库,然后创建表、索引,填充数据。Android 提供了 SQLiteOpenHelper 帮助创建一个数据库,只要继承 SQLiteOpenHelper 类,就可以轻松的创建数据库。

SQLiteOpenHelper 类根据开发应用程序的需要,封装了创建和更新数据库使用的逻辑。SQLiteOpenHelper 的子类,至少需要实现三个方法:

  1. 构造函数,调用父类 SQLiteOpenHelper 的构造函数。这个方法需要四个参数:上下文环境,数据库名字,一个可选的游标工厂(通常是 Null),一个代表正在使用的数据库模型版本的整数。
  2. onCreate()方法,当数据库第一次被建立的时候被执行,一般把创建表,初始化数据等操作放在这里。
  3. onUpgrage() 方法,当数据库版本更新时会自动执行。
public class DatabaseHelper extends SQLiteOpenHelper {     
 DatabaseHelper(Context context, String name, CursorFactory cursorFactory, int version) 
 {     
   super(context, name, cursorFactory, version);     
    }     

    @Override    
    public void onCreate(SQLiteDatabase db) {     
        // TODO 创建数据库后,对数据库的操作     
    }     

    @Override    
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {     
        // TODO 更改数据库版本的操作     
    }     

@Override    
public void onOpen(SQLiteDatabase db) {     
        super.onOpen(db);       
        // TODO 每次成功打开数据库后首先被执行     
    }     
}

2.2 SQLite数据库使用

  1. 创建一个DatabaseHelper 类,继承SQLiteOpenHelper,并在实现的方法中初始化,比如创建数据库等;
  2. 获取DatabaseHelper 的对象,并创建或打开一个可以读的数据库;
  3. 此时可以在打开的数据库中执行相应操作,如增、删、改、查操作等;

【SqliteDbHelper类】

package com.soul.ijreceiver;

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

/**
 * 模块:
 * 作者:soul
 * 时间:2018/8/30:13:59
 * 说明:
 */
public class SqliteDbHelper extends SQLiteOpenHelper
{
    private static final int DB_VERSION = 1;
    private static final String DB_NAME = "soul.db";
    public static final String TABLE_NAME = "person";

    public SqliteDbHelper(Context context)
    {
        super(context, DB_NAME, null, DB_VERSION);
    }

    /**
     * 调用时刻:当数据库第1次创建时调用
     * 作用:创建数据库 表 & 初始化数据
     * SQLite数据库创建支持的数据类型: 整型数据、字符串类型、日期类型、二进制
     */
    @Override
    public void onCreate(SQLiteDatabase sqLiteDatabase)
    {
        String createTbStr = "create table if not exists "+TABLE_NAME+"( _id integer primary key, name varchar, age integer, sex varchar)";
        sqLiteDatabase.execSQL(createTbStr);
        // 注:数据库实际上是没被创建 / 打开的(因该方法还没调用)
        // 直到getWritableDatabase() / getReadableDatabase() 第一次被调用时才会进行创建 / 打开
    }

    /**
     * 调用时刻:当数据库升级时则自动调用(即 数据库版本 发生变化时)
     * 作用:更新数据库表结构
     * 注:创建SQLiteOpenHelper子类对象时,必须传入一个version参数,该参数 = 当前数据库版本, 若该版本高于之前版本, 就调用onUpgrade()
     */
    @Override
    public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1)
    {
        //可重新建表
        sqLiteDatabase.execSQL("drop table if exists "+TABLE_NAME);
        onCreate(sqLiteDatabase);


        //也可在表中新增列元素, 使用 SQL的ALTER语句
        String sql = "alter table "+TABLE_NAME+" add job varchar";
        sqLiteDatabase.execSQL(sql);
    }
}

【SqliteDbManager类:SQLiteOpenHelper的工具类(可打开数据库,执行增删改查操作)】

package com.soul.ijreceiver;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.util.Log;

/**
 * 模块:数据库
 * 作者:soul
 * 时间:2018/8/30:14:32
 * 说明:
 */
public class SqliteDbManager
{
    private static SqliteDbManager mInstance = null;
    private SQLiteDatabase mDb = null;
    private SqliteDbHelper mDbHelper = null;

    public static SqliteDbManager getInstance()
    {
        if (mInstance == null)
        {
            mInstance = new SqliteDbManager();
        }
        return mInstance;
    }

    public void setSqliteDbOpen(Context context)
    {
        mDbHelper = new SqliteDbHelper(context.getApplicationContext());
        mDb = mDbHelper.getWritableDatabase();
    }

    public void insertTb(String tbName)
    {
        openDb();
        //方法一:
        ContentValues contentValues = new ContentValues();
        contentValues.put("name","zhangsan");
        contentValues.put("age",18);
        contentValues.put("sex","男");
        mDb.insert(tbName,null,contentValues);
        //方法二:
        mDb.execSQL("insert into "+tbName+" (name,age,sex) values ('李四',20,'女')");
        mDb.execSQL("insert into "+tbName+" (name,age,sex) values ('王五',22,'女')");
        mDb.execSQL("insert into "+tbName+" (name,age,sex) values ('哈利',21,'男')");
        closeDb();
    }

    public void deleteTb(String tbName)
    {
        openDb();
        //方法一:
        mDb.delete(tbName,"name=?",new String[]{"zhangsan"});
        //方法二:
        mDb.execSQL("delete from "+tbName+" where name = '李四'");
        closeDb();
    }

    public void updateTb(String tbName)
    {
        openDb();
        //方法一:
        ContentValues contentValues = new ContentValues();
        contentValues.put("name","隔壁老王");
        contentValues.put("sex","男");
        mDb.update(tbName,contentValues,"name=?",new String[]{"王五"});
        //方法二:
        mDb.execSQL("update "+tbName+" set name = '哈利波特',age = '16' where name = '哈利'");
        closeDb();
    }

    public void queryTb(String tbName)
    {
        openDb();
        //方法一:
        Cursor cursor = mDb.query(tbName, new String[]{"name","sex","age"}, "name=?", new String[]{"隔壁老王"}, null, null, null);
        //将光标移动到下一行,从而判断该结果集是否还有下一条数据;如果有则返回true,没有则返回false
        if (null != cursor)
        {
            while (cursor.moveToNext())
            {
                String name = cursor.getString(cursor.getColumnIndex("name"));
                int age = cursor.getInt(cursor.getColumnIndex("age"));
                String sex = cursor.getString(cursor.getColumnIndex("sex"));
                Log.i("????","name = "+name+"; age = "+age+"; sex = "+sex);
            }
            cursor.close();
        }
        //方法二:使用sql语句
        Cursor rawQuery = mDb.rawQuery("select * from " + tbName+" where name=?", new String[]{"哈利波特"});
        if (null != rawQuery)
        {
            while (rawQuery.moveToNext())
            {
                String _id = rawQuery.getString(rawQuery.getColumnIndex("_id"));
                String name = rawQuery.getString(rawQuery.getColumnIndex("name"));
                int age = rawQuery.getInt(rawQuery.getColumnIndex("age"));
                String sex = rawQuery.getString(rawQuery.getColumnIndex("sex"));
                Log.i("????","_id = "+_id+"; name = "+name+"; age = "+age+"; sex = "+sex);
            }
            rawQuery.close();
        }
        closeDb();
    }

    /**
     *  创建或打开一个可以读的数据库
     */
    private void openDb() {
        if (this.mDbHelper != null) {
            try {
                mDb = mDbHelper.getWritableDatabase();
            } catch (Exception e) {
                mDb = mDbHelper.getReadableDatabase();
                e.printStackTrace();
            }
        }
    }

    /**
     *  关闭数据库
     */
    private void closeDb() {
        try {
            if (mDb != null) {
                mDb.close();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

下一篇:分享对SQLite数据封装的心得。


YunSoul技术分享,扫码关注微信公众号

    ——只要你学会了之前所不会的东西,只要今天的你强过了昨天的你,那你就一直是在进阶的路上了。

猜你喜欢

转载自blog.csdn.net/weixin_40811410/article/details/81949856