安卓 SQLite數據庫操做實例

前段時間寫了個安卓平臺下SQLite數據庫操做的實例 ,一直沒得時間總結 ,今天把它弄出來了。javascript

在Android 運行時環境包含了完整的 SQLite。java

首先介紹一下SQLite這個數據庫:android

 

SQLite,是一款輕型的數據庫,是遵照ACID的關聯式數據庫管理系統,它的設計目標是嵌入式的,並且目前已經在不少嵌入式產品中使用了它,它佔用資源很是的低,在嵌入式設備中,可能只須要幾百K的內存就夠了。它可以支持Windows/Linux/Unix等等主流的操做系統,同時可以跟不少程序語言相結合,好比 Tcl、C#、PHP、Java等,還有ODBC接口,一樣比起Mysql、PostgreSQL這兩款開源世界著名的數據庫管理系統來說,它的處理速度比他們都快。sql

 

有一點相對其餘數據庫來講比較特殊的是:SQLite是無類型的. 這意味着你能夠保存任何類型的數據到你所想要保存的任何表的任何列中,意思就是說話你能夠在建立數據庫表的時候任意定義數據類型,卻不影響實際使用時的數據存儲。數據庫

 

舉個例子說就是你能夠在建立表時定義username字段爲varchar類型,可是實時使用時你能夠向這個字段存入一、2.五、2012-6-6.。。這樣的整型,單精,以及時間等其餘類型,在SQLite裏沒有這種限制。app

 

可是有一種狀況例外:當字段類型爲  」Integer Primary Key」 時,就是定義表主鍵,這個就只能是integer類型。和普通數據庫相同 。ide

 

SQLite 不支持一些標準的 SQL 功能,特別是外鍵約束(FOREIGN KEY constrains),嵌套 transcaction 和 RIGHT OUTER JOIN 和 FULL OUTER JOIN, 還有一些 ALTER TABLE 功能。工具

 

 

須要注意一點: SQLite不支持存儲過程!測試

 

我這裏就簡單介紹,如須要可自行去了解關於SQLite的更多知識,this

 

而後是個人Demo(一個簡單的完成數據庫增刪查改操做):

 

首先是項目目錄結構:


 

 

 

在本項目中咱們使用JUnit測試,就要在AndroidManifest.xml配置JUnit

 

    AndroidManifest.xml 

 

Java代碼    收藏代碼
  1. <manifest xmlns:android="http://schemas.android.com/apk/res/android"  
  2.     package="org.yzsoft.sqlitedemo.test"  
  3.     android:versionCode="1"  
  4.     android:versionName="1.0" >  
  5.   
  6.     <!-- 爲了方便測試,我直接把上面包位置改爲我項目的測試包下 -->  
  7.     <uses-sdk  
  8.         android:minSdkVersion="8"  
  9.         android:targetSdkVersion="15" />  
  10.   
  11.     <application  
  12.         android:icon="@drawable/ic_launcher"  
  13.         android:label="@string/app_name"  
  14.         android:theme="@style/AppTheme" >  
  15.   
  16.         <!--  
  17.   由於咱們開發項目的時候,包會比較多,因此最好在下面這個activity的配置(  android:name="org.yzsoft.sqlitedemo.activity.MainActivity" )這句這裏打上完整的    包名.類名   
  18.   ,雖然能夠直接用  .類名,可是這個.類名是創建在  
  19.   <manifest xmlns:android="http://schemas.android.com/apk/res/android"     package="org.yzsoft.sqlitedemo.test"   
  20.   之上的,用package+.類名也恰好能夠組合成完整路徑。可是咱們保險一點寫完整去。   
  21.         -->  
  22.         <activity  
  23.             android:name="org.yzsoft.sqlitedemo.activity.MainActivity"  
  24.             android:label="@string/title_activity_main" >  
  25.             <intent-filter>  
  26.                 <action android:name="android.intent.action.MAIN" />  
  27.   
  28.                 <category android:name="android.intent.category.LAUNCHER" />  
  29.             </intent-filter>  
  30.         </activity>  
  31.         <!-- JUnit要加這句 -->  
  32.         <uses-library android:name="android.test.runner" />  
  33.     </application>  
  34.     <!-- JUnit還要加這段 (android:targetPackage測試類所在包名 ) -->  
  35.     <instrumentation  
  36.         android:name="android.test.InstrumentationTestRunner"  
  37.         android:label="Test Unit Tests"  
  38.         android:targetPackage="org.yzsoft.sqlitedemo.test" >  
  39.     </instrumentation>  
  40.   
  41. </manifest>  

 

 

 

 

