Android中SQLite数据库入门知识

来源:互联网 发布:mac dock栏设置 编辑:程序博客网 时间:2024/06/05 23:54

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<User> queryAll() {        ArrayList<User> 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<User> queryAll() {        ArrayList<User> 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;    }}

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

原创粉丝点击