Android中SQLite数据库入门知识

SQLite数据库介绍:

Android内置的小型的,关系型,文本型数据库。通过SQLiteOpenHelper来实现数据库操作。
特点:应用程序中的任何类可以通过名称来访问数据库。但应用程序之外就不能访问。

SQLiteOpenHelper类介绍:
作用:通过获取到具体数据库的引用来管理数据库(创建,增加,修改,删除)和版本的控制;

使用过程:通过创建继承SQLiteOpenHelper的子类,实现一些方法来执行对数据库的操作,如下实例代码;

private static class DatabaseHelper extends SQLiteOpenHelper {

        DatabaseHelper(Context context) {
            super(context, CommDB.DATABASE_NAME, null, CommDB.DATABASE_VERSION);
            // CursorFactory设置为null,使用系统默认的工厂类
        }

        @Override
        public void onCreate(SQLiteDatabase db) {
         // 这个方法中主要完成创建数据库后对数据库的操作,即便程序修改重新运行,
         //只要数据库已经创建过,就不会再进入这个onCreate方法
            ...
        }

        @Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        //调用时机newVersion>oldVersion
        db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME);
        onCreate(db);
        // 当回调OnUdgrade时,删除旧表,然后调用onCreate来创建新表,
        //这样的操作在实际开发中不推荐,正确的做法是在更新数据表结构时,
        //还要考虑用户存放于数据库中的数据不丢失。

            ...
        }
    }

参数解读

参数 含义
SQLiteOpenHelper的第一个构造函数参数 上下文环境
SQLiteOpenHelper的第二个构造函数参数 数据库名字
SQLiteOpenHelper的第三个构造函数参数 游标工厂(可选)
SQLiteOpenHelper的第四个构造函数参数 数据库模型版本号

实际开发过程中中:为了更好的管理和维护数据库,封装一个继承自SqliteOpenHelper的数据库操作类,然后以这个类作为基类继续封装我们需要的业务逻辑。

常用方法介绍

方法名 功能
onCreate() 创建数据库
onUpgrate() 升级数据库
close() 关闭所有打开的数据库对象
getWriteableDatabase() 创建或打开可以读/写的数据库
getReadableDatabase() 创建或打开可以读的数据库

notes:

(1)onCreate()方法在初次生成数据库时才会被调用,在onCreate()方法里可以生成数据库表结构及添加一些应用使用到的初始化数据。
(2)onUpgrade()方法在数据库的版本发生变化时会被调用,一般在软件升级或者表结构更新时才需改变版本号,而数据库的版本是由程序员控制的。假设数据库原来的版本是1,可以把原来的数据库版本设置为2,并且在onUpgrade()方法里面实现表结构的更新的一些逻辑操作。

SQLiteDatabase类介绍:

作用:负责执行具体的增删改查操作

常用方法介绍

方法名 功能
execSQL() 可进行增删改操作,不能进行查询操作(与操作)
rawQuery() 可用于执行select语句
query() 查询数据库(读操作)
insert() 插入数据
delete() 删除数据

notes:

(1)一个数据库中可以有多个数据表

SQLite入门基础

利用SQLiteOpenHelper来获取数据库对象
(1) 利用getWriteableDatabase()和getReadableDatabase()获取数据库对象的引用,如果数据库不存在,Android系统会自动生成一个数据库,接着调用onCreate()方法。

关键代码

 mDbHelper = new DatabaseHelper(context);
        mDb = mDbHelper.getWritableDatabase();

安卓中SQLite的增删改查操作

1.数据增加操作

(1).利用ContentValues作为容器,它实现了Parcelable接口,可序列化,底层是对HashMap的封装。传入参数是必须是Key(String),Value(Object);String对应的是创建表时候的列名。

ContentValues values = new ContentValues();
initialValues.put(KEY_ID, id);
initialValues.put(KEY_PIC_URL, picUrl);

(2).利用SQLiteDatabase类中的insert的方法往指定表名TABLE_NAME传入上一步自己生成的values;通过其返回值判断是否操作成功,返回-1则操作失败,成功则返回最新插入数据的所在的行号;

