• Android——SQLiteOpenHelper


    使用步骤:

    1. 新建一个继承自SQLiteOpenHelper的数据库操作类,提示重写onCreate和OnUpgraed两个方法。其中,onCreate方法只在第一次打开数据库时执行,在此可进行表结构创建的操作;onUpgrade方法在数据库版本升高时执行,因此可以在onUpgraed函数内部根据新旧版本号进行表结构变更处理
    2. 封装保证数据库安全的必要方法,包括获取单例对象、打开数据库连接、关闭数据库连接
      1. 获取单例对象:确保App运行时数据库只被打开一次,避免重复打开引起错误
      2. 打开数据库连接:SQLite有锁机制,即读锁和写锁的处理;故而数据库连接也分两种,读连接可调用getReadableDatabase,写连接可调用getWritableDatabase
      3. 关闭数据库连接:数据库操作完毕后,应当调用SQLiteDatabase对象的close方法关闭连接
    3. 提供对表记录进行增加、删除、修改、查询的操作方法
      1. 可被SQLite直接使用的数据结构是ContentValues类,类似于映射Map,提供put和get方法来存取键值对。
      2. 对于查询操作来说,使用的是另一个游标类Cursor。调用SQLiteDatabase的query和rawQuery方法时,返回的都是Cursor对象,因此获取查询结果要根据游标的指示一条一条遍历结果集合。

    Cursor的常用方法可分为3类:

    1. 游标控制类方法,用于指定游标的状态
      1. close:关闭游标
      2. isClosed:判断游标是否关闭
      3. isFirst:判断游标是否在开头
      4. isLast:判断游标是否在末尾
    2. 游标移动类方法,把游标移动到指定位置
      1. moveToFirst:移动游标到开头
      2. moveToLast:移动游标到末尾
      3. moveToNext:移动游标到下一条记录
      4. moveToPrevious:移动游标到上一条记录
      5. move:往后移动游标若干条记录
      6. moveToPosition:移动游标到指定位置的记录
    3. 获取记录类方法,可获取记录的数量、类型以及取值
      1. getCount:获取结果记录的数量
      2. getInt:获取指定字段的整型值
      3. getFloat
      4. getString
      5. getType
    public class MyDatabaseHelper extends SQLiteOpenHelper {
    
        private static final String TAG = "MyDatabaseHelper";
        private static final String DB_NAME = "myDB.db";
        private static final int DB_VERSION = 1;
        private static MyDatabaseHelper mHelper = null;
        private SQLiteDatabase mDB = null;
        private static final String TABLE_NAME = "my_info";
    
        private MyDatabaseHelper(Context context) {
            super(context, DB_NAME, null, DB_VERSION);
        }
    
        private MyDatabaseHelper(Context context, int version) {
            super(context, DB_NAME, null, version);
        }
    
        /**
         * 获取实例--单例模式
         * @param context
         * @param version
         * @return
         */
        public static MyDatabaseHelper getInstance(Context context, int version) {
            if (version > 0 && mHelper == null) {
                mHelper = new MyDatabaseHelper(context, version);
            } else if (mHelper == null) {
                mHelper = new MyDatabaseHelper(context);
            }
            return mHelper;
        }
    
        /**
         * 获得数据库 读 连接
         * @return
         */
        public SQLiteDatabase openReadLink() {
            if (mDB == null || mDB.isOpen() != true) {
                mDB = mHelper.getReadableDatabase();
            }
            return mDB;
        }
    
        /**
         * 获得数据库 写 连接
         * @return
         */
        public SQLiteDatabase openWriteLink() {
            if (mDB == null || mDB.isOpen() != true) {
                mDB = mHelper.getWritableDatabase();
            }
            return mDB;
        }
    
        /**
         * 关闭连接
         */
        public void closeLink() {
            if (mDB != null && mDB.isOpen() == true) {
                mDB.close();
                mDB = null;
            }
        }
    
        /**
         * 获取数据库名称
         * @return
         */
        public String getDBName() {
            if (mHelper != null) {
                return mHelper.getDatabaseName();
            } else {
                return DB_NAME;
            }
        }
    
        @Override
        public void onCreate(SQLiteDatabase db) {
            // 构建调用时打印sql日志
            Log.d(TAG, "onCreate");
            // 清空表数据
            String drop_sql = "DROP TABLE IF EXISTS " + TABLE_NAME + ";";
            Log.d(TAG, "drop_sql:" + drop_sql);
            // 执行sql
            db.execSQL(drop_sql);
            // 新建表
            String create_sql = "CREATE TABLE IF NOT EXISTS " + TABLE_NAME + " ("
                    + "_id INTEGER PRIMARY KEY  AUTOINCREMENT NOT NULL,"
                    + "name VARCHAR NOT NULL," + "age INTEGER NOT NULL,"
                    + "height LONG NOT NULL," + "weight FLOAT NOT NULL,"
                    + "married INTEGER NOT NULL," + "update_time VARCHAR NOT NULL"
                    //演示数据库升级时要先把下面这行注释
                    + ",phone VARCHAR" + ",password VARCHAR"
                    + ");";
            Log.d(TAG, "create_sql:" + create_sql);
            // 执行sql
            db.execSQL(create_sql);
    
        }
    
        /**
         * 数据库升级操作
         * @param db
         * @param oldVersion
         * @param newVersion
         */
        @Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
            Log.d(TAG, "onUpgrade oldVersion="+oldVersion+", newVersion="+newVersion);
            if (newVersion > 1) {
                //Android的ALTER命令不支持一次添加多列,只能分多次添加
                String alter_sql = "ALTER TABLE " + TABLE_NAME + " ADD COLUMN " + "phone VARCHAR;";
                Log.d(TAG, "alter_sql:" + alter_sql);
                db.execSQL(alter_sql);
                alter_sql = "ALTER TABLE " + TABLE_NAME + " ADD COLUMN " + "password VARCHAR;";
                Log.d(TAG, "alter_sql:" + alter_sql);
                db.execSQL(alter_sql);
            }
        }
        public int delete(String condition) {
            int count = mDB.delete(TABLE_NAME, condition, null);
            return count;
        }
    
        public int deleteAll() {
            int count = mDB.delete(TABLE_NAME, "1=1", null);
            return count;
        }
    
        public long insert(UserInfo info) {
            ArrayList<UserInfo> infoArray = new ArrayList<UserInfo>();
            infoArray.add(info);
            return insert(infoArray);
        }
    
        public long insert(ArrayList<UserInfo> infoArray) {
            long result = -1;
            for (int i = 0; i < infoArray.size(); i++) {
                UserInfo info = infoArray.get(i);
                ArrayList<UserInfo> tempArray = new ArrayList<UserInfo>();
                // 如果存在同名记录,则更新记录
                // 注意条件语句的等号后面要用单引号括起来
                if (info.name!=null && info.name.length()>0) {
                    String condition = String.format("name='%s'", info.name);
                    tempArray = query(condition);
                    if (tempArray.size() > 0) {
                        update(info, condition);
                        result = tempArray.get(0).rowid;
                        continue;
                    }
                }
                // 如果存在同样的手机号码,则更新记录
                if (info.phone!=null && info.phone.length()>0) {
                    String condition = String.format("phone='%s'", info.phone);
                    tempArray = query(condition);
                    if (tempArray.size() > 0) {
                        update(info, condition);
                        result = tempArray.get(0).rowid;
                        continue;
                    }
                }
                // 不存在唯一性重复的记录,则插入新记录
                ContentValues cv = new ContentValues();
                cv.put("name", info.name);
                cv.put("age", info.age);
                cv.put("height", info.height);
                cv.put("weight", info.weight);
                cv.put("married", info.married);
                cv.put("update_time", info.update_time);
                cv.put("phone", info.phone);
                cv.put("password", info.password);
                result = mDB.insert(TABLE_NAME, "", cv);
                // 添加成功后返回行号,失败后返回-1
                if (result == -1) {
                    return result;
                }
            }
            return result;
        }
    
        public int update(UserInfo info, String condition) {
            ContentValues cv = new ContentValues();
            cv.put("name", info.name);
            cv.put("age", info.age);
            cv.put("height", info.height);
            cv.put("weight", info.weight);
            cv.put("married", info.married);
            cv.put("update_time", info.update_time);
            cv.put("phone", info.phone);
            cv.put("password", info.password);
            int count = mDB.update(TABLE_NAME, cv, condition, null);
            return count;
        }
    
        public int update(UserInfo info) {
            return update(info, "rowid="+info.rowid);
        }
    
        public ArrayList<UserInfo> query(String condition) {
            String sql = String.format("select rowid,_id,name,age,height,weight,married,update_time," +
                    "phone,password from %s where %s;", TABLE_NAME, condition);
            Log.d(TAG, "query sql: "+sql);
            ArrayList<UserInfo> infoArray = new ArrayList<UserInfo>();
            // 获得游标对象
            Cursor cursor = mDB.rawQuery(sql, null);
            if (cursor.moveToFirst()) {
                for (;; cursor.moveToNext()) {
                    UserInfo info = new UserInfo();
                    info.rowid = cursor.getLong(0);
                    info.xuhao = cursor.getInt(1);
                    info.name = cursor.getString(2);
                    info.age = cursor.getInt(3);
                    info.height = cursor.getLong(4);
                    info.weight = cursor.getFloat(5);
                    //SQLite没有布尔型,用0表示false,用1表示true
                    info.married = (cursor.getInt(6)==0)?false:true;
                    info.update_time = cursor.getString(7);
                    info.phone = cursor.getString(8);
                    info.password = cursor.getString(9);
                    infoArray.add(info);
                    if (cursor.isLast() == true) {
                        break;
                    }
                }
            }
            cursor.close();
            return infoArray;
        }
    
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    • 105
    • 106
    • 107
    • 108
    • 109
    • 110
    • 111
    • 112
    • 113
    • 114
    • 115
    • 116
    • 117
    • 118
    • 119
    • 120
    • 121
    • 122
    • 123
    • 124
    • 125
    • 126
    • 127
    • 128
    • 129
    • 130
    • 131
    • 132
    • 133
    • 134
    • 135
    • 136
    • 137
    • 138
    • 139
    • 140
    • 141
    • 142
    • 143
    • 144
    • 145
    • 146
    • 147
    • 148
    • 149
    • 150
    • 151
    • 152
    • 153
    • 154
    • 155
    • 156
    • 157
    • 158
    • 159
    • 160
    • 161
    • 162
    • 163
    • 164
    • 165
    • 166
    • 167
    • 168
    • 169
    • 170
    • 171
    • 172
    • 173
    • 174
    • 175
    • 176
    • 177
    • 178
    • 179
    • 180
    • 181
    • 182
    • 183
    • 184
    • 185
    • 186
    • 187
    • 188
    • 189
    • 190
    • 191
    • 192
    • 193
    • 194
    • 195
    • 196
    • 197
    • 198
    • 199
    • 200
    • 201
    • 202
    • 203
    • 204
    • 205
    • 206
    • 207
    • 208
    • 209
    • 210
    • 211
    • 212
    • 213
    • 214
    • 215
    • 216
    • 217
    • 218
    • 219
    • 220
    • 221
    • 222
    • 223
    • 224
    • 225
    • 226
    • 227
    • 228
    • 229
    • 230
    • 231
    public class UserInfo {
    	public long rowid;
    	public int xuhao;
    	public String name;
    	public int age;
    	public long height;
    	public float weight;
    	public boolean married;
    	public String update_time;
    	public String phone;
    	public String password;
    	
    	public UserInfo() {
    		rowid = 0l;
    		xuhao = 0;
    		name = "";
    		age = 0;
    		height = 0l;
    		weight = 0.0f;
    		married = false;
    		update_time = "";
    		phone = "";
    		password2 = "";
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
  • 相关阅读:
    【uniCloud】云对象的应用与提升
    PHP生成图形验证码
    【Vue3】什么是路由?Vue中的路由基本切换~
    WooCommerce REST API的初学者指南
    PyTorch C++扩展用于AMD GPU
    Linux 定时器使用
    springcloud使用openFeign
    智能合约通过getAmountsOut方法获取最近币对价格
    基于ZYNQ的PCIE高速数据采集卡的设计(三)硬件设计
    HDRP Water & 云影
  • 原文地址:https://blog.csdn.net/weixin_45688141/article/details/126353414