Android 學習筆記之如何使用SQLite數據庫來保存數據...


PS:最近一陣子都在為考試復習...坑爹的計算機網絡,復習了3天,最后該不會的還是不會...明天還考英語...真蛋疼...

學習內容:

1.使用SQLite數據庫來保存數據...

SQLite:

  SQLite一個輕量級的數據庫,數據庫這東西就是為了保存大量數據而存在的一個工具,SQLite支持SQL語言,其實和Mysql差不多,語句基本都是一樣的,增刪改查也非常的方便...SQLite獨立性非常的好,使用SQLite不需要安裝...不依賴與任何的引擎就可以獨立的去執行...感覺這一點還是非常強悍的...安全性也比較好...

  Android集成了SQLite數據庫,因此每個Android中直接就可以使用SQLite數據庫,通過引用一些必要的包,我們就可以在Android程序中去使用...使用時需要引入這四個包...

  i.android.database.sqlite.SQLiteDataBase      //完成數據增刪改查的操作...

  ii.android.database.sqlite.SQLiteOpenHelper   //完成數據庫的創建及更新操作...

  iii.android.database.Cursor                    //對查詢的結果進行保存...

  iv.android.database.ContentValues              //對傳遞的數據進行封裝...

  引入了這四個包后,我們就可以在Android應用程序當中去使用SQLite了...我直接通過一個例子來說明一下,一個Android中如何使用SQLite,並且數據的信息保存的位置,如何對數據進行增刪改查操作...基本的SQL語句也就沒必要介紹了,學過數據庫的一定知道SQL標准化語句...

  首先我們在使用數據庫的時候,我們需要對數據庫進行創建...

package com.example.sqlite;

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

public class DataBaseHelp extends SQLiteOpenHelper{

    private static final String DataBaseName="java.db";
    private static final int DataBaseVersion=1;
    private static final String TableName="person";
    public DataBaseHelp(Context context) {
        /**
         * Create a helper object to create, open, and/or manage a database.
         * This method always returns very quickly.  The database is not actually
         * created or opened until one of {@link #getWritableDatabase} or
         * {@link #getReadableDatabase} is called.
         *
         * @param context to use to open or create the database
         * @param name of the database file, or null for an in-memory database
         * @param factory to use for creating cursor objects, or null for the default
         * @param version number of the database (starting at 1); if the database is older,
         *     {@link #onUpgrade} will be used to upgrade the database; if the database is
         *     newer, {@link #onDowngrade} will be used to downgrade the database
         */
        super(context, DataBaseName, null, DataBaseVersion);
        // TODO Auto-generated constructor stub
    }
    //執行數據庫的創建操作...
    @Override
    public void onCreate(SQLiteDatabase db) {
        // TODO Auto-generated method stub
        String sql="Create table "+TableName+"( id int primary key,name varchar(50) not null,sex varchar(20) not null,DateofBorth date not null,email varchar(50) not null)";
        //書寫完的SQL語句,需要使用execSQL(sql)執行...
        db.execSQL(sql);
    }
    //當數據庫的版本需要升級的時候調用這個方法...這個方法中可以將數據表進行刪除...
    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        // TODO Auto-generated method stub
        String sql="Drop table if exists"+TableName;
        db.execSQL(sql);
        this.onCreate(db);
    }
    
}

  在這里我們需要定義一個類去繼承SQLiteOpenHelper類,並重寫其中的方法,通過這個類來創建數據庫對象,繼承這個類是必須的,因為這個類是個輔助類,通過這個類我們才能夠完成對數據庫的操作...為什么?因為這個類中定義了對數據庫的創建,更新,規定以什么方式去打開數據庫的種種方法,只有通過繼承這個類,然后定義對象我們次才能夠調用其中的方法來完成對數據庫的操作...這就是繼承這個類的目的,java中有很多類中都為你寫好了實現的方法,我們不需要自己去書寫實現過程,只需要繼承調用就可以了,這就是java類庫的強大之處.

  有了這個類,我們就需要去調用這個類中的方法了....下面就是實現調用的過程...然后通過調用getWritableDataBase方法我們才能夠進行相應的操作,當數據庫不存在的時候,會調用onCreate()方法去創建一個數據庫,這里建立了一個java.db數據庫...這個數據庫就成功的被建立了...這個數據庫的存放位置是模擬器的sd卡中data/data/項目/databases目錄下...

