12.Android-SQLiteOpenHelper使用

1.SQLite介紹java

SQLite,是一款輕型的數據庫,它的優缺點有以下:android

  • 輕量級,適合嵌入式設備,而且自己不依賴第三方的軟件,使用它也不須要「安裝」
  • 併發(包括多進程和多線程)讀寫方面的性能不太理想。可能會被寫操做獨佔,從而致使其它讀寫操做阻塞或出錯

 

2.SQLiteOpenHelper介紹git

爲了在本地建立SQLite數據庫,咱們須要建立一個SQLiteOpenHelper的子類,這裏取名的爲MyOpenHelper類,而後還要寫構造方法來初始化父類、以及abstract修飾的抽象方法:onCreate(SQLiteDatabase)、onUpgrade(SQLiteDatabase,int,int).sql

 

2.1 爲何要建立SQLiteOpenHelper的子類(MyOpenHelper類)?數據庫

由於SQLiteOpenHelper不知道咱們要建立的數據庫是什麼名字,以及表的內容,因此咱們要建立MyOpenHelper類.多線程

 

3.SQLiteOpenHelper構造方法併發

構造方法用來建立數據庫文件的,構造方法以下:app

public SQLiteOpenHelper(Context context, String name, CursorFactory factory, int version);
//第一個參數:上下文
//第二個參數:數據庫文件的名字,若是傳入null 則表示建立臨時數據庫,在應用退出以後,數據就會丟失
//第三個參數:遊標工廠 若是使用系統默認的遊標工廠就傳入null,通常都填null
//第四個參數:數據庫的版本號 用版本號來控制數據庫的升級和降級  版本號從1開始

好比建立一個demo.db,咱們只須要在MyOpenHelper類構造方法裏填入下面代碼便可:ide

super(context, "demo.db", null, 1);

 

4.public abstract void onCreate (SQLiteDatabase db)函數

  • 參數db : 數據庫對象,這裏經過db.execSQL(String)來建立表.

onCreate用來建立數據庫表結構的,該函數在第一次建立數據庫時調用,也就是在調用SQLiteOpenHelper類的getWritableDatabase()或者getReadableDatabase()時會調用該方法,以下圖所示:

 能夠看到只有調用getWritableDatabase()或者getReadableDatabase()時,纔會真正建立數據庫。

  • getReadableDatabase() : 獲取一個只讀數據庫(不能寫入)
  • getWritableDatabase ()  :  獲取一個可寫的數據庫,再也不操做的時候,必定要close()關閉數據庫,若是磁盤已滿,獲取將會報錯.

 

好比建立一個student學生表,標題分別爲id、name、score、class,填入下面代碼便可:

 

5.public abstract void onUpgrade (SQLiteDatabase db, int oldVersion, int newVersion)

  • db  :  數據庫對象,經過db.execSQL(String)來執行sql語句
  • oldVersion    : 顯示以前舊的數據庫版本。
  • newVersion  : 顯示升級以後的新數據庫版本。

當數據庫須要升級時調用。使用此方法刪除表、添加表或執行升級到新模式版本所需的任何其餘操做。

若是添加新列,可使用ALTER TABLE將它們插入活動表。若是重命名或刪除列,可使用ALTER TABLE重命名舊錶,而後建立新表,而後用舊錶的內容填充新表。

 

6.數據庫增刪改查

實現了SQLiteOpenHelper的子類(MyOpenHelper類)後,就有了數據庫了,接下來咱們即可以對SQLiteDatabase進行數據庫增刪改查

6.1 經過SQLiteDatabase getWritableDatabase()來獲取SQLiteDatabase類.

SQLiteDatabase類中經常使用方法以下所示:

public Cursor rawQuery (String sql, String[] selectionArgs);
// rawQuery:查詢數據庫內容,並將查詢到的結果集保存在Cursor遊標類中,並返回.
// sql:填入select查詢語句
// selectionArgs:若是sql參數填入的內容是正常語句,則這裏填NULL,若是是where子句中包含?,則將會被selectionArgs中的值替換.

void  execSQL(String sql);
//用來執行INSERT、UPDATE 或 DELETE 的sql語句

Cursor類遊標默認是指向全部結果以前的一行,而後經過moveToNext()方法就能獲取每一行結果的內容

 

