当前位置: 首页 > news >正文

Android开发12——Andorid中操作数据库的insert的两种方法以及nullColumnHack

一、发现问题

先看两种方法插入数据

 
 
  1. public void save(Person p)  
  2. {  
  3.  SQLiteDatabase db = dbHelper.getWritableDatabase();  
  4.  db.execSQL("insert into person(name,phone) values (?,?)"new Object[] { p.getName(), p.getPhone() });  
  5.  db.close();  
  6. }  
  7.  
  8. public void save(Person p)  
  9. {  
  10.  SQLiteDatabase db = dbHelper.getWritableDatabase(); // 取得数据库操作实例  
  11.  ContentValues values = new ContentValues();  
  12.  values.put("name", p.getName());  
  13.  values.put("phone", p.getPhone());  
  14.  db.insert("person""name", values);  
  15.  db.close();  
  16. }  
  17.  

这两种方法可读性都比较好,但我们注意到db.insert("person", "name", values);操作中有一个name字段是什么意思呢?

 


二、解决问题

insert的一种构造方法

 
 
  1. public long insert (String table, String nullColumnHack, ContentValues values)  
  2.  

table

要插入数据的表的名称

values

ContentValues对象,类似一个map通过键值对的形式存储值。

nullColumnHack

当values参数为空或者里面没有内容的时候,insert是会失败的(底层数据库不允许插入一个空行),为了防止这种情况,要在这里指定一个列名,到时候如果发现将要插入的行为空行时,就会将你指定的这个列名的值设为null,然后再向数据库中插入。通过观察源码的insertWithOnConflict方法可以看到当ContentValues类型的数据initialValues为null或size<=0时,就会在sql语句中添加nullColumnHack的设置。

若不添加nullColumnHack则sql语句最终的结果将会类似insert into tableName()values();这是不允许的。

若添加上nullColumnHack则sql语句将会变成insert into tableName (nullColumnHack)values(null);这是可以的。

参考地址:http://mofan.iteye.com/blog/1412262

本文转自IT徐胖子的专栏博客51CTO博客,原文链接http://blog.51cto.com/woshixy/1083605如需转载请自行联系原作者


woshixuye111

相关文章:

  • 黑客系列-以彼之道还施彼身
  • [web前端] yarn和npm命令使用
  • 在windows上搭建镜像yum站的方法(附bat脚本)
  • 动手做个聊天室,前端工程师百无聊赖的人生
  • Price Tag | INTERVIEW 03 | 独立开发者 Tolecen
  • GitHub上优秀的Go开源项目
  • 51CTO试一下
  • 《从零开始学Swift》学习笔记(Day 10)——运算符是“ +、-、*、/ ”吗?
  • 从7个骨架项目启动你的rails开发
  • 宿主机为linux、windows分别实现VMware三种方式上网
  • DELPHI存储过程调用
  • Java集合源码分析之LinkedList
  • 消息总线重构之EventBus
  • XLSReadWriteII5导入excel数据
  • 记录:Spring JdbcTemplate查询返回的Map与数据库对查询字段名的处理
  • JS中 map, filter, some, every, forEach, for in, for of 用法总结
  • [译]CSS 居中(Center)方法大合集
  • co.js - 让异步代码同步化
  • express.js的介绍及使用
  • JAVA并发编程--1.基础概念
  • Linux各目录及每个目录的详细介绍
  • Promise面试题2实现异步串行执行
  • 每个JavaScript开发人员应阅读的书【1】 - JavaScript: The Good Parts
  • 让你成为前端,后端或全栈开发程序员的进阶指南,一门学到老的技术
  • 如何将自己的网站分享到QQ空间,微信,微博等等
  • 设计模式走一遍---观察者模式
  • 适配iPhoneX、iPhoneXs、iPhoneXs Max、iPhoneXr 屏幕尺寸及安全区域
  • 最近的计划
  • 东超科技获得千万级Pre-A轮融资,投资方为中科创星 ...
  • #每天一道面试题# 什么是MySQL的回表查询
  • #中国IT界的第一本漂流日记 传递IT正能量# 【分享得“IT漂友”勋章】
  • (Matalb分类预测)GA-BP遗传算法优化BP神经网络的多维分类预测
  • (Matlab)基于蝙蝠算法实现电力系统经济调度
  • (Redis使用系列) Springboot 实现Redis 同数据源动态切换db 八
  • (博弈 sg入门)kiki's game -- hdu -- 2147
  • (七)MySQL是如何将LRU链表的使用性能优化到极致的?
  • (转载)VS2010/MFC编程入门之三十四(菜单:VS2010菜单资源详解)
  • .htaccess 强制https 单独排除某个目录
  • .MyFile@waifu.club.wis.mkp勒索病毒数据怎么处理|数据解密恢复
  • .NET CF命令行调试器MDbg入门(一)
  • .net core webapi Startup 注入ConfigurePrimaryHttpMessageHandler
  • .net framework profiles /.net framework 配置
  • .NET 反射的使用
  • .net 微服务 服务保护 自动重试 Polly
  • .Net(C#)常用转换byte转uint32、byte转float等
  • .NET命令行(CLI)常用命令
  • .NET中的十进制浮点类型,徐汇区网站设计
  • /etc/shadow字段详解
  • /etc/X11/xorg.conf 文件被误改后进不了图形化界面
  • /proc/stat文件详解(翻译)
  • @RequestParam @RequestBody @PathVariable 等参数绑定注解详解
  • @vue/cli脚手架
  • [2019/05/17]解决springboot测试List接口时JSON传参异常
  • [Android] Implementation vs API dependency
  • [Android开源]EasySharedPreferences:优雅的进行SharedPreferences数据存储操作