Andorid中操作数据库的insert的两种方法以及nullColumnHack
2015-06-08 20:56
477 查看
一、发现问题
先看两种方法插入数据
[java] view
plaincopy
<pre class="java" name="code">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();</pre><pre class="java" name="code">}
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(); </pre><pre class="java" name="code">}
</pre>
这两种方法可读性都比较好,但我们注意到db.insert("person", "name", values);操作中有一个name字段是什么意思呢?
二、解决问题
insert的一种构造方法
[java] view
plaincopy
01 public long insert (String table, String nullColumnHack, ContentValues values)
table
要插入数据的表的名称
values
ContentValues对象,类似一个map通过键值对的形式存储值。
nullColumnHack(其实说白了就是数据库不允许写了一个name是空,value也是空的行,所以至少写个名字,万一不写数据,直接在名字下面写null(value))
当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);这是可以的。
先看两种方法插入数据
[java] view
plaincopy
<pre class="java" name="code">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();</pre><pre class="java" name="code">}
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(); </pre><pre class="java" name="code">}
</pre>
这两种方法可读性都比较好,但我们注意到db.insert("person", "name", values);操作中有一个name字段是什么意思呢?
二、解决问题
insert的一种构造方法
[java] view
plaincopy
01 public long insert (String table, String nullColumnHack, ContentValues values)
table
要插入数据的表的名称
values
ContentValues对象,类似一个map通过键值对的形式存储值。
nullColumnHack(其实说白了就是数据库不允许写了一个name是空,value也是空的行,所以至少写个名字,万一不写数据,直接在名字下面写null(value))
当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);这是可以的。
相关文章推荐
- Oracle数据库shutdown immediate被hang住的几个原因
- Oracle数据排查or业务sql优化常用SQL
- mysql数据类型
- mysql---运维角度浅谈MySQL数据库优化
- 查看oracle无效对象
- (DBA之路【二】)mysql 主流存储引擎的特点
- Redhat 6.6 mysql 5.1升级到5.6步骤
- oracle设置账户永不过期
- DMSFrame 之SqlCacheDependency(二)
- redis学习
- postgresql 数据导入导出
- 简单sql问题
- mysql-5.6.25 编译安装 和 使用 xstrabackup 备份实战 (二)
- Redmine数据库备份及搬家
- 11g查看性能慢sql的一个方法
- Greenplum 数据库安装部署(生产环境)
- 如何阅读 Redis 源码?
- Mysql安装常见问题
- redhat6.3下安装ORACLE11.2.3RAC
- 数据库分页查询SQL语句