Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android學習之SQL基礎使用

Android學習之SQL基礎使用

編輯:關於Android編程

SQLITE 構化查詢語言 (Structured Query Language)

是什麼

SQLite是一個輕量型的數據庫。

怎麼樣

輕量級 : SQLite數據庫是一個輕量級的數據庫, 適用於少量數據的CURD; 文件本質 : SQLite數據庫支持大部分SQL語法, 允許使用SQL語句操作數據庫, 其本質是一個文件, 不需要安裝啟動; 數據讀寫 : SQLite數據庫打開只是打開了一個文件的讀寫流, 如果有大數據量讀寫, 需要高並發存儲, 那麼就不應該使用SQLite; 它在android中適合保存個人設置等沒有大量數據的信息,

怎麼用

用之前,先了解SQL基礎知識

SQLite的數據類型

null:空值相當於java中的null integer:帶符號的整型,相當於java中的int real:浮點數字,相當於java中的float/double text/varchar:字符串文本,相當於java中的String blob:二進制對象,相當於java中的byte數組,用於存放圖片

提醒:sql中不區分大小寫

Sqlite3中的約束

約束就是限定數據庫字段的條件

NOT NULL :非空

UNIQUE:唯一

PRIMARY:主鍵

CHECK:條件檢查

DEFAULT:默認

可對表裡的結構和字段進行約束限定,將約束條件放在需要約束的字段之後

創建表

數據庫是數據庫,數據表是存放在數據庫中存放信息的容器,

create table 表名(字段名 類型 長度 約束條件,….)

其中,長度和約束條件可根據實際情況添加

eg:create table student(
    "+"id INTEGER PRIMARY KEY AUTOINCREMENT,"
     +"name VARCHAR(20) NOT NULL,"
     +"cid INTEGER,"
     +"age INTEGER CHECK(age>18 and age<60),"
     +"gender BIT DEFAULT(1),"
     +"score REAL");

重要事項

SQL 對大小寫不敏感 SQL 語句後面的分號,分號是在數據庫系統中分隔每條 SQL 語句的標准方法,這樣就可以在對服務器的相同請求中執行一條以上的語句。 星號(*)是選取所有列的快捷方式。 引號的使用。SQL 使用單引號來環繞文本值(大部分數據庫系統也接受雙引號)。如果是數值,請不要使用引號。

SQL DML 和 DDL

可以把 SQL 分為兩個部分:數據操作語言 (DML) 和 數據定義語言 (DDL)。
SQL (結構化查詢語言)是用於執行查詢的語法。但是 SQL 語言也包含用於更新、插入和刪除記錄的語法。
查詢和更新指令構成了 SQL 的 DML 部分:

SELECT - 從數據庫表中獲取數據 UPDATE - 更新數據庫表中的數據 DELETE - 從數據庫表中刪除數據 INSERT INTO - 向數據庫表中插入數據

SQL 的數據定義語言 (DDL) 部分使我們有能力創建或刪除表格。我們也可以定義索引(鍵),規定表之間的鏈接,以及施加表間的約束。

SQL 中最重要的 DDL 語句:

CREATE DATABASE - 創建新數據庫 ALTER DATABASE - 修改數據庫 CREATE TABLE - 創建新表 ALTER TABLE - 變更(改變)數據庫表 DROP TABLE - 刪除表 CREATE INDEX - 創建索引(搜索鍵) DROP INDEX - 刪除索引

sql語句

語法

SELECT 列名稱 FROM 表名稱
eg:SELECT LastName FROM Persons

表示從Persons表裡面獲取名為LastName的列

SELECT DISTINCT 語句

DISTINCT:取唯一不同的值
語法:

SELECT DISTINCT 列名稱 FROM 表名稱
eg:SELECT DISTINCT Company FROM Orders 

表示從Orders表中選取唯一的Company

WHERE 子句

WHERE 子句用於規定選擇的標准。如需有條件地從表中選取數據,可將 WHERE 子句添加到 SELECT 語句。

語法

select 列 from 表名稱 where 列 運算符 值
eg:SELECT *FROM PERSONS WHERE City='beijing'

表示從PERSONS表中選取居住在北京的人

AND & OR 運算符

AND 和 OR 可在 WHERE 子語句中把兩個或多個條件結合起來。

