Android SQLite数据库操作流程
阅读原文时间:2021年04月20日阅读:1
本篇文章,我们就和大家一起来回顾下一个轻量级的数据库——SQLite数据库。

Android系统集成了一个轻量级的数据库:SQLite,SQLite并不想成为像Oracle、MySQL那样的数据库。SQLite只是一个嵌入式的数据库引擎,专门适用于资源有限的设备上(入手机、PAD等)适量数据存储。
像SQLite一些原理性的东西,我在此就详细述说了,但是SQLiteOpenHelper类必须得说下,因为在实际的项目中,通常会继承SQLiteOpenHelper的子类,并通过子类的getReadableDatabase()、getWritableDatabase()方法开开数据库。

getReadableDatabase():以读写方式打开数据库对应的SQLiteDatabase对象;
getWritableDatabase():以写方式打开数据库对应的SQLiteDatabase对象;

相信,读完下面的内容,会让你对Android SQLite数据的操作有很大的程度的提升。
我们要实现的应该增删查改的功能,像分页查询,排序查询的一些sql,在这里,我就不一一概述,请查看源码:点我查看源码
先来一张效果图

上代码:
首先,我们创建一个类,表示我们要创建的表:

/**
 * @description:本地用户信息表
 * @author:zzq
 * @time: 2016-7-28 上午11:03:07
 */
public class LocalUserInfoTable extends AbstractTable {
    public static LocalUserInfoTable instance;
    public static LocalUserInfoTable getInstance() {
        if (instance == null) {
            instance = new LocalUserInfoTable();
        }
        return instance;
    }
    public static final class Fields implements BaseColumns {
        public static final String TABLE_NAME = "_LocalUserInfoTable";
        public static final String LocalUserId = "_LocalUserId";
        public static final String LocalUserName = "_LocalUserName";
        public static final String LocalUserSex = "_LocalUserSex";
        public static final String LocalUserAge = "_LocalUserAge";
        public static final String LocalUseBorthPlace = "_LocalUseBorthPlace";
        public static final String LocalUseBorthTime = "_LocalUseBorthTime";
    }
    private static final String[] PROJECTION = new String[] { Fields._ID,
            Fields.LocalUserId, Fields.LocalUserName, Fields.LocalUserSex,
            Fields.LocalUserAge, Fields.LocalUseBorthPlace,
            Fields.LocalUseBorthTime };
    @Override
    public void create(SQLiteDatabase db) {
        String sql = "create table " + getTableName() + " (" + Fields._ID
                + " integer primary key," + Fields.LocalUserId + " text,"
                + Fields.LocalUserName + " text," + Fields.LocalUserSex
                + " text," + Fields.LocalUserAge + " text,"
                + Fields.LocalUseBorthPlace + " text,"
                + Fields.LocalUseBorthTime + " text);";
        DataBaseManager.execSQL(db, sql);
    }
    @Override
    protected String getTableName() {
        return Fields.TABLE_NAME;
    }
    @Override
    protected String[] getProjection() {
        return PROJECTION;
    }
}

Activity中的实现主要在onclick点击中

@Override
    public void onClick(View v) {
        String id=edt_id.getText().toString();
        String name=edt_name.getText().toString();
        String time=edt_time.getText().toString();
        switch (v.getId()) {
        case R.id.btn_insert:
            if(TextUtils.isEmpty(id)){
                Toast.makeText(MainActivity.this, "请输入id", 0).show();
                break;
            }
            if(TextUtils.isEmpty(name)){
                Toast.makeText(MainActivity.this, "请输入姓名", 0).show();
                break;
            }
            userInfoBean.setId(id);
            userInfoBean.setName(name);
            userInfoBean.setTime(time);
            userInfoBean.setTime(DataFormat(System.currentTimeMillis() + ""));

            LocalUserInfoTable.getInstance().save(userInfoBean);
            list.clear();
            list.addAll(LocalUserInfoTable.getInstance().getDataList()) ;

            adapter.notifyDataSetChanged();
            break;
        case R.id.btn_query:
            //根据id查询
            if(TextUtils.isEmpty(id)){
                Toast.makeText(MainActivity.this, "请输入id", 0).show();
                break;
            }
            list.clear();
            list.addAll(LocalUserInfoTable.getInstance().getDataList(id)) ;
            adapter.notifyDataSetChanged();

            break;
        case R.id.btn_clear:
            //清空表
            LocalUserInfoTable.getInstance().clearData();
            list.clear();
            list.addAll(LocalUserInfoTable.getInstance().getDataList()) ;
            adapter.notifyDataSetChanged();
            break;
        case R.id.btn_uodate:
            //根据id修改name
            LocalUserInfoTable.getInstance().updateData(id, name);
            list.clear();
            list.addAll(LocalUserInfoTable.getInstance().getDataList()) ;
            adapter.notifyDataSetChanged();
            break;
        case R.id.btn_delete:
            //根据id删除这条数据  
        LocalUserInfoTable.getInstance().deleteDataSelector(id);
            list.clear();
            list.addAll(LocalUserInfoTable.getInstance().getDataList();
            adapter.notifyDataSetChanged();
            break;
        case R.id.btn_next:
//          Intent intent = new Intent(MainActivity.this, SecondActivity.class);
//          startActivity(intent);
            break;
        default:
            break;
        }
    }

adaper里面的操作相关代码,我就不贴出来了,这个也比较简单,接下来我贴出上面进行表的操作的一些方法:

/**
     * 存数据
     * 
     * @param msg
     */
    public void save(UserInfoBean msg) {
        SQLiteDatabase db = DataBaseManager.getInstance().getWritableDatabase();
        ContentValues mVm = getContentValues(msg);
        db.insert(getTableName(), null, mVm);
    }

    /**
     * 查询
     * 
     * @param userId
     * @return
     */
    public List<UserInfoBean> getDataList(String userId) {
        List<UserInfoBean> list = new ArrayList<UserInfoBean>();
        SQLiteDatabase db = DataBaseManager.getInstance().getReadableDatabase();
        Cursor cursor = query(userId);
        for (cursor.moveToFirst(); !cursor.isAfterLast(); cursor.moveToNext()) {
            UserInfoBean bean = toData(cursor);
            list.add(bean);
        }
        cursor.close();
        db.close();
        return list;
    }
    public List<UserInfoBean> getDataList() {
        List<UserInfoBean> list = new ArrayList<UserInfoBean>();
        SQLiteDatabase db = DataBaseManager.getInstance().getReadableDatabase();
        Cursor cursor = query();
        for (cursor.moveToFirst(); !cursor.isAfterLast(); cursor.moveToNext()) {
            UserInfoBean bean = toData(cursor);
            list.add(bean);
        }
        cursor.close();
        db.close();
        return list;
    }

    /**
     * 根据id查询
     * @param userId
     * @return
     */
    public final Cursor query(String userId) {
        SQLiteDatabase db = DataBaseManager.getInstance().getReadableDatabase();
        Cursor cursor = db.query(getTableName(), getProjection(),
                Fields.LocalUserId+"=?", new String[] { userId }, null, null, null);
        return cursor;
    }
    /**
     * 查询所有数据
     * @return
     */
    public final Cursor query() {
        SQLiteDatabase db = DataBaseManager.getInstance().getReadableDatabase();
        Cursor cursor = db.query(getTableName(), getProjection(),
                null, null, null, null, null);
        return cursor;
    }

/**
     * 清空数据库
     */
    public void clearData() {
        SQLiteDatabase db = DataBaseManager.getInstance().getWritableDatabase();
        db.delete(getTableName(), null, null);
        db.close();
    }
    /**
     * 根据name删除表中的数据
     * 
     * @param name
     */
    public void deleteDataSelector(String id) {
        SQLiteDatabase db = DataBaseManager.getInstance().getWritableDatabase();
        db.delete(getTableName(), Fields.LocalUserId + "=?",
                new String[] { id });
        db.close();
    }

    /**
     * 更改数据 根据userId更改name
     * 
     * @param userId
     * @param name
     */
    public void updateData(String userId, String name) {
        SQLiteDatabase db = DataBaseManager.getInstance().getWritableDatabase();
        ContentValues cvValues = new ContentValues();
        cvValues.put(Fields.LocalUserName, name);
        db.update(getTableName(), cvValues, Fields.LocalUserId + "=?",
                new String[] { userId });
        db.close();
    }
    private UserInfoBean toData(Cursor cursor) {
        UserInfoBean data = new UserInfoBean();
        data.setId(cursor.getString(cursor.getColumnIndex(Fields.LocalUserId)));
        data.setName(cursor.getString(cursor
                .getColumnIndex(Fields.LocalUserName)));
        data.setSex(cursor.getString(cursor.getColumnIndex(Fields.LocalUserSex)));
    data.setAge(cursor.getString(cursor.getColumnIndex(Fields.LocalUserAge)));
        data.setBorthPlace(cursor.getString(cursor
                .getColumnIndex(Fields.LocalUseBorthPlace)));
        data.setTime(cursor.getString(cursor
                .getColumnIndex(Fields.LocalUseBorthTime)));
        return data;
    }
    public ContentValues getContentValues(UserInfoBean msg) {
        ContentValues cValues = new ContentValues();
        cValues.put(Fields.LocalUserId, msg.getId());
        cValues.put(Fields.LocalUserName, msg.getName());
        cValues.put(Fields.LocalUserSex, msg.getSex());
        cValues.put(Fields.LocalUserAge, msg.getAge());
        cValues.put(Fields.LocalUseBorthPlace, msg.getBorthPlace());
        cValues.put(Fields.LocalUseBorthTime, msg.getTime());
        Log.i("user", "----" + msg.getTime());
        return cValues;
    }

重点:使用本数据库的封装还需要下面这三个类:

/**
 * 抽象的表
 * @author:zzq
 *
 */
public abstract class AbstractTable implements DatabaseTable {
    protected abstract String getTableName();
    protected abstract String[] getProjection();
    protected String getListOrder() {
        return null;
    }
    @Override
    public void migrate(SQLiteDatabase db, int toVersion) {
        DataBaseManager.dropTable(db, getTableName());
    }
    /**
     * Query table.
     * 
     * @return Result set with defined projection and in defined order.
     */
    public Cursor list() {
        SQLiteDatabase db = DataBaseManager.getInstance().getWritableDatabase();
        return db.query(getTableName(), getProjection(), null, null, null,
                null, getListOrder());
    }
    public Cursor list(String select,String[]selectionArgs) {
        SQLiteDatabase db = DataBaseManager.getInstance().getWritableDatabase();
        return db.query(getTableName(), getProjection(), select, selectionArgs, null,
                null, getListOrder());
    }
    @Override
    public void clear() {
        SQLiteDatabase db = DataBaseManager.getInstance().getWritableDatabase();
        db.delete(getTableName(), null, null);
    }
    protected boolean hasData(Cursor c){
        if(c!=null && c.getCount()>0){
            return true;
        }
        return false;
    }
    protected void closeCurosr(Cursor c) {
        if (c != null && !c.isClosed()) {
            c.close();
            c = null;
        }
    }
}
/**
 * @description:
 * @author:zzq
 * @time: 2016-7-28 上午12:03:44
 */
public class DataBaseManager extends SQLiteOpenHelper {
    private int tag = 1;
    private static String DATABASE_NAME = "sqlite.db";
    private static final int DATABASE_VERSION = 2;
    private static final SQLiteException DOWNGRAD_EXCEPTION = new SQLiteException(
            "Database file was deleted");
    private final List<DatabaseTable> registeredTables;
    private static DataBaseManager instance;
    public static DataBaseManager getInstance() {
        if (instance == null) {
            instance = new DataBaseManager();
        }
        return instance;
    }
    public DataBaseManager() {
        super(MyApplication.getInstance(), DATABASE_NAME, null,
                DATABASE_VERSION);
        registeredTables = new LinkedList<DatabaseTable>();
    }
    public static final void reInit(String name) {
        if (instance != null) {
            instance.close();
        }
        DATABASE_NAME = name;
        instance = new DataBaseManager();
    }
    public void addTable(DatabaseTable table) {
        registeredTables.add(table);
    }
    @Override
    public void onCreate(SQLiteDatabase db) {
        for (DatabaseTable table : registeredTables) {
            table.create(db);// 重新创建表
        }
        // registeredTables.get(registeredTables.size() - 1).create(db);
    }
    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        Log.i("onUpgrade", "-oldVersion--" + oldVersion + "-newVersion---"
                + newVersion);
        for (int i = 1; i <= 2; i++) {
            switch (i) {
            case 2:
                Log.i("onUpgrade", "--大小-");
                registeredTables.get(registeredTables.size() - 1).create(db);
                break;
            case 4:
                tag = 2;
                onCreate(db);
                break;
            default:
                break;
            }
        }
        // if (newVersion > oldVersion) {
        // for (DatabaseTable table : registeredTables) {
        // table.migrate(db, oldVersion);//删除表
        // }
        // onCreate(db);
        // MyApplication.getInstance();
        //
    }
    public static void execSQL(SQLiteDatabase db, String sql) {
        db.execSQL(sql);
    }
    public static void dropTable(SQLiteDatabase db, String table) {
        execSQL(db, "DROP TABLE IF EXISTS " + table + ";");
    }
    public static void renameTable(SQLiteDatabase db, String table,
            String newTable) {
        execSQL(db, "ALTER TABLE " + table + " RENAME TO " + newTable + ";");
    }

    public void onClear() {
        for (DatabaseTable table : registeredTables)
            table.clear();
    }

    public void onLoad() {
        try {
            getWritableDatabase(); // Force onCreate or onUpgrade
        } catch (SQLiteException e) {
            if (e == DOWNGRAD_EXCEPTION) {
                // Downgrade occured
            } else {
                throw e;
            }
        }
    }
}
public interface DatabaseTable {
    /**
     * 创建表
     * 
     * @param db
     */
    void create(SQLiteDatabase db);
    /**
     * Called on database migration.
     * @param db
     * @param toVersion
     */
    void migrate(SQLiteDatabase db, int toVersion);
    /**
     * Called on clear database request.
     */
    void clear();
}

启动应用的时候,我们需要在application中做如下操作:

/**
 * @description:
 * @author:zzq
 * @time: 2016-7-28 上午11:03:44
 */
public class MyApplication extends Application {
    public static MyApplication instance;
    @Override
    public void onCreate() {
        super.onCreate();
        instance = this;
        DataBaseManager.getInstance()
                .addTable(LocalUserInfoTable.getInstance());
    DataBaseManager.getInstance().addTable(LocalStudentInfoTable.getInstance());
        DataBaseManager.getInstance().onLoad();
    }
    public static MyApplication getInstance() {
        return instance;
    }
}

源码地址:点我查看源码
更多安卓相关信息,请扫码关注微信公众号:lifeAndroid