閱讀543 返回首頁    go 阿裏雲 go 技術社區[雲棲]


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

 

參考地址:https://mofan.iteye.com/blog/1412262

 

最後更新:2017-04-04 07:32:09

  上一篇:go Spring中的注解
  下一篇:go 數據分頁時每頁首條記錄索引如何計算