package com.example.sqlite;
/* android.database.sqlite.SQLiteDatabase...完成對數據的增刪改查...
 * android.database.sqlite.SQLiteOpenHelper...完成數據庫的創建及更新操作...
 * android.database.Cursor...在使用查詢語句進行數據查詢后,保存所有的查詢結果...
 * android.database.ContentValues...在對數據庫進行操作之前...對傳遞的數據必須進行封裝...
 * Context 識別調用者的實例...
 * Android集成了SQLite數據庫...無需進行安裝就可以使用...
 * 首先創建數據庫:
 *       繼承SQLiteOpenHelper類...重寫其內部的方法....
 *       
 * */
import android.os.Bundle;
import android.app.Activity;
import android.database.sqlite.SQLiteOpenHelper;
import android.view.Menu;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.LinearLayout;
import android.widget.ListView;


public class MainActivity extends Activity implements View.OnClickListener {

    private DataBaseHelp help;
    private OperatorTable mytable;
    private LinearLayout layout;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
//        findViewById(R.id.insert).setOnClickListener(this);
//        findViewById(R.id.drop).setOnClickListener(this);
//        findViewById(R.id.update).setOnClickListener(this);
//        findViewById(R.id.select).setOnClickListener(this);
        help=new DataBaseHelp(this);
        layout=(LinearLayout) findViewById(R.id.layout);
        mytable=new OperatorTable(help.getWritableDatabase());
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }
}

  這樣完成了數據庫的建立是沒有什么意思的...我們需要進行增刪改查操作...定義了一個類來實現增刪改操作...查詢操作在下面來完成...

package com.example.sqlite;

import android.database.sqlite.SQLiteDatabase;


public class OperatorTable {

    private SQLiteDatabase db=null;
    public OperatorTable(SQLiteDatabase db){
        this.db=db;
    }
    public void insert(String sql){
        this.db.execSQL(sql);
        this.db.close();
    }
    public void drop(String sql_1){
        this.db.execSQL(sql_1);
        this.db.close();
    }
    public void update(String sql_2){
        this.db.execSQL(sql_2);
this.db.close(); } }

  定義了一個查詢類...查詢類需要使用到Cursor這個接口...通過實現這個接口來完成數據的查詢操作,然后把查詢后的結果以集合的方式進行返回...通過調用rawquery()方法,去調用另一個 public Cursor rawQueryWithFactory( CursorFactory cursorFactory, String sql, String[] selectionArgs,String editTable) {}方法,然后執行其中的SQL語句,最后使用一個字符串數組將查詢的結果按行保存...這里遍歷這個Cursor需要使用到下面的三個方法進行遍歷..然后我把這個結果保存在了一個List<String>集合中,最后進行返回...

package com.example.sqlite;


import java.util.ArrayList;
import java.util.List;

import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;

public class SearchTable {

    private String name="person";
    private SQLiteDatabase db;
    public SearchTable(SQLiteDatabase db) {
        // TODO Auto-generated constructor stub
        this.db=db;
    }
 
    public List<String>find(){
        List<String>all=new ArrayList<String>();
        String sql="select name,sex,email from person";
        Cursor cursor=this.db.rawQuery(sql, null);
        for(cursor.moveToFirst();!cursor.isAfterLast();cursor.moveToNext()){
            //使用List保存查詢到的數據信息...
            all.add(cursor.getString(0)+" "+cursor.getString(1)+" "+cursor.getString(2));
            System.out.println(cursor.getString(0).toString()+" "+cursor.getString(1).toString()+" "+cursor.getString(2).toString());
        }
        
        db.close();
        return all;
        
    }
    
}

  我把這個結果返回到了一個ListView中,然后顯示在屏幕上...這就是最終的主函數...下面有一個地方需要注意..就是使用getWritableDataBase()方法時需要注意的地方...只有在對數據庫進行操作的時候,我們才能夠使用這個方法來打開數據庫...在任何一個模塊中都需要使用這個語句,當然也可以定義一個DAO層來實現這個方法,然后調用,但是無論怎樣這個方法時隨開隨用的...無法定義一個全局屬性...這是一個需要注意的地方...

package com.example.sqlite;
/* android.database.sqlite.SQLiteDatabase...完成對數據的增刪改查...
 * android.database.sqlite.SQLiteOpenHelper...完成數據庫的創建及更新操作...
 * android.database.Cursor...在使用查詢語句進行數據查詢后,保存所有的查詢結果...
 * android.database.ContentValues...在對數據庫進行操作之前...對傳遞的數據必須進行封裝...
 * Context 識別調用者的實例...
 * Android集成了SQLite數據庫...無需進行安裝就可以使用...
 * 首先創建數據庫:
 *       繼承SQLiteOpenHelper類...重寫其內部的方法....
 *       
 * */
import android.os.Bundle;
import android.app.Activity;
import android.database.sqlite.SQLiteOpenHelper;
import android.view.Menu;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.LinearLayout;
import android.widget.ListView;


public class MainActivity extends Activity implements View.OnClickListener {

    private DataBaseHelp help;
    private OperatorTable mytable;
    private LinearLayout layout;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        findViewById(R.id.insert).setOnClickListener(this);
        findViewById(R.id.drop).setOnClickListener(this);
        findViewById(R.id.update).setOnClickListener(this);
        findViewById(R.id.select).setOnClickListener(this);
        help=new DataBaseHelp(this);
        layout=(LinearLayout) findViewById(R.id.layout);
//        mytable=new OperatorTable(help.getWritableDatabase());
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

    @Override
    public void onClick(View v) {
        // TODO Auto-generated method stub
//        MainActivity.this.mytable=new OperatorTable(MainActivity.this.help.getWritableDatabase());
        switch(v.getId()){
        case R.id.insert:
            /* getWritableDatabase通過寫的方式打開數據庫...由於每次都對數據庫進行關閉操作,因此每次都要執行這個函數來打開數據庫...
             * 這句話是無法使用在其他函數當中的,更不能定義為全局變量,原因就是,當我們真正對數據庫進行操作的時候,我們才能夠使用
             * 這個函數來打開數據庫...隨開隨用...
             * */
            MainActivity.this.mytable=new OperatorTable(MainActivity.this.help.getWritableDatabase());
            String sql_insert="insert into person values(2,'c','f','1995-01-11','976864@qq.com')";
            MainActivity.this.mytable.insert(sql_insert);
            break;
        case R.id.drop:
            MainActivity.this.mytable=new OperatorTable(MainActivity.this.help.getWritableDatabase());
            String sql_drop="delete from person where id='2'";
            MainActivity.this.mytable.drop(sql_drop);
            break;
        case R.id.update:
            MainActivity.this.mytable=new OperatorTable(MainActivity.this.help.getWritableDatabase());
            String sql_update="update person set name='android' where id='1'";
            MainActivity.this.mytable.update(sql_update);
            break;
        case R.id.select:
//            SearchTable search=new SearchTable(MainActivity.this.help.getWritableDatabase());
            ListView listview=new ListView(MainActivity.this);
            listview.setAdapter(new ArrayAdapter<String>(MainActivity.this, android.R.layout.activity_list_item,new SearchTable(MainActivity.this.help.getWritableDatabase()).find()));
            MainActivity.this.layout.addView(listview);
//            search.find();
        }
    }

}

  這樣就實現了在Android應用程序中使用SQLite,並對其進行增刪改查操作...非常的簡單..最后推薦給大家一個SQLite Expert Personal是用來可視化SQLite的一個工具,個人感覺還是很好用的...

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM