7

Android中SQLite数据库入门知识

 2 years ago
source link: http://www.androidchina.net/9094.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client
Android中SQLite数据库入门知识 – Android开发中文站
你的位置:Android开发中文站 > Android开发 > 新手入门 > 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<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;
    }

}

转载请注明:Android开发中文站 » Android中SQLite数据库入门知识


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK