zoukankan      html  css  js  c++  java
  • Android开发12——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的一种构造方法

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

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

    http://blog.sina.com.cn/s/blog_67aaf444010161e9.html

  • 相关阅读:
    『Python基础』第3节:变量和基础数据类型
    Python全栈之路(目录)
    前端
    Python十讲
    Ashampoo Driver Updater
    druid 连接池的配置
    webService 入门级
    pom
    pom----Maven内置属性及使用
    webservice 总结
  • 原文地址:https://www.cnblogs.com/chen110xi/p/3247332.html
Copyright © 2011-2022 走看看