示例以下-讀出student表裏的內容:

  SQLiteDatabase database =  new MyOpenHelper(this).getWritableDatabase();  //獲取數據庫

  Cursor cursor = database.rawQuery("select * from student", null);  //查詢student表內容


  while (cursor.moveToNext()) {

     //能夠經過 getXXX方法 獲取每一行數據
     String name = cursor.getString(cursor.getColumnIndex("name"));  //獲取當前遊標所在行下的name列內容
     String score = cursor.getString(cursor.getColumnIndex("score"));//獲取當前遊標所在行下的score列內容
     System.out.println("name=" + name + " score =" + score);

    }

  cursor.close();
  database.close();

 

7.安卓示例-查詢添加刪除示例

界面以下:

 

操做示例以下:

 

以下圖所示,能夠看到咱們剛剛操做的數據庫:

 

打開後,以下圖所示,就能夠看到咱們剛剛寫入的數據:

 

 

8.具體代碼實現

8.1 activity_main.xml以下所示:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".MainActivity" >


    <EditText
        android:id="@+id/et_query"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="這裏顯示要查詢的內容"
        android:textSize="12sp"
        android:minLines="10" />
    
    <Button 
        android:id="@+id/btn_query"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentRight="true"
        android:layout_below="@id/et_query"
        android:text="查詢內容"
        />
 
    
    <TextView
        android:id="@+id/textView1"
        
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_below="@id/btn_query"
        
        android:paddingTop="50dp"
        android:text="名字:" />

    <EditText
        android:id="@+id/et_nameAdd"
        android:layout_width="50dp"
        android:layout_height="wrap_content"
        android:layout_alignBaseline="@id/textView1"
        android:layout_toRightOf="@id/textView1"
        android:textSize="11sp" />
    
    <TextView
        android:id="@+id/textView2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_toRightOf="@id/et_nameAdd"
        android:layout_alignBaseline="@id/textView1"
        android:text="成績:" />

    <EditText
        android:id="@+id/et_scoreAdd"
        android:layout_width="50dp"
        android:layout_height="wrap_content"
        android:layout_alignBaseline="@id/textView1"
        android:layout_toRightOf="@id/textView2"
        android:textSize="11sp" />
    
     <TextView
        android:id="@+id/textView3"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_toRightOf="@id/et_scoreAdd"
        android:layout_alignBaseline="@id/textView1"
        android:text="班級:" />

    <EditText
        android:id="@+id/et_classAdd"
        android:layout_width="50dp"
        android:layout_height="wrap_content"
        android:layout_alignBaseline="@id/textView1"
        android:layout_toRightOf="@id/textView3"
        android:textSize="11sp" />
    
    
    <Button
        android:id="@+id/btn_add"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignBaseline="@id/textView1"
        android:layout_toRightOf="@id/et_classAdd"
        android:text="添加"
        android:textSize="11sp" />
   
    
    <TextView
        android:id="@+id/textView4"
        
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentBottom="true"
        android:paddingBottom="20dp"
        android:text="要刪除的id:" />

    <EditText
        android:id="@+id/et_deleteId"
        android:layout_width="140dp"
      
        android:layout_height="wrap_content"
        android:layout_alignBaseline="@+id/textView4"
        android:layout_toRightOf="@+id/textView4"
        android:textSize="11sp" />
    
     <Button
        android:id="@+id/btn_deleteId"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignBaseline="@+id/et_deleteId"
        android:layout_alignParentRight="true"
        android:textSize="13sp" 
        android:text="刪除"/>
     
</RelativeLayout>

 

8.2 MyOpenHelper.java以下所示:

public class MyOpenHelper extends SQLiteOpenHelper {

    public MyOpenHelper(Context context) {
        //這裏建立一個數據庫,名字爲demo.db
        super(context, "demo.db", null, 1);
        
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        //onCreate用來建立數據庫表結構的,這裏建立一個student學生表,標題分別爲id、name、score、class
        db.execSQL("CREATE TABLE student ("
                +"id INTEGER PRIMARY KEY AUTOINCREMENT, "
                +"name VARCHAR(40) NOT NULL, "
                +"score INTEGER NOT NULL, "
                +"class VARCHAR(40) NOT NULL)");
        
        System.out.println("onCreate 建立表");
    }
    
    
    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        //實現版本升級的函數
        System.out.println("onupgrade  oldVersion"+oldVersion+"newVersion"+newVersion);
        
        switch (oldVersion) {
        case 1:            //若是以前版本號爲1.(標題只有id、name、score、class),那麼將添加科目和考號標題
            db.execSQL("alter table info add age 科目");
            db.execSQL("alter table info add age 考號");
            break;

        }
        
    }

}

 

8.3 MainActivity.java以下所示:

public class MainActivity extends Activity {

    private MyOpenHelper openHelper;
    private EditText et_nameAdd;
    private EditText et_scoreAdd;
    private EditText et_classAdd;
    private EditText et_query;
    private EditText et_deleteId;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        openHelper = new MyOpenHelper(this);
        
        et_nameAdd = (EditText)findViewById(R.id.et_nameAdd);
        
        et_scoreAdd = (EditText)findViewById(R.id.et_scoreAdd);
        
        et_classAdd = (EditText)findViewById(R.id.et_classAdd);
        
        et_query = (EditText)findViewById(R.id.et_query);
               
        et_deleteId = (EditText)findViewById(R.id.et_deleteId);
        
        //實現查詢數據庫功能
        Button btn_query = (Button)findViewById(R.id.btn_query); 
        btn_query.setOnClickListener(new OnClickListener() {
            
            @Override
            public void onClick(View v) {
                
                SQLiteDatabase readableDatabase = openHelper.getReadableDatabase();
                
                Cursor rawQuery = readableDatabase.rawQuery("select * from student", null);
                
                StringBuilder text = new StringBuilder();
                
                text.append("query length:"+String.valueOf(rawQuery.getCount()));
                                
                while(rawQuery.moveToNext()){
                    
                    String id = rawQuery.getString(rawQuery.getColumnIndex("id"));//獲取當前遊標所在行下的id列內容
                    String name = rawQuery.getString(rawQuery.getColumnIndex("name")); //獲取當前遊標所在行下的name列內容
                    String score  = rawQuery.getString(rawQuery.getColumnIndex("score"));//獲取當前遊標所在行下的score列內容
                    String classs = rawQuery.getString(rawQuery.getColumnIndex("class"));//獲取當前遊標所在行下的class列內容
                    
                    text.append("\r\n id:"+id+" 名字:"+name+" 成績:"+score+" 班級:"+classs);
                }
                
                rawQuery.close();
                readableDatabase.close();
                
                et_query.setText(text.toString());
            }
        });
        
        //實現添加數據項功能
        Button btn_add = (Button)findViewById(R.id.btn_add); 
        btn_add.setOnClickListener(new OnClickListener() {
            
            @Override
            public void onClick(View v) {
                
                String name = et_nameAdd.getText().toString().trim();
                String score =  et_scoreAdd.getText().toString().trim();
                String classs = et_classAdd.getText().toString().trim();
                
                if(TextUtils.isEmpty(name)||TextUtils.isEmpty(score)||TextUtils.isEmpty(classs))
                {
                    Toast.makeText(MainActivity.this, "添加的內容不能爲空", Toast.LENGTH_SHORT).show();
                    return;
                }
                String sql = "INSERT INTO student(name, score,class) "
                   +"VALUES ('"+name+"', "+score+", '"+classs+"')";

                SQLiteDatabase writableDatabase = openHelper.getWritableDatabase();
                
                writableDatabase.execSQL(sql);
                writableDatabase.close();
                
                System.out.println(sql);
            }
            
        });
        
       //實現經過ID號來刪除某一行數據項功能
        Button btn_deleteId = (Button)findViewById(R.id.btn_deleteId); 
        btn_deleteId.setOnClickListener(new OnClickListener() {
            
            @Override
            public void onClick(View v) {
                
                String id = et_deleteId.getText().toString().trim();
                
                if(TextUtils.isEmpty(id)){
                    
                    Toast.makeText(MainActivity.this, "刪除的內容不能爲空", Toast.LENGTH_SHORT).show();
                    return;
                    
                }else if(!TextUtils.isDigitsOnly(id)){
                    
                    Toast.makeText(MainActivity.this, "請填入要刪除的數字!", Toast.LENGTH_SHORT).show();
                    return;
                    
                }
                
                SQLiteDatabase readableDatabase = openHelper.getReadableDatabase();
                
                readableDatabase.execSQL("DELETE FROM student WHERE  id = "+id+"");
                
                System.out.println("DELETE FROM student WHERE  id = "+id+"");
                
                Toast.makeText(MainActivity.this, "已刪除ID"+id+"所在的一行!", Toast.LENGTH_SHORT).show();
            }
        });
        
    }

    @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;
    }
    
}
相關文章
相關標籤/搜索