SQLiteDatabase mDb;
// 采用事务处理,确保数据完整性
        mDb.beginTransaction(); // 开始事务
        try{
long createResult = mDb.insert(TABLE_NAME, null, values);
db.setTransactionSuccessful(); // 设置事务成功完成
} finally {
    db.endTransaction(); // 结束事务
}

notes :try…finally语句块可加可不加。

2.数据删除操作

(1)删除表中全部数据,使用delete()方法,第一个参数是数据表名,第二个参数是条件语句,第三个参数是条件参数;如果第二三个参数为空则删除所有行数据,返回值是删除操作影响的行数。

int deleteResult = mDb.delete(TABLE_NAME, null, null);

(2)根据字段名删除表中的数据

int isDelete;
String[] tName = new String[] {id};
isDelete = mDb.delete(TABLE_NAME, KEY_ID + "=?", tName);

3.更新数据表操作

使用ContentValues存储键值对,update语句的第一个参数是数据表名,第二个为你需要更新的对应列和值,第三个参数是条件语句,第四个参数是条件参数

public void updatePicUrl(User user) {
        Logger.d("updatePicUrl");
        ContentValues values = new ContentValues();
        values.put("age", user.getPicUrl());
        db.update(TABLE_NAME, values, "id = ?",
               new String[] { user.getId(); });
}

4.查询数据操作

使用ArrayList存储POJO类的用户数据,利用Cursor来获取每一行的数据,在后续操作中将其存入ArrayList中;

参数解读:

public Cursor query(String table, String[] columns, String selection,
            String[] selectionArgs, String groupBy, String having,
            String orderBy)
参数 作用
table 数据表名
columns 查询列名
selection 查询条件
selectionArgs 条件参数
groupBy 添加groupBy子句
having 添加having子句
orderBytable 添加orderBy子句

Notes:一般简单的操作只要填前四个参数就行

查询表中所有数据并将其存储在ArrayList

public ArraryList queryAll() {
        ArrayList allUsersList = new ArrayList<>();
        Cursor mCursor = null;
        mCursor = mDb.query(TABLE_NAME, new String[] {KEY_ID,KEY_PIC_URL}, null, null, null, null, null);
        if (mCursor.moveToFirst()) {
            do {
                User user = new User();
                user.setId(mCursor.getString(mCursor.getColumnIndexOrThrow(KEY_ID)));
                user.setPicUrl(mCursor.getString(mCursor.getColumnIndexOrThrow(KEY_PIC_URL)));
                allUsersList.add(user);
            } while (mCursor.moveToNext());
        }
        if (mCursor != null && !mCursor.isClosed()) {
            mCursor.close();
        }
        return allUsersList;
 }

使用样例代码

CommDB.java

public class CommDB {
    public static final String DATABASE_NAME = "MoveDatabase.db"; //数据库名称
    public static final int DATABASE_VERSION = 1;
    //创建图像url对应id的表
    private static final String CREATE_TABLE_ImgRecords = "create table if not exists" +
            ImgRecordsDB.TABLE_NAME + "(" + ImgRecordsDB.KEY_ID +"integer," +
            ImgRecordsDB.KEY_PIC_URL +"varchar(200))";
    //创建搜索记录表
    private static final String CREATE_TABLE_SearchRecords =
            "create table if not exists" + SearchRecordsDB.TABLE_NAME + "(" + SearchRecordsDB.KEY_ID +
                    "integer primary key autoincrement," + SearchRecordsDB.KEY_Content +"varchar(200))";
    private final Context context;
    private DatabaseHelper DBHelper;
    private SQLiteDatabase db;

    public CommDB(Context ctx) {
        this.context = ctx;
        this.DBHelper = new DatabaseHelper(this.context);
    }

    private static class DatabaseHelper extends SQLiteOpenHelper {

        DatabaseHelper(Context context) {
           super(context, DATABASE_NAME, null, DATABASE_VERSION);
        }

