android sqlite SQLiteDatabase 操作大全 不看后悔!必收藏!看后精通SQLITE (第二部分)...
生活随笔
收集整理的這篇文章主要介紹了
android sqlite SQLiteDatabase 操作大全 不看后悔!必收藏!看后精通SQLITE (第二部分)...
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
使用SQLiteOpenHelper對數據庫進行版本管理
當調用SQLiteOpenHelper的getWritableDatabase()或者getReadableDatabase()方法獲取用于操作數據庫的SQLiteDatabase實例的時候,如果數據庫不存在,Android系統會自動生成一個數據庫,接著調用onCreate()方法,onCreate()方法在初次生成數據庫時才會被調用,在onCreate()方法里可以生成數據庫表結構及添加一些應用使用到的初始化數據。onUpgrade()方法在數據庫的版本發生變化時會被調用,數據庫的版本是由程序員控制的,假設數據庫現在的版本是1,由于業務的需要,修改了數據庫表的結構,這時候就需要升級軟件,升級軟件時希望更新用戶手機里的數據庫表結構,為了實現這一目的,可以把原來的數據庫版本設置為2(有同學問設置為3行不行?當然可以,如果你愿意,設置為100也行),并且在onUpgrade()方法里面實現表結構的更新。當軟件的版本升級次數比較多,這時在onUpgrade()方法里面可以根據原版號和目標版本號進行判斷,然后作出相應的表結構及數據更新。
getWritableDatabase()和getReadableDatabase()方法都可以獲取一個用于操作數據庫的SQLiteDatabase實例。但getWritableDatabase() 方法以讀寫方式打開數據庫,一旦數據庫的磁盤空間滿了,數據庫就只能讀而不能寫,倘若使用的是getWritableDatabase() 方法就會出錯。getReadableDatabase()方法先以讀寫方式打開數據庫,如果數據庫的磁盤空間滿了,就會打開失敗,當打開失敗后會繼續嘗試以只讀方式打開數據庫。但若隨后再次調用此方法時,問題已經被解決,只讀的SQLiteDatabase對象會被關閉,而重新返回一個可讀寫的SQLiteDatabase數據庫對象。 public class DatabaseHelper extends SQLiteOpenHelper { ?? ?//類沒有實例化,是不能用作父類構造器的參數,必須聲明為靜態 ?? ? ? ? private static final String name = "itcast"; //數據庫名稱 ?? ? ? ? private static final int version = 1; //數據庫版本 ?? ? ? ? public DatabaseHelper(Context context) { //第三個參數CursorFactory指定在執行查詢時獲得一個游標實例的工廠類,設置為null,代表使用系統默認的工廠類 ?? ? ? ? ? ? ? ?super(context, name, null, version); ?? ? ? ? } ?? ? ? ?@Override public void onCreate(SQLiteDatabase db) { ?? ? ? ? ? ? ?db.execSQL("CREATE TABLE IF NOT EXISTS person (personid integer primary key autoincrement, name varchar(20), age INTEGER)"); ?? ?? ? ? ? } ?? ? ? ?@Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { ?? ? ? ? ? ? ? db.execSQL("DROP TABLE IF EXISTS person"); ?? ? ? ? ? ? ? onCreate(db); ?? ? ? ? } } 上面onUpgrade()方法在數據庫版本每次發生變化時都會把用戶手機上的數據庫表刪除,然后再重新創建。一般在實際項目中是不能這樣做的,正確的做法是在更新數據庫表結構時,還要考慮用戶存放于數據庫中的數據不會丟失。
package com.jbridge.service;import android.content.Context; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteDatabase.CursorFactory; import android.database.sqlite.SQLiteOpenHelper;public class DataBaseOpenHelper extends SQLiteOpenHelper {// 類沒有實例化,是不能用作父類構造器的參數,必須聲明為靜態private static String dbname = "zyj";private static int version = 1;public DataBaseOpenHelper(Context context) {// 第一個參數是應用的上下文// 第二個參數是應用的數據庫名字// 第三個參數CursorFactory指定在執行查詢時獲得一個游標實例的工廠類,設置為null,代表使用系統默認的工廠類// 第四個參數是數據庫版本,必須是大于0的int(即非負數)super(context, dbname, null, version);// TODO Auto-generated constructor stub}public DataBaseOpenHelper(Context context, String name,CursorFactory factory, int version) {super(context, name, factory, version);// TODO Auto-generated constructor stub}@Overridepublic void onCreate(SQLiteDatabase db) {db.execSQL("CREATE TABLE IF NOT EXISTS person (personid integer primary key autoincrement, name varchar(20), age INTEGER)");}// onUpgrade()方法在數據庫版本每次發生變化時都會把用戶手機上的數據庫表刪除,然后再重新創建。// 一般在實際項目中是不能這樣做的,正確的做法是在更新數據庫表結構時,還要考慮用戶存放于數據庫中的數據不會丟失,從版本幾更新到版本幾。@Overridepublic void onUpgrade(SQLiteDatabase db, int arg1, int arg2) {db.execSQL("DROP TABLE IF EXISTS person");onCreate(db);}}
使用SQLiteOpenHelper獲取用于操作數據庫的SQLiteDatabase實例
public class DatabaseHelper extends SQLiteOpenHelper { ?? ? ? ? private static final String name = "itcast"; //數據庫名稱 ?? ? ? ? private static final int version = 1; //數據庫版本 ?? ? ? ? ......略 }
public class HelloActivity extends Activity { ?? ?@Override public void onCreate(Bundle savedInstanceState) { ?? ? ? ?...... ?? ? ? ?Button button =(Button) this.findViewById(R.id.button); ?? ? ? ?button.setOnClickListener(new View.OnClickListener(){
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(); ? }}); ? ? ? ? ?? ?} } 第一次調用getWritableDatabase()或getReadableDatabase()方法后,SQLiteOpenHelper會緩存當前的SQLiteDatabase實例,SQLiteDatabase實例正常情況下會維持數據庫的打開狀態,所以在你不再需要SQLiteDatabase實例時,請及時調用close()方法釋放資源。一旦SQLiteDatabase實例被緩存,多次調用getWritableDatabase()或getReadableDatabase()方法得到的都是同一實例。
?SQLiteDatabase db = ....; db.beginTransaction();//開始事務 try { ?? ?db.execSQL("insert into person(name, age) values(?,?)", new Object[]{"工", 4}); ?? ?db.execSQL("update person set name=? where personid=?", new Object[]{"工工", 1}); ?? ?db.setTransactionSuccessful();//調用此方法會在執行到endTransaction() 時提交當前事務,如果不調用此方法會回滾事務 } finally { ?? ?db.endTransaction();//由事務的標志決定是提交事務,還是回滾事務 }? db.close();
上面兩條SQL語句在同一個事務中執行。
當調用SQLiteOpenHelper的getWritableDatabase()或者getReadableDatabase()方法獲取用于操作數據庫的SQLiteDatabase實例的時候,如果數據庫不存在,Android系統會自動生成一個數據庫,接著調用onCreate()方法,onCreate()方法在初次生成數據庫時才會被調用,在onCreate()方法里可以生成數據庫表結構及添加一些應用使用到的初始化數據。onUpgrade()方法在數據庫的版本發生變化時會被調用,數據庫的版本是由程序員控制的,假設數據庫現在的版本是1,由于業務的需要,修改了數據庫表的結構,這時候就需要升級軟件,升級軟件時希望更新用戶手機里的數據庫表結構,為了實現這一目的,可以把原來的數據庫版本設置為2(有同學問設置為3行不行?當然可以,如果你愿意,設置為100也行),并且在onUpgrade()方法里面實現表結構的更新。當軟件的版本升級次數比較多,這時在onUpgrade()方法里面可以根據原版號和目標版本號進行判斷,然后作出相應的表結構及數據更新。
getWritableDatabase()和getReadableDatabase()方法都可以獲取一個用于操作數據庫的SQLiteDatabase實例。但getWritableDatabase() 方法以讀寫方式打開數據庫,一旦數據庫的磁盤空間滿了,數據庫就只能讀而不能寫,倘若使用的是getWritableDatabase() 方法就會出錯。getReadableDatabase()方法先以讀寫方式打開數據庫,如果數據庫的磁盤空間滿了,就會打開失敗,當打開失敗后會繼續嘗試以只讀方式打開數據庫。但若隨后再次調用此方法時,問題已經被解決,只讀的SQLiteDatabase對象會被關閉,而重新返回一個可讀寫的SQLiteDatabase數據庫對象。 public class DatabaseHelper extends SQLiteOpenHelper { ?? ?//類沒有實例化,是不能用作父類構造器的參數,必須聲明為靜態 ?? ? ? ? private static final String name = "itcast"; //數據庫名稱 ?? ? ? ? private static final int version = 1; //數據庫版本 ?? ? ? ? public DatabaseHelper(Context context) { //第三個參數CursorFactory指定在執行查詢時獲得一個游標實例的工廠類,設置為null,代表使用系統默認的工廠類 ?? ? ? ? ? ? ? ?super(context, name, null, version); ?? ? ? ? } ?? ? ? ?@Override public void onCreate(SQLiteDatabase db) { ?? ? ? ? ? ? ?db.execSQL("CREATE TABLE IF NOT EXISTS person (personid integer primary key autoincrement, name varchar(20), age INTEGER)"); ?? ?? ? ? ? } ?? ? ? ?@Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { ?? ? ? ? ? ? ? db.execSQL("DROP TABLE IF EXISTS person"); ?? ? ? ? ? ? ? onCreate(db); ?? ? ? ? } } 上面onUpgrade()方法在數據庫版本每次發生變化時都會把用戶手機上的數據庫表刪除,然后再重新創建。一般在實際項目中是不能這樣做的,正確的做法是在更新數據庫表結構時,還要考慮用戶存放于數據庫中的數據不會丟失。
package com.jbridge.service;import android.content.Context; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteDatabase.CursorFactory; import android.database.sqlite.SQLiteOpenHelper;public class DataBaseOpenHelper extends SQLiteOpenHelper {// 類沒有實例化,是不能用作父類構造器的參數,必須聲明為靜態private static String dbname = "zyj";private static int version = 1;public DataBaseOpenHelper(Context context) {// 第一個參數是應用的上下文// 第二個參數是應用的數據庫名字// 第三個參數CursorFactory指定在執行查詢時獲得一個游標實例的工廠類,設置為null,代表使用系統默認的工廠類// 第四個參數是數據庫版本,必須是大于0的int(即非負數)super(context, dbname, null, version);// TODO Auto-generated constructor stub}public DataBaseOpenHelper(Context context, String name,CursorFactory factory, int version) {super(context, name, factory, version);// TODO Auto-generated constructor stub}@Overridepublic void onCreate(SQLiteDatabase db) {db.execSQL("CREATE TABLE IF NOT EXISTS person (personid integer primary key autoincrement, name varchar(20), age INTEGER)");}// onUpgrade()方法在數據庫版本每次發生變化時都會把用戶手機上的數據庫表刪除,然后再重新創建。// 一般在實際項目中是不能這樣做的,正確的做法是在更新數據庫表結構時,還要考慮用戶存放于數據庫中的數據不會丟失,從版本幾更新到版本幾。@Overridepublic void onUpgrade(SQLiteDatabase db, int arg1, int arg2) {db.execSQL("DROP TABLE IF EXISTS person");onCreate(db);}}
使用SQLiteOpenHelper獲取用于操作數據庫的SQLiteDatabase實例
public class DatabaseHelper extends SQLiteOpenHelper { ?? ? ? ? private static final String name = "itcast"; //數據庫名稱 ?? ? ? ? private static final int version = 1; //數據庫版本 ?? ? ? ? ......略 }
public class HelloActivity extends Activity { ?? ?@Override public void onCreate(Bundle savedInstanceState) { ?? ? ? ?...... ?? ? ? ?Button button =(Button) this.findViewById(R.id.button); ?? ? ? ?button.setOnClickListener(new View.OnClickListener(){
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(); ? }}); ? ? ? ? ?? ?} } 第一次調用getWritableDatabase()或getReadableDatabase()方法后,SQLiteOpenHelper會緩存當前的SQLiteDatabase實例,SQLiteDatabase實例正常情況下會維持數據庫的打開狀態,所以在你不再需要SQLiteDatabase實例時,請及時調用close()方法釋放資源。一旦SQLiteDatabase實例被緩存,多次調用getWritableDatabase()或getReadableDatabase()方法得到的都是同一實例。
使用事務操作SQLite數據庫
使用SQLiteDatabase的beginTransaction()方法可以開啟一個事務,程序執行到endTransaction() 方法時會檢查事務的標志是否為成功,如果為成功則提交事務,否則回滾事務。當應用需要提交事務,必須在程序執行到endTransaction()方法之前使用setTransactionSuccessful() 方法設置事務的標志為成功,如果不調用setTransactionSuccessful() 方法,默認會回滾事務。使用例子如下:?SQLiteDatabase db = ....; db.beginTransaction();//開始事務 try { ?? ?db.execSQL("insert into person(name, age) values(?,?)", new Object[]{"工", 4}); ?? ?db.execSQL("update person set name=? where personid=?", new Object[]{"工工", 1}); ?? ?db.setTransactionSuccessful();//調用此方法會在執行到endTransaction() 時提交當前事務,如果不調用此方法會回滾事務 } finally { ?? ?db.endTransaction();//由事務的標志決定是提交事務,還是回滾事務 }? db.close();
上面兩條SQL語句在同一個事務中執行。
轉載于:https://www.cnblogs.com/xiaowangba/archive/2012/07/24/6314554.html
總結
以上是生活随笔為你收集整理的android sqlite SQLiteDatabase 操作大全 不看后悔!必收藏!看后精通SQLITE (第二部分)...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: android 如何适配屏幕
- 下一篇: HDU-1299 Diophantus