Sqlite insert方法nullColumnHack字段的含义

前端之家收集整理的这篇文章主要介绍了Sqlite insert方法nullColumnHack字段的含义前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

利用数据库对象sqliteDatabase对数据库进行增删改查操作。

这里要强调一点,无论我们怎么获得的数据库连接,我们可以看到,我们最后都是为了获得一个sqliteDatabase对象,而我们的所以增删改查方法便都是通过这个对象来实现的。

增加数据:

参数介绍:

table 要插入数据的表的名称

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

conflictAlgon:冲突解决方案。例如当数据表主键的唯一性检测出错的时候,就会按照该值设定的值进行处理。

nullColumnHack:当values参数为空或者里面没有内容的时候,我们insert是会失败的(底层数据库不允许插入一个空行),为了防止这种情况,我们要在这里指定一个列名,到时候如果发现将要插入的行为空行时,就会将你指定的这个列名的值设为null,然后再向数据库中插入。

(这里很多人会迷惑,nullColumnHack到底干什么用的,为什么会出现呢。当我们不设定一列的时候,不都是数据库给设为默认值吗?很多字段设置默认值也是null,这里显示的设置也是null,有什么区别吗,怎么会显示设置了之后就允许插入了呢?笔者为了找到原因,我去查看了源代码

其实在底层,各种insert方法最后都回去调用insertWithOnConflict方法,这里我们粘贴出该方法的部分实现

  1. /**
  2. *Generalmethodforinsertingarowintothedatabase.
  3. *
  4. *@paramtablethetabletoinserttherowinto
  5. *@paramnullColumnHacksqldoesn'tallowinsertingacompletelyemptyrow,
  6. *soifinitialValuesisemptythiscolumnwillexplicitlybe
  7. *assignedaNULLvalue
  8. *@paraminitialValuesthismapcontainstheinitialcolumnvaluesforthe
  9. *row.Thekeysshouldbethecolumnnamesandthevaluesthe
  10. *columnvalues
  11. *@paramconflictAlgorithmforinsertconflictresolver
  12. *@returntherowIDofthenewlyinsertedrow
  13. *ORtheprimarykeyoftheexistingrowiftheinputparam'conflictAlgorithm'=
  14. *{@link#CONFLICT_IGNORE}
  15. *OR-1ifanyerror
  16. */
  17. publiclonginsertWithOnConflict(Stringtable,StringnullColumnHack,92); line-height:18px"> ContentValuesinitialValues,intconflictAlgorithm){
  18. if(!isOpen()){
  19. thrownewIllegalStateException("databasenotopen");
  20. }
  21. //Measurementsshowmostsqllengths<=152
  22. StringBuildersql=newStringBuilder(152);
  23. sql.append("INSERT");
  24. sql.append(CONFLICT_VALUES[conflictAlgorithm]);
  25. sql.append("INTO");
  26. sql.append(table);
  27. //Measurementsshowmostvalueslengths<40
  28. StringBuildervalues=40);
  29. Set<Map.Entry<String,Object>>entrySet=null;
  30. if(initialValues!=null&&initialValues.size()>0){
  31. entrySet=initialValues.valueSet();
  32. Iterator<Map.Entry<String,Object>>entriesIter=entrySet.iterator();
  33. sql.append('(');
  34. booleanneedSeparator=false;
  35. while(entriesIter.hasNext()){
  36. if(needSeparator){
  37. sql.append(",");
  38. values.append(",");
  39. needSeparator=true;
  40. Map.Entry<String,Object>entry=entriesIter.next();
  41. sql.append(entry.getKey());
  42. values.append('?');
  43. }
  44. sql.append(')');
  45. }else{
  46. sql.append("("+nullColumnHack+")");
  47. values.append("NULL");
  48. }

这里我们可以看到,当我们的ContentValues类型的数据initialValues为null,或者size<=0时,就会再sql语句中添加nullColumnHack的设置。我们可以想象一下,如果我们不添加nullColumnHack的话,那么我们的sql语句最终的结果将会类似insert into tableName()values();这显然是不允许的。而如果我们添加上nullColumnHack呢,sql将会变成这样,insert into tableName (nullColumnHack)values(null);这样很显然就是可以的。

猜你在找的Sqlite相关文章