Android開發——Andorid中操作數據庫的insert的兩種方法以及nullColumnHack


一、發現問題

先看兩種方法插入數據

[java]  view plain copy print ?
 
  1. public void save(Person p)  
  2. {  
  3.  SQLiteDatabase db = dbHelper.getWritableDatabase();  
  4.  db.execSQL("insert into person(name,phone) values (?,?)", new Object[] { p.getName(), p.getPhone() });  
  5.  db.close();  
  6. }  
  7.   
  8. public void save(Person p)  
  9. {  
  10.  SQLiteDatabase db = dbHelper.getWritableDatabase(); // 取得數據庫操作實例  
  11.  ContentValues values = new ContentValues();  
  12.  values.put("name", p.getName());  
  13.  values.put("phone", p.getPhone());  
  14.  db.insert("person", "name", values);  
  15.  db.close();  
  16. }  

這兩種方法可讀性都比較好,但我們注意到db.insert("person", "name", values);操作中有一個name字段是什么意思呢?

 


二、解決問題

insert的一種構造方法

[java]  view plain copy print ?
 
  1. 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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM