Android中SQLite資料庫操作

來源:互聯網
上載者:User

  一.基礎知識:

  1.SQLite的資料類型:

  NULL:空值。

  INTEGER:帶符號的整型,具體取決有存入數位範圍大小。

  REAL:浮點數字,儲存為8-byte IEEE浮點數。

  TEXT:字串文本。

  BLOB:二進位對象。

  smallint 16位元的整數。

  interger 32位元的整數。

  decimal(p,s) p 精確值和 s 大小的十進位整數,精確值p是指全部有幾個數(digits)大小值,s是指小數點後有幾位元。如果沒有特別指定,則系統會設為 p=5; s=0 。

  float 32位元的實數。

  double 64位元的實數。

  char(n) n 長度的字串,n不能超過 254。

  varchar(n) 長度不固定且其最大長度為 n 的字串,n不能超過 4000。

  graphic(n) 和 char(n) 一樣,不過其單位是兩個字元 double-bytes, n不能超過127。這個形態是為了支援兩個字元長度的字型,例如中文字。

  vargraphic(n) 可變長度且其最大長度為 n 的雙字元字串,n不能超過 2000

  date 包含了 年份、月份、日期。

  time 包含了 小時、分鐘、秒。

  timestamp 包含了 年、月、日、時、分、秒、千分之一秒。

  datetime 包含日期時間格式,必須寫成'2010-08-05'不能寫為'2010-8-5',否則在讀取時會產生錯誤!

  2.SQLite的基本操作:

  ①SQLiteOpenHelper 抽象類別:通過從此類繼承實現使用者類,來提供資料庫開啟、關閉等操作函數。

  [java]

  // 建立資料庫

  public void onCreate(SQLiteDatabase db)

  // 更新資料庫

  public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)

  // 開啟資料庫

  public void onOpen(SQLiteDatabase db)

  // 得到一個可讀SQLiteDatabase對象

  public synchronized SQLiteDatabase getReadableDatabase()

  // 得到一個可寫SQLiteDatabase對象

  public synchronized SQLiteDatabase getWriteableDatabase()

  // 建立資料庫

  public void onCreate(SQLiteDatabase db)

  // 更新資料庫

  public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)

  // 開啟資料庫

  public void onOpen(SQLiteDatabase db)

  // 得到一個可讀SQLiteDatabase對象

  public synchronized SQLiteDatabase getReadableDatabase()

  // 得到一個可寫SQLiteDatabase對象

  public synchronized SQLiteDatabase getWriteableDatabase()

  ②SQLiteDatabase 資料庫訪問類:執行對資料庫的插入記錄、查詢記錄等操作。

  [java]

  execSQL()方法可以執行insert、delete、update和CREATE TABLE之類有更改行為的SQL語句;

  rawQuery()方法可以執行select語句。

  query(table, columns, selection, selectionArgs, groupBy, having, orderBy, limit)

  table:表名。相當於select語句from關鍵字後面的部分。如果是多表聯集查詢,可以用逗號將兩個表名分開。

  columns:要查詢出來的列名。相當於select語句select關鍵字後面的部分。

  selection:查詢條件子句,相當於select語句where關鍵字後面的部分,在條件子句允許使用預留位置“?”

  selectionArgs:對應於selection語句中預留位置的值,值在數組中的位置與預留位置在語句中的位置必須一致,否則就會有異常。

  groupBy:相當於select語句group by關鍵字後面的部分

  having:相當於select語句having關鍵字後面的部分

  orderBy:相當於select語句order by關鍵字後面的部分,如:personid desc, age asc;

  limit:指定位移量和擷取的記錄數,相當於select語句limit關鍵字後面的部分。

  //還有兩個,網上貌似都用的比較少,而我們這個例子中採用的是這些:

  public long insert(

  String table, // 待插入的表名

  String nullColumnHack, // 通常設定為null

  ContentValues values // 待插入的資料

  )

  public int update(

  String table, // 待更新的表名

  ContentValues values, // 待更新的內容

  String whereClause, // 選擇通過哪個欄位來更新

  String [] whereArgs // 為whereClause欄位要查詢的值

  )

  execSQL()方法可以執行insert、delete、update和CREATE TABLE之類有更改行為的SQL語句;

  rawQuery()方法可以執行select語句。

  query(table, columns, selection, selectionArgs, groupBy, having, orderBy, limit)

  table:表名。相當於select語句from關鍵字後面的部分。如果是多表聯集查詢,可以用逗號將兩個表名分開。

  columns:要查詢出來的列名。相當於select語句select關鍵字後面的部分。

  selection:查詢條件子句,相當於select語句where關鍵字後面的部分,在條件子句允許使用預留位置“?”

  selectionArgs:對應於selection語句中預留位置的值,值在數組中的位置與預留位置在語句中的位置必須一致,否則就會有異常。

  groupBy:相當於select語句group by關鍵字後面的部分

  having:相當於select語句having關鍵字後面的部分

  orderBy:相當於select語句order by關鍵字後面的部分,如:personid desc, age asc;

  limit:指定位移量和擷取的記錄數,相當於select語句limit關鍵字後面的部分。

  //還有兩個,網上貌似都用的比較少,而我們這個例子中採用的是這些:

  public long insert(

  String table, // 待插入的表名

  String nullColumnHack, // 通常設定為null

  ContentValues values // 待插入的資料

  )

  public int update(

  String table, // 待更新的表名

  ContentValues values, // 待更新的內容

  String whereClause, // 選擇通過哪個欄位來更新

  String [] whereArgs // 為whereClause欄位要查詢的值

  )

  ③下面為網上常用的訪問資料庫的一般流程:

  [java]

  public void onClick(View v) {

  DatabaseHelper databaseHelper = new DatabaseHelper(HelloActivity.this);

  SQLiteDatabase db = databaseHelper.getWritableDatabase();

  db.execSQL("insert into person(name, age) values(?,?)", new Object[]{"傳智播客", 4});

  db.close();

  };

  public void onClick(View v) {

  DatabaseHelper databaseHelper = new DatabaseHelper(HelloActivity.this);

  SQLiteDatabase db = databaseHelper.getWritableDatabase();

  db.execSQL("insert into person(name, age) values(?,?)", new Object[]{"傳智播客", 4});

  db.close();

  };

  二.編程實現:

  1. 介面編輯(reslayoutmain.xml):

  [java]

  

  android:orientation="vertical"

  android:layout_width="fill_parent"

  android:layout_height="fill_parent"

  >

  

  android:text="建立資料庫"

  android:id="@+id/ButtonCreate"

  android:layout_width="fill_parent"

  android:layout_height="wrap_content">

  

  

  android:text="增加資料"

  android:id="@+id/ButtonInsert"

  android:layout_width="fill_parent"

  android:layout_height="wrap_content">

  

  

  android:text="更新資料"

  android:id="@+id/ButtonUpdate"

  android:layout_width="fill_parent"

  android:layout_height="wrap_content">

  

  

  android:text="查詢資料"

  android:id="@+id/ButtonQuery"

  android:layout_width="fill_parent"

  android:layout_height="wrap_content">

  

  

  

  android:orientation="vertical"

  android:layout_width="fill_parent"

  android:layout_height="fill_parent"

  >

  

  android:text="建立資料庫"

  android:id="@+id/ButtonCreate"

  android:layout_width="fill_parent"

  android:layout_height="wrap_content">

  

  

  android:text="增加資料"

  android:id="@+id/ButtonInsert"

  android:layout_width="fill_parent"

  android:layout_height="wrap_content">

  

  

  android:text="更新資料"

  android:id="@+id/ButtonUpdate"

  android:layout_width="fill_parent"

  android:layout_height="wrap_content">

  

  

  android:text="查詢資料"

  android:id="@+id/ButtonQuery"

  android:layout_width="fill_parent"

  android:layout_height="wrap_content">

  

  

  定義了一個垂直方向上的線性布局,及各操作的按鈕,水平方向充滿父視窗,垂直方向與內容等高。

  介面布局效果如下:

  2. 代碼編輯(srcwyfzclMyActivity.java):

  [java]

  package wyf.zcl;

  import wyf.zcl.sqlitedb.SqLiteDBHelper; //引入相關包

  import android.app.Activity; //引入相關包

  import android.content.ContentValues; //引入相關包

  import android.database.Cursor; //引入相關包

  import android.database.sqlite.SQLiteDatabase; //引入相關包

  import android.os.Bundle; //引入相關包

  import android.view.View; //引入相關包

  import android.widget.Button; //引入相關包

  import android.widget.Toast;

  public class MyActivity extends Activity {

  /** Called when the activity is first created. */

  private Button createButton; //建立資料庫按鈕

  private Button insertBut; //增加資料庫記錄按鈕

  private Button updateBut; //更新資料庫記錄按鈕

  private Button queryBut; //查詢資料庫記錄按鈕

  @Override

  public void onCreate(Bundle savedInstanceState) {

  super.onCreate(savedInstanceState);

  setContentView(R.layout.main);

  createButton=(Button)findViewById(R.id.ButtonCreate); //執行個體化建立資料庫按鈕

  insertBut=(Button)findViewById(R.id.ButtonInsert); //執行個體化插入資料庫按鈕

  updateBut=(Button)findViewById(R.id.ButtonUpdate); //執行個體化更新資料庫按鈕

  queryBut=(Button)findViewById(R.id.ButtonQuery); //執行個體化查詢資料庫按鈕

  createButton.setOnClickListener(new View.OnClickListener() {//建立資料庫時調用

  @Override

  public void onClick(View v) {

  SqLiteDBHelper dh=new SqLiteDBHelper(MyActivity.this,"testdb",null,1);//建立資料庫

  System.out.println("create or open database success!");

  SQLiteDatabase sld=dh.getReadableDatabase();

  //得到一個SQLiteDatabase對象,用於操控資料庫

  Toast.makeText(MyActivity.this, "建立或開啟資料庫", Toast.LENGTH_SHORT).show();

  }});

  insertBut.setOnClickListener(new View.OnClickListener() {//增加資料庫記錄時調用

  @Override

  public void onClick(View v) {

  ContentValues cv=new ContentValues();

  //得到ContentValues對象

  cv.put("uid", 1);

  //放入索引值對,鍵要與列名一致,值要與列的資料類型一致

  cv.put("uname", "zcl");

  //放入索引值對,鍵要與列名一致,值要與列的資料類型一致

  SqLiteDBHelper dh=new SqLiteDBHelper(MyActivity.this,"testdb",null,1);//建立資料庫

  Toast.makeText(MyActivity.this, "插入記錄", Toast.LENGTH_SHORT).show();

  SQLiteDatabase sld=dh.getWritableDatabase();

  //得到一個SQLiteDatabase對象,用於操控資料庫

  sld.insert("sqlitetest", null, cv);//增加資料庫記錄

  System.out.println("success insert a new content!");

  }});

  updateBut.setOnClickListener(new View.OnClickListener() {

  //更新資料庫記錄時調用

  @Override

  public void onClick(View v) {

  SqLiteDBHelper dh=new SqLiteDBHelper(MyActivity.this,"testdb",null,1);

  //建立資料庫

  SQLiteDatabase sld=dh.getWritableDatabase();

  //得到一個SQLiteDatabase對象,用於操控資料庫

  ContentValues cv = new ContentValues(); //得到ContentValues對象

  Toast.makeText(MyActivity.this, "更新記錄", Toast.LENGTH_SHORT).show();

  cv.put("uname", "zcl_update");

  sld.update("sqlitetest", cv, "uid=?", new String[]{"1"});//更新資料庫記錄

  System.out.println("success updata the content!");

  }});

  queryBut.setOnClickListener(new View.OnClickListener() {

  //查詢資料庫記錄時調用

  @Override

  public void onClick(View v) {

  SqLiteDBHelper dh=new SqLiteDBHelper(MyActivity.this,"testdb",null,1);//建立資料庫

  Toast.makeText(MyActivity.this, "查詢記錄", Toast.LENGTH_SHORT).show();

  SQLiteDatabase sld=dh.getReadableDatabase();

  //得到一個SQLiteDatabase對象,用於操控資料庫

  Cursor cursor=sld.query("sqlitetest", new String[]{"uid","uname"}, "uid=?",

  new String[]{"1"}, null, null, null);

  while(cursor.moveToNext()){ //列印輸出

  String name=cursor.getString(cursor.getColumnIndex("uname"));

  System.out.println("query result:"+name);

  }}});

  }

  }

  package wyf.zcl;

  import wyf.zcl.sqlitedb.SqLiteDBHelper; //引入相關包

  import android.app.Activity; //引入相關包

  import android.content.ContentValues; //引入相關包

  import android.database.Cursor; //引入相關包

  import android.database.sqlite.SQLiteDatabase; //引入相關包

  import android.os.Bundle; //引入相關包

  import android.view.View; //引入相關包

  import android.widget.Button; //引入相關包

  import android.widget.Toast;

  public class MyActivity extends Activity {

  /** Called when the activity is first created. */

  private Button createButton; //建立資料庫按鈕

  private Button insertBut; //增加資料庫記錄按鈕

  private Button updateBut; //更新資料庫記錄按鈕

  private Button queryBut; //查詢資料庫記錄按鈕

  @Override

  public void onCreate(Bundle savedInstanceState) {

  super.onCreate(savedInstanceState);

  setContentView(R.layout.main);

  createButton=(Button)findViewById(R.id.ButtonCreate); //執行個體化建立資料庫按鈕

  insertBut=(Button)findViewById(R.id.ButtonInsert); //執行個體化插入資料庫按鈕

  updateBut=(Button)findViewById(R.id.ButtonUpdate); //執行個體化更新資料庫按鈕

  queryBut=(Button)findViewById(R.id.ButtonQuery); //執行個體化查詢資料庫按鈕

  createButton.setOnClickListener(new View.OnClickListener() {//建立資料庫時調用

  @Override

  public void onClick(View v) {

  SqLiteDBHelper dh=new SqLiteDBHelper(MyActivity.this,"testdb",null,1);//建立資料庫

  System.out.println("create or open database success!");

  SQLiteDatabase sld=dh.getReadableDatabase();

  //得到一個SQLiteDatabase對象,用於操控資料庫

  Toast.makeText(MyActivity.this, "建立或開啟資料庫", Toast.LENGTH_SHORT).show();

  }});

  insertBut.setOnClickListener(new View.OnClickListener() {//增加資料庫記錄時調用

  @Override

  public void onClick(View v) {

  ContentValues cv=new ContentValues();

  //得到ContentValues對象

  cv.put("uid", 1);

  //放入索引值對,鍵要與列名一致,值要與列的資料類型一致

  cv.put("uname", "zcl");

  //放入索引值對,鍵要與列名一致,值要與列的資料類型一致

  SqLiteDBHelper dh=new SqLiteDBHelper(MyActivity.this,"testdb",null,1);//建立資料庫

  Toast.makeText(MyActivity.this, "插入記錄", Toast.LENGTH_SHORT).show();

  SQLiteDatabase sld=dh.getWritableDatabase();

  //得到一個SQLiteDatabase對象,用於操控資料庫

  sld.insert("sqlitetest", null, cv);//增加資料庫記錄

  System.out.println("success insert a new content!");

  }});

  updateBut.setOnClickListener(new View.OnClickListener() {

  //更新資料庫記錄時調用

  @Override

  public void onClick(View v) {

  SqLiteDBHelper dh=new SqLiteDBHelper(MyActivity.this,"testdb",null,1);

  //建立資料庫

  SQLiteDatabase sld=dh.getWritableDatabase();

  //得到一個SQLiteDatabase對象,用於操控資料庫

  ContentValues cv = new ContentValues(); //得到ContentValues對象

  Toast.makeText(MyActivity.this, "更新記錄", Toast.LENGTH_SHORT).show();

  cv.put("uname", "zcl_update");

  sld.update("sqlitetest", cv, "uid=?", new String[]{"1"});//更新資料庫記錄

  System.out.println("success updata the content!");

  }});

  queryBut.setOnClickListener(new View.OnClickListener() {

  //查詢資料庫記錄時調用

  @Override

  public void onClick(View v) {

  SqLiteDBHelper dh=new SqLiteDBHelper(MyActivity.this,"testdb",null,1);//建立資料庫

  Toast.makeText(MyActivity.this, "查詢記錄", Toast.LENGTH_SHORT).show();

  SQLiteDatabase sld=dh.getReadableDatabase();

  //得到一個SQLiteDatabase對象,用於操控資料庫

  Cursor cursor=sld.query("sqlitetest", new String[]{"uid","uname"}, "uid=?",

  new String[]{"1"}, null, null, null);

  while(cursor.moveToNext()){ //列印輸出

  String name=cursor.getString(cursor.getColumnIndex("uname"));

  System.out.println("query result:"+name);

  }}});

  }

  }

  (srcwyfzclzclsqlitedbSqLiteDBHelper.java):

  [java]

  package wyf.zcl.sqlitedb;

  import android.content.Context; //引入相關包

  import android.database.sqlite.SQLiteDatabase; //引入相關包

  import android.database.sqlite.SQLiteOpenHelper; //引入相關包

  import android.database.sqlite.SQLiteDatabase.CursorFactory;//引入相關包

  public class SqLiteDBHelper extends SQLiteOpenHelper{

  public SqLiteDBHelper(Context context, String name, CursorFactory factory,

  int version) {//繼承SQLiteOpenHelper的類,必須有該建構函式

  super(context, name, factory, version);

  }

  @Override

  public void onCreate(SQLiteDatabase db) {

  //建立資料庫時調用,此方法是在調用了getReadableDatabase()或getWritableDatabase()後才調用

  db.execSQL("create table sqlitetest(uid long,uname varchar(25))");

  System.out.println("already create a database:sqlitetest.");

  }

  @Override

  public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

  //升級資料庫時掉用

  }

  }

  package wyf.zcl.sqlitedb;

  import android.content.Context; //引入相關包

  import android.database.sqlite.SQLiteDatabase; //引入相關包

  import android.database.sqlite.SQLiteOpenHelper; //引入相關包

  import android.database.sqlite.SQLiteDatabase.CursorFactory;//引入相關包

  public class SqLiteDBHelper extends SQLiteOpenHelper{

  public SqLiteDBHelper(Context context, String name, CursorFactory factory,

  int version) {//繼承SQLiteOpenHelper的類,必須有該建構函式

  super(context, name, factory, version);

  }

  @Override

  public void onCreate(SQLiteDatabase db) {

  //建立資料庫時調用,此方法是在調用了getReadableDatabase()或getWritableDatabase()後才調用

  db.execSQL("create table sqlitetest(uid long,uname varchar(25))");

  System.out.println("already create a database:sqlitetest.");

  }

  @Override

  public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

  //升級資料庫時掉用

  }

  }

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.