日常搬砖sqlite可用类型与存储类型

566 阅读2分钟

前言

之前有一篇文章上讲到 cursor.getType(cursor.getColumnIndex(key)) 可以获取到对应值的类型,通过cursor 类可以知道,cursor 就提供了4种类型。而ContentValues 定义了不止4总类型,sqlite的插入与更新都可以通过ContentValues 对象进行操作的。目录地址

  • cursor 定义了4种类型
  • ContentValues 定义了不止4总类型
  • sqlite 插入更新都可以通过 ContentValues 对象进行
  • 问题1:sqlite 在创建表的时候是否支持所以的ContentValues 定义类型。
  • 问题2:sqlite 支持的类型 对应了cursor中的哪些类型。
  • 有一个教程博客写的很清晰runoob SQLite 数据类型

安利一个软件sqlitestudio。/data/data/PACKAGE NAME/ 是sqlite 默认存储路径。

正文

创建sqlite表

ContentValues 支持存放主要类型:String,Byte,Short,Integer,Long,Float,Double,Boolean,byte[]等。那么创建sql,我们知道 string 是通过varchar 存储。不知道直接写string 是否可以创建表。

 create table if not exists all_content_values ( _id Integer  primary key autoincrement , string_key String, byte_key Byte,short_key Short ,long_key Long, float_key Float,double_key Double,Boolean_key Boolean,byte_array byte[] )

if not exists 这个是用于防止表重复创建。

通过表名获取表中的字段

通过上面的创建表的表名 all_content_values

private void getTabInfoByName(String tab_name) {
    String sql="PRAGMA table_info("+tab_name+")";
    Cursor cursor = db.rawQuery(sql, null);
    LogUtils.e(cursor.getColumnNames());
    List<String> keys=new ArrayList<>();
    while (cursor.moveToNext()){
        keys.add(cursor.getString(cursor.getColumnIndex("name")));
    }
    LogUtils.e(keys);

}
//获取到的数据 keys
[_id, string_key, byte_key, short_key, long_key, float_key, double_key, Boolean_key, byte_array]

创建时候设定的字段: _id,string_key,byte_key,short_key,long_key,float_key,double_key,Boolean_key,byte_array.这么一对比,好像没有少字段,而且表好像还创建成功了,emmmm? 那么我创建表的时候是不是可以直接用存了啊,不用把string 写成 varchar 了。通过 sqlitestudio 也可以直接查看表结构

存储字段

runoob JAVA 基础数据类型 目录地址 sqlite 增删改查

存储数据通过 ContentValues

ContentValues values=new ContentValues();
//因为int对应的是自增主键 所以不对int 进行赋值。
values.put("string_key","string_key");
values.put("byte_key",100);
values.put("short_key",50);
values.put("long_key",1l);
values.put("float_key",1f);
values.put("double_key",1d);
values.put("Boolean_key",true);
values.put("byte_array",new byte[]{100,50});
long insert = db.insert(SQLTab.tab_name_all_V, null, values);

当 insert 返回值不为-1的时候就插入插入成功了。

将插入的数据获取出来

 private void getAllContentValues() {
        //直接查询所以字段
        String sql="SELECT * from "+SQLTab.tab_name_all_V;
        Cursor cursor = db.rawQuery(sql, null);
        ArrayMap<Integer,List<String>> types=new ArrayMap<>();
        while (cursor.moveToNext()){
            for (String key: cursor.getColumnNames()){
                int type = cursor.getType(cursor.getColumnIndex(key));
                if (types.containsKey(type)){
                    if (!types.get(type).contains(key)){
                        types.get(type).add(key);
                    }
                }else {
                    List<String> keys=new ArrayList<>();
                    keys.add(key);
                    types.put(type,keys);
                }

            }
        }
        LogUtils.e(new Gson().toJson(types));
    }

通过log打印

{"1":["_id","byte_key","short_key","long_key","Boolean_key"],"2":["float_key","double_key"],"3":["string_key"],"4":["byte_array"]}

cursor 中type与ContentValues 对应

cursor 定义类型中 FIELD_TYPE_NULL=0,FIELD_TYPE_INTEGER=1,FIELD_TYPE_FLOAT=2,FIELD_TYPE_STRING=3,FIELD_TYPE_BLOB = 4。那么 我们可以总结下。

  • FIELD_TYPE_INTEGER =1 包含的类型有 int,byte,short,long,Boolean。
  • FIELD_TYPE_FLOAT=2 包含的类型有: float,double。
  • FIELD_TYPE_STRING=3 包含的类型有:string
  • FIELD_TYPE_BLOB = 4 包含的类型有:byte []

通过上面的关系,我们就可以通过反射将cursor 中的值赋值到应该class 对象上面去了。同时也可以cursor中的值转化为ContentValues 对象。

结束

谢谢光临,若觉得还行麻烦点一下赞,若觉得写得垃圾,欢迎批评指正。笔者知道自己文笔和表达能力很弱,如果您可以提供点宝贵的意见不胜感激。谢谢。

今天也可以是元气满满的一天哦。