一、MainActivity.java(由於本項目中使用JUnit進行測試,就不須要Activity了,留着不用寫它)

 

 

Java代碼    收藏代碼
  1. package org.yzsoft.sqlitedemo.activity;  
  2.   
  3. import org.yzsoft.sqlitedemo.util.R;  
  4. import org.yzsoft.sqlitedemo.util.R.layout;  
  5. import org.yzsoft.sqlitedemo.util.R.menu;  
  6.   
  7. import android.os.Bundle;  
  8. import android.app.Activity;  
  9. import android.view.Menu;  
  10.   
  11. public class MainActivity extends Activity {  
  12.   
  13.     @Override  
  14.     public void onCreate(Bundle savedInstanceState) {  
  15.         super.onCreate(savedInstanceState);  
  16.         setContentView(R.layout.activity_main);  
  17.     }  
  18.   
  19.     @Override  
  20.     public boolean onCreateOptionsMenu(Menu menu) {  
  21.         getMenuInflater().inflate(R.menu.activity_main, menu);  
  22.         return true;  
  23.     }  
  24. }  

 

 

 

 

二、DBOpenHandler.java

 

 

Java代碼    收藏代碼
  1. package org.yzsoft.sqlitedemo.util;  
  2.   
  3. import android.content.Context;  
  4. import android.database.sqlite.SQLiteDatabase;  
  5. import android.database.sqlite.SQLiteDatabase.CursorFactory;  
  6. import android.database.sqlite.SQLiteOpenHelper;  
  7.   
  8. public class DBOpenHandler extends SQLiteOpenHelper {  
  9.   
  10.     /** 
  11.      *  
  12.      * @param context 
  13.      *            上下文 
  14.      * @param name 
  15.      *            數據庫名 
  16.      * @param factory 
  17.      *            可選的數據庫遊標工廠類,當查詢(query)被提交時,該對象會被調用來實例化一個遊標。默認爲null。 
  18.      * @param version 
  19.      *            數據庫版本號 
  20.      */  
  21.     public DBOpenHandler(Context context, String name, CursorFactory factory, int version) {  
  22.         super(context, name, factory, version);  
  23.     }  
  24.   
  25.     @Override  
  26.     public void onCreate(SQLiteDatabase db) {// 覆寫onCreate方法,當數據庫建立時就用SQL命令建立一個表  
  27.         // 建立一個t_users表,id主鍵,自動增加,字符類型的username和pass;  
  28.         db.execSQL("create table t_users(id integer primary key autoincrement,username varchar(200),pass varchar(200) )");  
  29.   
  30.     }  
  31.   
  32.     @Override  
  33.     public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {  
  34.         // TODO Auto-generated method stub  
  35.   
  36.     }  
  37.   
  38. }  

 

 

三、TUsers.java(實體類,習慣了WEB開發,總會加個實體類,方便)

 

 

Java代碼    收藏代碼
  1. package org.yzsoft.sqlitedemo.vo;  
  2.   
  3. public class TUsers {  
  4. private int id ;  
  5. private String username;  
  6. private String pass;  
  7. public int getId() {  
  8.     return id;  
  9. }  
  10. public void setId(int id) {  
  11.     this.id = id;  
  12. }  
  13. public String getUsername() {  
  14.     return username;  
  15. }  
  16. public void setUsername(String username) {  
  17.     this.username = username;  
  18. }  
  19. public String getPass() {  
  20.     return pass;  
  21. }  
  22. public void setPass(String pass) {  
  23.     this.pass = pass;  
  24. }  
  25. }  

 

 

