Andorid中操作数据库的insert的两种方法以及nullColumnHack

一、发现问题
先看两种方法插入数据
public void save(Person p){    
SQLiteDatabase db = dbHelper.getWritableDatabase();   
db.execSQL("insert into person(name,phone) values (?,?)", new Object[] { p.getName(), p.getPhone() });   
db.close();
}      
public void save(Person p){    
SQLiteDatabase db = dbHelper.getWritableDatabase(); 
// 取得数据库操作实例    
ContentValues values = new ContentValues();    
values.put("name", p.getName());    
values.put("phone", p.getPhone());
db.insert("person", "name", values);    
db.close(); 
} 

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

二、解决问题
insert的一种构造方法

01 public long insert (String table, String nullColumnHack, ContentValues values)   


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);这是可以的。

转载地址

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值