美文网首页
Android SQLite 使用总结

Android SQLite 使用总结

作者: 惟吾德馨_慧 | 来源:发表于2020-06-08 17:13 被阅读0次

    1.获取SQLiteOpenHelper

    class DBOpenHelper extends SQLiteOpenHelper
    

    2.查询语句

    查询多条数据

    SQLiteDatabase db = openHelper.getReadableDatabase();
    Cursor cursor = db.query(table, columns, selection, selectionArgs, groupBy, having, orderBy, limit);
    

    示例:

    Cursor cursor = query(DBCommon.PersonRecordColumns.TABLE_NAME_PERSON_DATA, DBCommon.PersonRecordColumns.projects,
                        selection, selectionArgs, groupBy, having, orderBy, limit);
                while (cursor.moveToNext()) {
                    list.add(getUserInfo4Cursor(cursor));
                }
    

    查询单条数据

    SQLiteDatabase db = openHelper.getReadableDatabase();
    Cursor cursor = db.rawQuery(sql, condition);
    

    示例:

    Cursor cursor = rawQuery("select * from " + DBCommon.PersonRecordColumns.TABLE_NAME_PERSON_DATA +
                    " where " + DBCommon.PersonRecordColumns.COLUMN_PERSON_PERSON_ID + " = ?", new String[]{personid});
    

    模糊查询
    参考链接:https://www.jianshu.com/p/a93586b0611b

    1.%:表示任意0个或多个字符。可匹配任意类型和长度的字符,有些情况下若是中文,请运用两个百分号(%%)表示。
    2._: 表示任意单个字符。匹配单个任意字符,它常用来限定表达式的字符长度语句

    //查找数据表中名字中含有w、h、h任意字母的人员
    String names = "name like ? or ? or ?"
     ArrayList<String> selectionArgs = new ArrayList<>();
    selectionArgs.add("%w%");
    selectionArgs.add("%h%");
    selectionArgs.add("%h%");
    Cursor  cursor = query(DBCommon.PersonRecordColumns.TABLE_NAME_PERSON_DATA, DBCommon.PersonRecordColumns.projects,
                        sb.toString(), (String[]) selectionArgs.toArray(new String[selectionArgs.size()]), null, null, null, null);
    

    查询数量

    //查询表中ryssztk含有某个关键字的数量
    public int getRecordCount4ZTK(String ztkName) {
            return rawQuery("select count(*) from " +  DBCommon.PersonRecordColumns.TABLE_NAME_PERSON_DATA + " where ryssztk like ?",
                    "%" + ztkName + "%");
        }
    

    查询总结:
    query():适用于多条数据的条件查询,不适合单条数据的查询;
    rawQuery():适用于单条数据的条件查询,效率要高于query()。

    3.插入数据

     /**
         * 插入单条数据
         *
         * @param cv ContentValues
         * @return
         */
        public synchronized int insert(String table, ContentValues cv) {
            if (cv == null) {
                return -1;
            }
            SQLiteDatabase db = null;
            int id = -1;
            try {
                db = mOpenHelper.getWritableDatabase();
                id = (int) db.insert(table, null, cv);
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
    //            if(db != null){
    //                db.close();
    //            }
            }
            return id;
        }
    
        /**
         * 插入多条数据
         *
         * @param tableName 数据库的表名
         * @param cv        ContentValues 集合
         * @return 是否成功插入,一条失败,集体失败
         */
        public synchronized boolean multiInsert(String tableName, ContentValues[] cv) {
            if (cv == null || cv.length == 0) {
                return false;
            }
            SQLiteDatabase db = null;
            long id = -1;
            try {
                db = mOpenHelper.getWritableDatabase();
                db.beginTransaction();
                for (ContentValues value : cv) {
                    if (value != null) {
                        id = db.insert(tableName, null, value);
                        if (id < 0) {
                            return false;
                        }
                    }
                }
                db.setTransactionSuccessful();
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                if (db != null) {
                    db.endTransaction();
    //                db.close();
                }
            }
            return true;
        }
    

    多条数据的插入要比单条数据插入效率高,建议没特别需求选择多条数据插入方法!

    4.更新数据

    /**
         * 更新单条数据
         *
         * @param tableName     数据库的表名
         * @param cv            ContentValues
         * @param selection     删除数据列名
         * @param selectionArgs 删除数据的条件
         * @return 成功更新的條數
         */
        public synchronized int update(String tableName, ContentValues cv, String selection, String[] selectionArgs) {
            if (cv == null || TextUtils.isEmpty(selection)) {
                return 0;
            }
            int result = 0;
            SQLiteDatabase db = null;
            try {
                db = mOpenHelper.getWritableDatabase();
                result = db.update(tableName, cv, selection, selectionArgs);
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                if (db != null) {
    //                db.close();
                }
            }
            return result;
        }
    
    ContentValues value = new ContentValues();
    value.put(DBCommon.ZTKRecordColumns.COLUMN_ZTK_STATE, bean.status);
    update(DBCommon.ZTKRecordColumns.TABLE_NAME_ZTK, value, "name = ?", new String[]{bean.name});
    

    update()方法只能更新某条数据的某个字段值,一次只能更新一个字段值是,如果需要更新多个字段值,可以采取delete该条数据重新insert。

    每天进步一点点。。。(2019-10-10)

    相关文章

      网友评论

          本文标题:Android SQLite 使用总结

          本文链接:https://www.haomeiwen.com/subject/wmwapctx.html