SQLiteDatabase資料庫操作詳解,sqlitedatabase詳解
今天花了點時間總結了一下資料的相關知識android中系統內建的資料庫SQLiteDatabase資料庫,這種資料庫操作起來比ormLite資料庫(第三方的)麻煩點,但是我對這種資料庫操作比較熟悉所以我就採用了這種資料庫,如有錯誤歡迎大家批評指正,謝謝
1.SQLiteDatabase SQLiteDatabase本身是一個資料庫的操作類,但是如果想進行資料庫的操作,還需要android.database.sqlite.SQLiteOpenHelper類的協助,在執行SQL語句時execSQL()方法不能返回一個值為Android中對execSQL()方法的說明
2.SQLiteOpenHelper(摘自李興華android實戰開經典) SQLiteOpenHelper是資料庫操作的輔助類,並且它是一個抽象類別,所以使用時需要定義其子類,並且在子類中複寫相應的抽象方法。
在SQLiteOpenHelper類中定義了三個回調方法。 2.1 onCreate() 此方法在第一次使用資料庫時調用產生相應的資料庫表,但是此方法並不是在執行個體化SQLiteOpenHelper類的對象時調用,而是通過對象調用了getReadableDatabase()或getWriteableDatabase()方法時才會調用。 2.2 onUpgrade() 當資料庫升級時會調用此方法,一般可以再此方法中將資料表刪除,並且在刪除表之後往往會調onCreate()方法重新建立新的資料表。 2.3 onopen() 當資料庫開啟時會調用此方法,但是一般情況下使用者不需要複寫此方法。
3.Android中資料庫的增刪改查範例程式碼 3.1布局圖如下
3.2主機面的代碼如下:
package com.example.contentvaluespractice;import android.app.Activity;import android.content.ContentValues;import android.database.Cursor;import android.database.sqlite.SQLiteDatabase;import android.database.sqlite.SQLiteOpenHelper;import android.os.Bundle;import android.view.View;public class MainActivity extends Activity { private SQLiteDatabase db; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout. activity_main); SQLiteOpenHelper helper= new DatabaseHelper(this);//SQLiteOpenHelper協助類進行資料庫的操作 //執行oncreate 方法返回資料庫。db資料庫只有在執行了getWritetableDatabase()或getReadableDatabase()方法後執行Oncreate()方法才建立 db=helper.getWritableDatabase(); } //向資料庫中插入資料的兩種方式,一種是通過sql語句,一種是通過android提供的方法 public void insert(View view){ //插入資料的sql語句方法 String sql="insert into personData(name,age,birthday) values ('dmk',null,'1988-9-10')";//sql語句執行插入操作 db.execSQL(sql); //插入資料的第二種方式android中提供的方法 //使用ContentValues進行插入操作ContentValues相當於java中的Map以索引值對的形式存在 ContentValues cv= new ContentValues(); cv.put("name", "dmj"); cv.put("age", 26); db.insert("personData", null,cv); } //從資料庫中刪除資料兩種方式,一種是通過sql語句,一種是通過android提供的方法 public void delete(View view){ //1.使用android中的方式 String whereClause= "name=?"; //刪除條件 String[] whereArgs={ "dmk"}; db.delete("personData", whereClause, whereArgs); //2.使用execSQL方式實現 String sql= "delete from personData where name='dmj'" ; db.execSQL(sql); } //更新資料庫中的資料2種方式 public void update(View view){ //1.使用安卓中的ContentValues ContentValues cv= new ContentValues(); cv.put( "name", "df"); //添加要更改的欄位及內容// String whereClause="name=?";// String[] whereArgs={" dmk"};// db.update("personDate", cv, whereClause, whereArgs); db.update("personData", cv, "name=?", new String[]{"dmk"}); //2.使用execSQL的方式實現 String sql= "update [personData] set age=20 where name='dmj'"; db.execSQL(sql); //execSQL()方法不能返回一個值, } //查詢資料1 /* * 通過query實現查詢的 public Cursor query(String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy, String limit) 各參數說明: table:表名稱 colums:列名稱數組 selection:條件子句,相當於where 舉例 "name=?" selectionArgs:條件陳述式的參數數組 舉例 new String[]{ "dmk"} groupBy:分組 having:分組條件 orderBy:排序類 limit:分頁查詢的限制 Cursor:傳回值,相當於結果集ResultSet */ public void query(View view){ Cursor cs= db.query( "personData", null, null, null, null, null, null); if(cs.moveToNext()){ for( int i=0;i<cs.getCount();i++){ cs.move(i); String name=cs.getString(cs.getColumnIndex("name" )); int age=cs.getInt(cs.getColumnIndex( "age")); System. out.println(name+ ":"+age); System.out.println(cs.getColumnIndex("name" )); System. out.println(cs.getColumnIndex( "age")); System. out.println(cs.getColumnCount()); } } } //資料查詢2 //通過rawQuery實現的帶參數查詢 /* Cursor c = db.rawQuery("select * from user where username=?",new Stirng[]{"Jack Johnson"}); if(cursor.moveToFirst()) { String password = c.getString(c.getColumnIndex("password")); */ public void rawquery(View view){ Cursor c= db.rawQuery( "select * from personData where name=?", new String[]{"dmj"}); if(c.moveToNext()){ int age=c.getInt(c.getColumnIndex( "age")); System. out.println(age); } }}3.3DatabaseHelpter類的代碼如下:
<pre name="code" class="java"><pre name="code" class="java">package com.example.contentvaluespractice;import android.content.Context;import android.database.sqlite.SQLiteDatabase;import android.database.sqlite.SQLiteOpenHelper;public class DatabaseHelper extends SQLiteOpenHelper { private static final String DB_NAME = "person.db"; //資料庫名稱 private static final int version = 1; //資料庫版本 public DatabaseHelper (Context context) { super(context, DB_NAME, null, version); } @Override public void onCreate(SQLiteDatabase db) { //此方法只有在調用getWritableDatabase()或getReadableDatabase()方法時才會執行 String sql = "create table personData("+ "id integer primary key," + "name varchar(20) not null," + "age Integer," + "birthday date)"; db.execSQL(sql); } //如果DATABASE_VERSION值被改為2,系統發現現有資料庫版本不同,即會調用onUpgrade @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { db.execSQL("。。。。。。。。"); }}
4.針對遊標的方法
| 方法名稱 |
方法描述 |
| getCount() |
總記錄條數 |
| isFirst() |
判斷是否第一條記錄 |
| isLast() |
判斷是否最後一條記錄 |
| moveToFirst() |
移動到第一條記錄 |
| moveToLast() |
移動到最後一條記錄 |
| move(int offset) |
移動到指定的記錄 |
| moveToNext() |
移動到嚇一條記錄 |
| moveToPrevious() |
移動到上一條記錄 |
| getColumnIndex(String columnName) |
獲得指定列索引的int類型值 |
5 使用Contenvalues 注意事項
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(NULL);這是不允許的。
若添加上nullColumnHack則sql語句將會變成insert into tableName (nullColumnHack)values(null);這是可以的。