• Android中數據存儲--采用SQLite存儲數據及在SDCard中創建數據庫

    0
    Android SQLite Java C/C++ Go 28601 次瀏覽

    SQLite數據庫簡單的認識

    SQLite,是一款輕型的數據庫,是遵守ACID的關聯式數據庫管理系統,它的設計目標是嵌入式的,而且目前已經在很多嵌入式產品中使用了它,它 占用資源非常的低,在嵌入式設備中,可能只需要幾百K的內存就夠了。它能夠支持Windows/Linux/Unix等等主流的操作系統,同時能夠跟很多 程序語言相結合,比如 Tcl、C#、PHP、Java等,還有ODBC接口,同樣比起Mysql、PostgreSQL這兩款開源世界著名的數據庫管理系統來講,它的處理速度 比他們都快。SQLite第一個Alpha誕生于2000年5月. 至今已經有10個年頭,SQLite也迎來了一個版本 SQLite 3已經發布。

    SQLite特性

    下面是訪問SQLite官方網站: http://www.sqlite. org/ 時第一眼看到關于SQLite的特性.

    1. ACID事務

          2. 零配置 – 無需安裝和管理配置

          3. 儲存在單一磁盤文件中的一個完整的數據庫

          4. 數據庫文件可以在不同字節順序的機器間自由的共享

          5. 支持數據庫大小至2TB

          6. 足夠小, 大致3萬行C代碼, 250K

          7. 比一些流行的數據庫在大部分普通數據庫操作要快

          8. 簡單, 輕松的API

          9. 包含TCL綁定, 同時通過Wrapper支持其他語言的綁定

          10. 良好注釋的源代碼, 并且有著90%以上的測試覆蓋率

          11. 獨立: 沒有額外依賴

          12. Source完全的Open, 你可以用于任何用途, 包括出售它

          13. 支持多種開發語言,C, PHP, Perl, Java, ASP .NET,Python

    下面我以一個完整的Demo例子來展示對SQLite數據庫操作,包括對數據庫表的增、刪、改、查等基本操作。下面的一個截圖是該演示Demo的項目框架圖:
    Android中數據存儲--采用SQLite存儲數據及在SDCard中創建數據庫

    通過上面的截圖可以看到該項目src目錄下包含兩個類:MainActivity.java 和 MySQLiteOpenHelper.java 。其中MySQLiteOpenHelper.java是對數據庫操作輔助類。

    布局文件main.xml的代碼:

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:orientation="vertical"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent">
        <TextView android:id="@+id/tv_title"
           android:layout_width="fill_parent"  android:layout_height="wrap_content" 
           android:text="Hello, Welcome to Andy's blog!" android:textSize="16sp"/>
        
        <Button android:id="@+id/newTable" android:layout_width="fill_parent"  
            android:layout_height="wrap_content" android:text="1.新建數據表"/>  
        <Button android:id="@+id/addOne" android:layout_width="fill_parent"  
            android:layout_height="wrap_content" android:text="2.插入一條記錄"/>  
        <Button android:id="@+id/query" android:layout_width="fill_parent"   
            android:layout_height="wrap_content" android:text="3.查詢數據庫"/>  
        <Button android:id="@+id/editOne" android:layout_width="fill_parent"  
            android:layout_height="wrap_content" android:text="4.修改一條記錄"/>  
        <Button android:id="@+id/deleteOne" android:layout_width="fill_parent"  
            android:layout_height="wrap_content" android:text="5.刪除一條記錄"/>  
        <Button android:id="@+id/deleteTable" android:layout_width="fill_parent"  
            android:layout_height="wrap_content" android:text="6.刪除數據表"/>  
            
        <TextView android:id="@+id/tv_result"
           android:layout_width="fill_parent"  android:layout_height="wrap_content" 
           android:text="測試顯示的結果" android:textSize="16sp"/>
        
    </LinearLayout>
    MainActivity.java代碼:
    package com.andyidea.sqlite;
    import java.io.File;
    import java.io.IOException;
    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.view.View.OnClickListener;
    import android.widget.Button;
    import android.widget.TextView;
    import android.widget.Toast;
    public class MainActivity extends Activity {
    	private Button btn_newTable,btn_addOne,btn_query,
    	        btn_editOne,btn_deleteOne,btn_deleteTable;
    	private TextView tv;
    	private MySQLiteOpenHelper myOpenHelper;
    	private SQLiteDatabase sqlitedb;
    	
    	//----以下兩個成員變量是針對在SD卡中存儲數據庫文件使用---- 
    	//private File path = new File("/sdcard/dbfile"); //數據庫文件目錄
    	//private File f = new File("/sdcard/dbfile/AndyDemo.db"); //數據庫文件
    	
        /** Called when the activity is first created. */
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
            
            initializeViews();
            
            //實例化默認數據庫輔助操作對象
            myOpenHelper = new MySQLiteOpenHelper(this);
            
            //----如要在SD卡中創建數據庫文件,先做如下的判斷和創建相對應的目錄和文件----
            //if(!path.exists()){   //判斷目錄是否存在
            //	path.mkdirs();    //創建目錄
            //}
            //if(!f.exists()){      //判斷文件是否存在
            //	try{
            //		f.createNewFile();  //創建文件
            //	}catch(IOException e){
            //		e.printStackTrace();
            //	}
            //}
        }
        
        /**
         * 初始化UI界面
         */
        private void initializeViews(){
        	tv = (TextView)findViewById(R.id.tv_result);
        	btn_newTable = (Button)findViewById(R.id.newTable);
        	btn_addOne = (Button)findViewById(R.id.addOne);
        	btn_query = (Button)findViewById(R.id.query);
        	btn_editOne = (Button)findViewById(R.id.editOne);
        	btn_deleteOne = (Button)findViewById(R.id.deleteOne);
        	btn_deleteTable = (Button)findViewById(R.id.deleteTable);
        	
        	btn_newTable.setOnClickListener(new ClickEvent());
        	btn_addOne.setOnClickListener(new ClickEvent());
        	btn_query.setOnClickListener(new ClickEvent());
        	btn_editOne.setOnClickListener(new ClickEvent());
        	btn_deleteOne.setOnClickListener(new ClickEvent());
        	btn_deleteTable.setOnClickListener(new ClickEvent());
        }
        
        class ClickEvent implements OnClickListener{
    		@Override
    		public void onClick(View v) {
    			try{
    				//[1]--如果是在默認的路徑下創建數據庫,那么實例化sqlitedb的操作如下
    				sqlitedb = myOpenHelper.getWritableDatabase(); //實例化數據庫
    				
    				//[2]--如果是在SD卡中創建數據庫,那么實例化sqlitedb的操作如下
    				//sqlitedb = SQLiteDatabase.openOrCreateDatabase(f, null);
    				
    			    if(v == btn_newTable){   //1.新建數據表
    			    	String TABLE_NAME = "andy";
    			    	String ID = "id";
    			    	String TEXT = "text";
    			    	String str_sql2 = "CREATE TABLE " + TABLE_NAME + "(" + ID  
                            + " INTEGER PRIMARY KEY AUTOINCREMENT," + TEXT  
                            + " text );";
    			    	sqlitedb.execSQL(str_sql2);
    			    	tv.setText("新建數據表成功!");
    			    	
    			    }else if(v == btn_addOne){  //2.插入一條記錄
    			    	//----第1種插入數據的方法----
    			    	//ContentValues是一個哈希表HashMap,key值是對應數據表中字段名稱,
    			    	//value值是字段的值。可以通過ContentValues的put方法把數據存放到
    			    	//ContentValues對象中,然后把數據插入到相對應的數據表中。
    			    	ContentValues cv = new ContentValues();
    			    	cv.put(MySQLiteOpenHelper.TEXT, "新數據");
    			    	sqlitedb.insert(MySQLiteOpenHelper.TABLE_NAME, null, cv);
    			    	//db.insert(String table, String nullColumnHack, ContentValues values);方法解說
    			    	//public long insert (String table, String nullColumnHack, ContentValues values)
    			    	//該方法是向數據表中插入一條記錄
    			    	//[1]參數table:需要插入操作的表名
    			    	//[2]參數nullColumnHack:默認null即可,若在插入一行數據時,若沒有指定某列的值,
    			    	//   則默認使用null值傳入。
    			    	//[3]參數values:插入的數據
    			    	
    			    	//----第2種插入數據的方法----
    			    	// String INSERT_DATA =  
    	                // "INSERT INTO andy (id,text) values (1, '第2種插入數據的方法')";  
    	                // sqlitedb.execSQL(INSERT_DATA);
    			    	
    			    	tv.setText("添加新數據成功!");
    			    	
    			    }else if(v == btn_query){   //3.查詢數據庫
    			    	Cursor cur = sqlitedb.rawQuery("SELECT * FROM "+MySQLiteOpenHelper.TABLE_NAME, null);
    			    	if(cur != null){
    			    		String temp = "";
    			    		int i = 0;
    			    		while(cur.moveToNext()){
    			    			temp += cur.getString(0);  //0代表數據列的第一列,即id
    			    			temp += cur.getString(1);  //1代表數據列的第二列,即text
    			    			i++;
    			    			temp += "/n";    //定義顯示數據的格式,一行一個數據
    			    		}
    			    		tv.setText(temp);
    			    		
    			    	}
    			    }else if(v == btn_editOne){  //4.修改一條記錄
    			    	//----第1種方式修改數據----
    			    	ContentValues cv = new ContentValues();
    			    	cv.put(MySQLiteOpenHelper.TEXT, "更新后的數據");
    			    	sqlitedb.update("andy", cv, "id " + "=" + Integer.toString(1), null);
    			    	//[1]參數table:需要操作的表名
    			    	//[2]參數values:ContentValues
    			    	//[3]參數whereClause:更新的條件
    			    	//[4]參數whereArgs:更新條件對應的值
    			    	
    			    	//----第2種方式修改數據----
    			    	// String UPDATA_DATA =  
    	                // "UPDATE andy SET text='通過SQL語句來修改數據'  WHERE id=1";  
    	                // sqlitedb.execSQL(UPDATA_DATA);  
    			    	tv.setText("修改數據成功!");
    			    	
    			    }else if(v == btn_deleteOne){  //5.刪除一條記錄
    			    	//----第1種方式刪除數據----
    			    	sqlitedb.delete("andy", MySQLiteOpenHelper.ID + "= 1", null);
    			    	//public int delete(String table, String whereClause, String[] whereArgs)解說
    			    	//[1]參數table:需要操作的表名
    			    	//[2]參數whereClause:刪除的條件
    			    	//[3]參數whereArgs:刪除條件對應的值
    			    	
    			    	//----第2種方式刪除數據----
    			    	//String DELETE_DATA = "DELETE FROM andy WHERE id=1"; 
    			    	//sqlitedb.execSQL(DELETE_DATA);
    			    	tv.setText("刪除數據成功!");
    			    	
    			    }else if(v == btn_deleteTable){  //6.刪除數據表
    			    	sqlitedb.execSQL("DROP TABLE andy");
    			    	tv.setText("刪除數據表成功!");
    			    	
    			    }
    			}catch(Exception e){
    				tv.setText("操作失敗");
    			}finally{
    				sqlitedb.close();
    			}
    		}
        	
        }
    }
    MySQLiteOpenHelper輔助器類代碼:
    package com.andyidea.sqlite;
    import android.content.Context;
    import android.database.sqlite.SQLiteDatabase;
    import android.database.sqlite.SQLiteOpenHelper;
    import android.util.Log;
    /**
     * 此類繼承了SQLiteOpenHelper抽象類,是一個輔助器類,需要 
     * 一個構造函數和重寫兩個方法。
     * @author Andy
     */
    public class MySQLiteOpenHelper extends SQLiteOpenHelper {
    	public static final String DATABASE_NAME = "AndyDemo.db"; //數據庫名
    	public static final int VERSION = 1;   //版本號
    	public static final String TABLE_NAME = "andy";  //表名
    	public static final String ID = "id";
    	public static final String TEXT = "text";
    	
    	public MySQLiteOpenHelper(Context context) {
    		super(context, DATABASE_NAME, null, VERSION);
    	}
    	/**
    	 * 在數據庫第一次生成的時候會調用這個方法,同時我們在這個方法里邊生成數據庫表
    	 */
    	@Override
    	public void onCreate(SQLiteDatabase db) {
    		//創建數據表的操作
    		String strSQL = "CREATE TABLE " + TABLE_NAME + "(" + ID  
            + " INTEGER PRIMARY KEY AUTOINCREMENT," + TEXT + " text );";  
    		
    		db.execSQL(strSQL);
    	}
    	/**
    	 * 更新或者升級數據庫的時候會自動調用這個方法,一般我們會在這個方法中
    	 * 刪除數據表,然后再創建新的數據表操作。
    	 */
    	@Override
    	public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    		Log.e("AndyDemo", "onUpgrade");  
    	}
    }
    當我們需要把數據庫創建在SDCard中時,需要在AndroidManifest.xml文件中添加對SDCard操作的權限,如下:
    <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />  
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />  

    通過以上步驟的操作,對SQLite數據庫的操作有了大概的認識。下面我們來看看程序運行的效果。

    Android中數據存儲--采用SQLite存儲數據及在SDCard中創建數據庫

    由于該Demo的代碼比較多,需要該源碼的可以發郵件給我索取。郵箱:Chenjunjun.ZJ@gmail.com

    歡迎大家關注 ^-^

    文章出處:http://blog.csdn.net/cjjky/article/details/6578393

    相似問題

    相關經驗

    相關資訊

    相關文檔

  • sesese色