四、SQLiteDAOImpl.java(數據庫操做實現類)

 

 

Java代碼    收藏代碼
  1. package org.yzsoft.sqlitedemo.util;  
  2.   
  3. import java.util.ArrayList;  
  4. import java.util.List;  
  5. import org.yzsoft.sqlitedemo.vo.TUsers;  
  6.   
  7. import android.content.Context;  
  8. import android.database.Cursor;  
  9. import android.database.sqlite.SQLiteDatabase;  
  10.   
  11. public class SQLiteDAOImpl {  
  12.     private DBOpenHandler dbOpenHandler;  
  13.   
  14.     public SQLiteDAOImpl(Context context) {  
  15.         this.dbOpenHandler = new DBOpenHandler(context, "dbtest.db", null, 1);  
  16.     }  
  17.   
  18.     public void save(TUsers tusers) {// 插入記錄  
  19.         SQLiteDatabase db = dbOpenHandler.getWritableDatabase();// 取得數據庫操做  
  20.         db.execSQL("insert into t_users (username,pass) values(?,?)", new Object[] { tusers.getUsername(), tusers.getPass() });  
  21.         db.close();// 記得關閉數據庫操做  
  22.     }  
  23.   
  24.     public void delete(Integer id) {// 刪除紀錄  
  25.         SQLiteDatabase db = dbOpenHandler.getWritableDatabase();  
  26.         db.execSQL("delete from t_users where id=?", new Object[] { id.toString() });  
  27.         db.close();  
  28.     }  
  29.   
  30.     public void update(TUsers tusers) {// 修改紀錄  
  31.         SQLiteDatabase db = dbOpenHandler.getWritableDatabase();  
  32.         db.execSQL("update t_users set username=?,pass=? where" + " id=?", new Object[] { tusers.getUsername(), tusers.getPass(), tusers.getId() });  
  33.         db.close();  
  34.     }  
  35.   
  36.     public TUsers find(Integer id) {// 根據ID查找紀錄  
  37.         TUsers tusers = null;  
  38.         SQLiteDatabase db = dbOpenHandler.getReadableDatabase();  
  39.         // 用遊標Cursor接收從數據庫檢索到的數據  
  40.         Cursor cursor = db.rawQuery("select * from t_users where id=?", new String[] { id.toString() });  
  41.         if (cursor.moveToFirst()) {// 依次取出數據  
  42.             tusers = new TUsers();  
  43.             tusers.setId(cursor.getInt(cursor.getColumnIndex("id")));  
  44.             tusers.setUsername(cursor.getString(cursor.getColumnIndex("username")));  
  45.             tusers.setPass(cursor.getString(cursor.getColumnIndex("pass")));  
  46.   
  47.         }  
  48.         db.close();  
  49.         return tusers;  
  50.     }  
  51.   
  52.     public List<TUsers> findAll() {// 查詢全部記錄  
  53.         List<TUsers> lists = new ArrayList<TUsers>();  
  54.         TUsers tusers = null;  
  55.         SQLiteDatabase db = dbOpenHandler.getReadableDatabase();  
  56.         // Cursor cursor=db.rawQuery("select * from t_users limit ?,?", new  
  57.         // String[]{offset.toString(),maxLength.toString()});  
  58.         // //這裏支持類型MYSQL的limit分頁操做  
  59.   
  60.         Cursor cursor = db.rawQuery("select * from t_users ", null);  
  61.         while (cursor.moveToNext()) {  
  62.             tusers = new TUsers();  
  63.             tusers.setId(cursor.getInt(cursor.getColumnIndex("id")));  
  64.             tusers.setUsername(cursor.getString(cursor.getColumnIndex("username")));  
  65.             tusers.setPass(cursor.getString(cursor.getColumnIndex("pass")));  
  66.             lists.add(tusers);  
  67.         }  
  68.         db.close();  
  69.         return lists;  
  70.     }  
  71.   
  72.     public long getCount() {//統計全部記錄數  
  73.         SQLiteDatabase db = dbOpenHandler.getReadableDatabase();  
  74.         Cursor cursor = db.rawQuery("select count(*) from t_users ", null);  
  75.         cursor.moveToFirst();  
  76.         db.close();  
  77.         return cursor.getLong(0);  
  78.     }  
  79.   
  80. }  

 

 

 

五、TUsersTest.java(JUnit測試類)

 

 

Java代碼    收藏代碼
  1. package org.yzsoft.sqlitedemo.test;  
  2.   
  3. import java.util.List;  
  4.   
  5. import org.yzsoft.sqlitedemo.util.DBOpenHandler;  
  6. import org.yzsoft.sqlitedemo.util.SQLiteDAOImpl;  
  7. import org.yzsoft.sqlitedemo.vo.TUsers;  
  8.   
  9. import android.test.AndroidTestCase;  
  10. import android.util.Log;  
  11.   
  12. public class TUsersTest extends AndroidTestCase {  
  13.     private static final String TAG = "這個是測試類";// 準備好TAG標識用於LOG輸出,方便咱們用LogCat進行調試  
  14.   
  15.     public void testCreate() {  
  16.         DBOpenHandler dbHandler = new DBOpenHandler(this.getContext(), "dbtest.db", null, 1);// 建立數據庫文件  
  17.         dbHandler.getWritableDatabase();  
  18.     }  
  19.   
  20.     public void testSave() throws Throwable {  
  21.         SQLiteDAOImpl p = new SQLiteDAOImpl(this.getContext());  
  22.         TUsers tuser = new TUsers();  
  23.         tuser.setUsername("用戶");  
  24.         tuser.setPass("密碼");  
  25.         p.save(tuser);  
  26.         Log.i(TAG, "插入成功");// 用日誌記錄一個咱們自定義的輸出。能夠在LogCat窗口中查看,方便調試  
  27.     }  
  28.   
  29.     public void testUpate() throws Throwable {  
  30.         SQLiteDAOImpl p = new SQLiteDAOImpl(this.getContext());  
  31.         TUsers tuser = p.find(1);  
  32.         tuser.setUsername("張三");  
  33.         p.update(tuser);  
  34.         Log.i(TAG, "修改爲功");  
  35.     }  
  36.   
  37.     public void testDelete() throws Throwable {  
  38.         SQLiteDAOImpl p = new SQLiteDAOImpl(this.getContext());  
  39.         p.delete(2);  
  40.         Log.i(TAG, "刪除成功");  
  41.     }  
  42.   
  43.     public void testFind() throws Throwable {  
  44.         SQLiteDAOImpl p = new SQLiteDAOImpl(this.getContext());  
  45.         TUsers tuser = p.find(1);  
  46.         Log.i(TAG, tuser.getUsername() + "   用戶名");  
  47.     }  
  48.   
  49.     public void testGetCount() throws Throwable {  
  50.         SQLiteDAOImpl p = new SQLiteDAOImpl(this.getContext());  
  51.         Log.i(TAG, p.getCount() + "   總記錄數");  
  52.     }  
  53.   
  54.     public void testFindAll() throws Throwable {  
  55.         SQLiteDAOImpl p = new SQLiteDAOImpl(this.getContext());  
  56.         List<TUsers> tusers = p.findAll();  
  57.         for (TUsers tuser : tusers) {  
  58.             Log.i(TAG, tuser.getUsername() + "   用戶名");  
  59.         }  
  60.     }  
  61. }  

 

而後是測試中的一些截圖:

 




 

 

 

 

 

 

最後咱們把File Exploer中data/data/項目包名/databases/dbtest.db 導出來,用Navicat Premium等數據庫管理工具查看裏面的數據:


 

導出來看看:


 

雖然安卓平臺中SQLite是個小型的本地數據庫,可是有些地方使用起來會比文件存儲更方便,本文只是對它做一個簡單的操做實例 ,有這方面興趣的童鞋能夠本身去深刻研究。也但願你們能多交流交流~~~~

 

 

最最後~附上項目源碼:

 

 

 

 

相關文章
相關標籤/搜索