android小问题--------------------SQLiteDatabase.insert(table, nullColumnHack, values)参数
2016-02-20 18:18
519 查看
SQLiteDatabase除了可以通过execSQL()直接执行SQL语句之外,还可以通过.insert(table, nullColumnHack, values)方法直接插入操作。
第一个参数为表名,第三个参数为ContentValues实例,以键值对的形式将列和值Put进去然后放入第三个参数为就行了。
那么第二个参数是什么意思,总有人搞不明白,第二个参数的字面意思其实就是:当第三个参数传入null时,第二个参数为什么。也就是说如果第三个参数不为null,那么第二个参数是不起作用的。那这又是为什么,看源码:
因为底层Insert()方法直接调用了insertWithOnConflict()方法,那么就直接贴此方法的源码:
acquireReference();
try {
StringBuilder sql = new StringBuilder();
sql.append("INSERT");
sql.append(CONFLICT_VALUES[conflictAlgorithm]);
sql.append(" INTO ");
sql.append(table);
sql.append('(');
Object[] bindArgs = null;
int size = (initialValues != null && initialValues.size() > 0)
? initialValues.size() : 0;
if (size > 0) {
bindArgs = new Object[size];
int i = 0;
for (String colName : initialValues.keySet()) {
sql.append((i > 0) ? "," : "");
sql.append(colName);
bindArgs[i++] = initialValues.get(colName);
}
sql.append(')');
sql.append(" VALUES (");
for (i = 0; i < size; i++) {
sql.append((i > 0) ? ",?" : "?");
}
} else {
sql.append(nullColumnHack + ") VALUES (NULL");
}
sql.append(')');
可以看到,此方法其实在底层也是拼接了SQL串。。。所以我说不如直接去学学SQL。。要不不懂SQL的人根本不明白为什么。。其实底层逻辑是这样的,它会根据三个参数拼接出这样的sql语句 insert into tableNmae (......) values(......) values中的值就由传入的第三个参数拼接出来的,而我们可以看到,如果第三个值传入为Null,那么去执行
sql.append(nullColumnHack + ") VALUES (NULL");也就是是说最后拼接出来的SQL为:insert into tableName(null)values(null),这样sql语法就错误的。。会报错。。所以。。就是这样的。
第一个参数为表名,第三个参数为ContentValues实例,以键值对的形式将列和值Put进去然后放入第三个参数为就行了。
那么第二个参数是什么意思,总有人搞不明白,第二个参数的字面意思其实就是:当第三个参数传入null时,第二个参数为什么。也就是说如果第三个参数不为null,那么第二个参数是不起作用的。那这又是为什么,看源码:
因为底层Insert()方法直接调用了insertWithOnConflict()方法,那么就直接贴此方法的源码:
acquireReference();
try {
StringBuilder sql = new StringBuilder();
sql.append("INSERT");
sql.append(CONFLICT_VALUES[conflictAlgorithm]);
sql.append(" INTO ");
sql.append(table);
sql.append('(');
Object[] bindArgs = null;
int size = (initialValues != null && initialValues.size() > 0)
? initialValues.size() : 0;
if (size > 0) {
bindArgs = new Object[size];
int i = 0;
for (String colName : initialValues.keySet()) {
sql.append((i > 0) ? "," : "");
sql.append(colName);
bindArgs[i++] = initialValues.get(colName);
}
sql.append(')');
sql.append(" VALUES (");
for (i = 0; i < size; i++) {
sql.append((i > 0) ? ",?" : "?");
}
} else {
sql.append(nullColumnHack + ") VALUES (NULL");
}
sql.append(')');
可以看到,此方法其实在底层也是拼接了SQL串。。。所以我说不如直接去学学SQL。。要不不懂SQL的人根本不明白为什么。。其实底层逻辑是这样的,它会根据三个参数拼接出这样的sql语句 insert into tableNmae (......) values(......) values中的值就由传入的第三个参数拼接出来的,而我们可以看到,如果第三个值传入为Null,那么去执行
sql.append(nullColumnHack + ") VALUES (NULL");也就是是说最后拼接出来的SQL为:insert into tableName(null)values(null),这样sql语法就错误的。。会报错。。所以。。就是这样的。
相关文章推荐
- scrapy 爬网站 显示 Filtered offsite request to 错误.
- 交换Button中图片与文字的左右位置
- UILabel在Autolayout中的多行显示/动态高度
- 循环中 break 与 continue 的区别
- 分享一款很好的视频处理软件 会声会影X8(huishenghuiyingx8-trial_x64)
- UITableView
- CodeForces 622A Infinite Sequence
- EasyUI系列学习(九)-Panel(面板)
- uiautomatorviewer获取当前屏幕中的各个元素信息包括类名
- 1041. Be Unique (20)
- 【UER #1】跳蚤OS(Trie)
- php中$_REQUEST、$_POST、$_GET的区别和联系小结
- 求php中的request详细用法
- CodeForces 626A Robot Sequence
- RequireJS 与 SeaJS 的异同
- the behavior of the UICollectionViewFlowLayout is not defined because:
- POJ 2299 Ultra-QuickSort(树状数组+离散化)
- 制作 Nine-Patch 图片
- UIScrollView
- iOS UIView及其子控件的常用设置