        @Override
        public void onCreate(SQLiteDatabase db) {
                 db.execSQL(CREATE_TABLE_ImgRecords);//创建图像记录表
                 db.execSQL(CREATE_TABLE_SearchRecords);//创建搜索记录表
        }

        @Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
            //当提供的新版本号比旧版号大的时候,将会回调该方法
        }
    }

   public CommDB open() throws SQLException {
       this.db = this.DBHelper.getWritableDatabase();
       return this;
   }


    public void close() {
        this.DBHelper.close();
    }
}

ImgRecordsDB.java

public class ImgRecordsDB {
    public static final String KEY_ID = "id";
    public static final String KEY_PIC_URL = "picUrl";
    private DatabaseHelper mDbHelper;
    private SQLiteDatabase mDb;
    public static final String TABLE_NAME = "ImgRecords";
    private final Context context;

    private static class DatabaseHelper extends SQLiteOpenHelper {

        DatabaseHelper(Context context) {
            super(context, CommDB.DATABASE_NAME, null, CommDB.DATABASE_VERSION);
        }

        @Override
        public void onCreate(SQLiteDatabase db) {

        }

        @Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
            Logger.d("Upgrading database from version " + oldVersion + " to " + newVersion +
                    ", which will destroy all old data");
            db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME);
            onCreate(db);
        }
    }

    public ImgRecordsDB(Context ctx) {
        this.context= ctx;
    }

    public ImgRecordsDB open() throws SQLException {
        mDbHelper = new DatabaseHelper(context);
        mDb = mDbHelper.getWritableDatabase();
        return this;
    }

    public void close() {
        if (mDbHelper != null) {
            mDbHelper.close();
        }
    }

    //下面开始封装一些具体的自定义的数据库操作
    /**
     * 创建一个保存用户id和对应图像url的
     * @param id
     * @param picUrl
     * @return
     */
    public long createUser(String id,String picUrl) {
        long createResult = 0;
        ContentValues initialValues = new ContentValues();
        initialValues.put(KEY_ID, id);
        initialValues.put(KEY_PIC_URL, picUrl);
        try {
            createResult = mDb.insert(TABLE_NAME, null, initialValues);
            Logger.d("the new row is " + createResult);
        } catch (Exception e) {
            //在这里添加一些自定义的异常处理
            Logger.d("delete all data failed!");
            e.printStackTrace();
        }
        return createResult;
    }

    /**
     * 删除表中全部数据
     * @return
     */
    public boolean deleteAllUsers() {
        int deleteResult = 0;
        try {
            deleteResult = mDb.delete(TABLE_NAME, null, null);
            Logger.d(deleteResult+"row has been deleted!");
        } catch (Exception e) {
            //在这里添加一些自定义的异常处理
            e.printStackTrace();
        }
        return deleteResult > 0;
    }

    /**
     * 根据名称删除表中的数据
     * @param id
     * @return
     */
    public boolean deleteUserByID(String id) {
        int isDelete;
        String[] tName = new String[] {id};
        isDelete = mDb.delete(TABLE_NAME, KEY_ID + "=?", tName);
        Logger.d("isDelete:" + isDelete + "---" + "UserID = " + id);
        return isDelete > 0;
    }

    /**
     * 获取表中的所有字段
     * @return
     */
    public ArrayList queryAll() {

        ArrayList allUsersList = new ArrayList<>();
        Cursor mCursor = null;
        mCursor = mDb.query(TABLE_NAME, new String[] {KEY_ID,KEY_PIC_URL}, null, null, null, null, null);
        if (mCursor.moveToFirst()) {
            do {
                User user = new User();
                user.setId(mCursor.getString(mCursor.getColumnIndexOrThrow(KEY_ID)));
                user.setPicUrl(mCursor.getString(mCursor.getColumnIndexOrThrow(KEY_PIC_URL)));
                allUsersList.add(user);
            } while (mCursor.moveToNext());
        }
        if (mCursor != null && !mCursor.isClosed()) {
            mCursor.close();
        }
        return allUsersList;
    }

}

目前还处于更新状态,不足之处,请谅解

你可能感兴趣的:(安卓)