SQLiteDatabase資料庫操作詳解,sqlitedatabase詳解

來源:互聯網
上載者:User

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







聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.