如果第一個條件和第二個條件都成立,則 AND 運算符顯示一條記錄。

如果第一個條件和第二個條件中只要有一個成立,則 OR 運算符顯示一條記錄。

AND

eg:SELECT*FROM Persons WHERE FirstName='Thomas'**AND** Lastname='Carter'

OR

eg:SELECT * FROM Persons WHERE firstName='Thomas'**OR** lastName='Carter'

結合 AND 和 OR 運算符

使用圓括號來組成復雜的表達式

eg:SELECT * FROM Persons WHERE (FirstName='Thomas' OR 
   FirstName='William')
  AND LastName='Carter'

ORDER BY 子句

ORDER BY 語句用於對結果集進行排序。

ORDER BY 語句用於根據指定的列對結果集進行排序 ORDER BY 語句默認按升序對記錄進行排序 如果想按降序,可以使用DESC,升序使用ASC,但幾乎沒什麼用,因為默認升序
eg1:SELECT Company,OrderNumber From Order ORDER BY Company

表示從Orders表中選取Company和OrderNumber,以Company排序

eg2:SELECT Company,OrderNumber FORM Orders ORDER BY Company,OrderNumber

表示從Orders中選取Company,OrderNumber,以字母順序顯示公司名稱(Company),並以數字順序顯示順序號(OrderNumber)

eg3:SELECT Company, OrderNumber FROM Orders ORDER BY Company DESC

表示從Orders中選取Company,OrderNumber,以逆字母順序顯示公司名稱

eg4:SELECT Company, OrderNumber FROM Orders ORDER BY Company DESC, OrderNumber ASC

表示從Orders中選取Company,OrderNumber,以逆字母順序顯示公司名稱,並以數字順序顯示順序號

INSERT INTO 語句

INSERT INTO 語句用於向表格中插入新的行。

語法:

INSERT INTO 表名稱 VALUES (值1, 值2,....)


INSERT INTO table_name (列1, 列2,...) VALUES (值1, 值2,....)

插入新的行

eg:INSERT INTO Persons VALUES('gates','Bill','xuanwumen','beijing');

在指定的列中插入數據

eg:INSERT INTO Persons (LastName, Address) VALUES ('Wilson', 'Champs-Elysees')

Update 語句

Update 語句用於修改表中的數據。

語法

UPDATE 表名稱 SET 列名稱 = 新值 WHERE 列名稱 = 某值新某一行中的一個列

eg:UPDATE Person SET FirstName='Fred' WHERE LastName='Wilson'

表示更新Person表中LastName列中為Wilson的FirstName為Fred,

更新某一行中的若干列

eg:UPDATE Person SET Address = 'Zhongshan 23', City = 'Nanjing'
WHERE LastName = 'Wilson'

表示更新Person表中LastName列中為Wilson的Address和City

DELETE 語句

DELETE 語句用於刪除表中的行。

語法

DELETE FROM 表名 WHERE 列名=值
eg:DELETE FROM Person WHERE LastName = 'Wilson' 

表示刪除LastName為Wilson的人

刪除所有行

可以在不刪除表的情況下刪除所有的行。這意味著表的結構、屬性和索引都是完整的:

DELETE FROM table_name

或者
DELETE * FROM table_name**

Android中使用SQL

1、編寫數據庫幫助類

操作步驟

新建數據庫幫助類,繼承自SQLiteOpenHelper 編寫構造方法 重寫onCreate和onUpdate方法

具體代碼

 package com.cd.databasedemo;

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

/**
 * Created by Sky on 2016/10/7.
 * sQL幫助類,必須繼承自SQLiteOpenHelper,並重寫兩個方法
 * onCreate和onUpgrade,
 * onCreate:數據可創建時調用,主要用來初始化數據表結構,和初始數據
 * onUpgrade:數據庫更新時調用,主要用來改變表結構
 * 

*

* 數據庫幫助類要做的事: *

* 重寫onCreate和onUpgrade * 在這兩個方法中填寫sql語句 */ public class MydbHelper extends SQLiteOpenHelper { /** * @param context 上下文 * name 數據庫名稱 * CursorFactory 游標工廠,填寫null表示使用默認游標 * version 版本號,只能增不能減,否則會報錯 */ public MydbHelper(Context context) { super(context, "Sky.db", null, 2); } /** * 在數據庫創建時調用,主要用來初始化數據表結構和初始化數據記錄 * * @param db 當數據庫第一次被創建時調用這個方法,適合在這個方法裡面把數據表結構定義出來 * 所以只有第一次運行的時候才會執行這個方法,如果要看到這個方法執行,需要重新安裝app */ @Override public void onCreate(SQLiteDatabase db) { Log.d("MydbHelper", "創建數據庫onCreate"); db.execSQL("create table contactinfo(" +" id INTEGER PRIMARY KEY AUTOINCREMENT ," +" name varchar not null , " +" phone varchar not null )"); // db.execSQL("create table contactinfo(" // +"id integer primary key autoincrement," // +"name varchar(20)," // +"phone varchar(20))"); } /** * 當數據庫版本更新的時候調用,版本號必須比之前的大,否則會報錯 * * @param db * @param oldVersion * @param newVersion */ @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { db.execSQL("alter table contactinfo add account varchar(20)"); } }

數據庫操作類

步驟

編寫構造方法,實例化數據庫幫助類 通過調用數據庫幫助類,編寫
package com.cd.databasedemo;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;

/**
 * Created by Sky on 2016/10/7.
 */

public class ContactinfoDao {
    MydbHelper mMydbHelper;

    /**
     * 在構造方法中實例化幫助類
     *
     * @param context
     */
    public ContactinfoDao(Context context) {
        mMydbHelper = new MydbHelper(context);
    }

    /**
     * 將數據庫打開,幫幫助類實例化,然後利用這個對象
     */

    public long addData(String name, String phone) {
        /**
         * getWritableDatabase:
         * Create and/or open a database that will be used for reading and writing.
         *
         *
         * 增刪改查,每一次操作都要得到數據庫,操作完成後都要記得關閉
         * getWritableDatabase得到後數據庫才會被創建
         * 數據庫文件利用DDMS可以查看,在 data/data/包名/databases 目錄下即可查看
         */
        SQLiteDatabase writableDatabase = mMydbHelper.getWritableDatabase();
        /**
         * ContentValues:This class is used to store a set of values
         * 存儲值得集合
         */
        ContentValues values = new ContentValues();
        values.put("name", name);
        values.put("phone", phone);
        /**
         * 參數1:表名
         * 參數2:可選擇的項。可空、
         * 參數3:要添加的值
         * 返回類型:添加數據所在行數,如果返回-1,則表示添加失敗
         */
        long row = writableDatabase.insert("contactinfo", null, values);

        return row;
    }

    /**
     * 刪除
     *
     * @param name
     * @return
     */
    public int deleteData(String name,String phone) {
        SQLiteDatabase writableDatabase = mMydbHelper.getWritableDatabase();
        /**
         *參數1:表名
         * 參數2:刪除條件,如果為null,則表示刪除全部
         * 參數3:
         */
        int result = writableDatabase.delete("contactinfo", "name=(?,?)", new String[]{name,phone});
        return result;
    }

    /**
     *查詢
     * @param name
     * @return
     */
    public String alertData(String name) {
        SQLiteDatabase writableDatabase = mMydbHelper.getWritableDatabase();
        /**
         * 參數1:查詢的表
         * 參數2:查詢的列
         * 參數3:selection
         * 參數4:selectionArgs
         * 參數5:groupBy
         * 參數6:having
         * 參數7:orderBy
         */
        Cursor cursor = writableDatabase.query("contactinfo", new String[]{"phone"}, "name=?", new String[]{name}, null, null, null);
        String phone = null;
        if (cursor.moveToNext()) {
            phone = cursor.getString(0);
        }
        //關閉cursor
        cursor.close();
        //關閉數據庫
        writableDatabase.close();
        return phone;


    }

    /**
     * 更新
     * @param name
     * @param newphone
     * @return
     */
    public int updateData(String name, String newphone) {

        SQLiteDatabase writableDatabase = mMydbHelper.getWritableDatabase();

        ContentValues values = new ContentValues();
        values.put("phone", newphone);
        //更新contactinfo表中,name=name的手機號,返回行號
        int row = writableDatabase.update("contactinfo", values, "name=?", new String[]{name});

        return row;
    }
}

Activity裡面使用

先看小毛驢(xml)

這裡寫圖片描述

activity代碼<喎?/kf/ware/vc/" target="_blank" class="keylink">vc3Ryb25nPjwvY29kZT48L2NvZGU+PC9jb2RlPjwvY29kZT48L2NvZGU+PC9jb2RlPjwvcD4NCjxwcmUgY2xhc3M9"brush:java;"> package com.cd.databasedemo; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.text.TextUtils; import android.view.View; import android.widget.Button; import android.widget.EditText; import android.widget.Toast; public class MainActivity extends AppCompatActivity implements View.OnClickListener{ Button mInsert,mDelete,mUpdata,mAlert; EditText mName,mPhone; ContactinfoDao mContactinfoDao; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mInsert= (Button) findViewById(R.id.btn_insert); mDelete= (Button) findViewById(R.id.btn_delete); mUpdata= (Button) findViewById(R.id.btn_update); mAlert= (Button) findViewById(R.id.btn_alert); mName= (EditText) findViewById(R.id.et_name); mPhone= (EditText) findViewById(R.id.et_phone); mInsert.setOnClickListener(this); mDelete.setOnClickListener(this); mUpdata.setOnClickListener(this); mAlert.setOnClickListener(this); mContactinfoDao=new ContactinfoDao(this); } @Override public void onClick(View v) { switch (v.getId()){ case R.id.btn_insert: String name = mName.getText().toString(); String phone = mPhone.getText().toString(); if (TextUtils.isEmpty(name)||TextUtils.isEmpty(phone)){ Toast.makeText(this, "請輸入姓名和手機號", Toast.LENGTH_SHORT).show(); return; }else { long row = mContactinfoDao.addData(name, phone); if (row==-1){ Toast.makeText(this, "添加失敗", Toast.LENGTH_SHORT).show(); }else { Toast.makeText(this, "成功添加在"+row+"行", Toast.LENGTH_SHORT).show(); } } break; case R.id.btn_delete: String name1 = mName.getText().toString(); String phone1 = mPhone.getText().toString(); if (TextUtils.isEmpty(name1)){ Toast.makeText(this, "請輸入刪除條件", Toast.LENGTH_SHORT).show(); return; }else { int row_del = mContactinfoDao.deleteData(name1,phone1); if (row_del==-1){ Toast.makeText(this, "刪除失敗", Toast.LENGTH_SHORT).show(); }else { Toast.makeText(this, "成功刪除第" + row_del + "行", Toast.LENGTH_SHORT).show(); } } break; case R.id.btn_update: String name_up = mName.getText().toString(); String phone_up = mPhone.getText().toString(); if (TextUtils.isEmpty(name_up)||TextUtils.isEmpty(phone_up)){ Toast.makeText(this, "請輸入更新條件", Toast.LENGTH_SHORT).show(); return; }else { int row_up = mContactinfoDao.updateData(name_up, phone_up); if (row_up==-1){ Toast.makeText(this, "更新失敗", Toast.LENGTH_SHORT).show(); }else { Toast.makeText(this, "成功更新第" + row_up + "條", Toast.LENGTH_SHORT).show(); } } break; case R.id.btn_alert: String name_alert = mName.getText().toString(); if (TextUtils.isEmpty(name_alert)){ Toast.makeText(this, "請添加查詢條件", Toast.LENGTH_SHORT).show(); return; }else { String phone_alert = mContactinfoDao.alertData(name_alert); Toast.makeText(this, "查詢到的手機號為" + phone_alert, Toast.LENGTH_SHORT).show(); mPhone.setText(phone_alert); } break; } } }

全部代碼如上。

數據庫文件保存在系統文件夾的/data/data/包名/databases路徑下,操作時可以將文件導出,使用sqlite developer打開查看。

getReadableDatabase()和getWritableDatabase()的比較

這兩個方法都可以創建或打開一個現有的數據庫(如果數據庫已存在則直接打開,否則創建一個新的數據庫),並返回一個可對數據庫進行讀寫操作的對象 當數據庫不可寫入的時候(如磁盤空間已滿)getReadableDatabase()方法返回的對象將以只讀的方式去打開數據庫,而getWritableDatabase()方法則將出現異常
  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved