Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android儲存---SQLite數據庫的簡單使用,實現增刪改查

Android儲存---SQLite數據庫的簡單使用,實現增刪改查

編輯:關於Android編程

demo效果

增加數據: \   刪除數據 修改數據 \ \  

SQLite介紹

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

SQLite數據類型


一般數據采用的固定的靜態數據類型,而SQLite采用的是動態數據類型,會根據存入值自動判斷。SQLite具有以下五種常用的數據類型:
NULL: 這個值為空值;
VARCHAR(n):長度不固定且其最大長度為 n 的字串,n不能超過 4000;
CHAR(n):長度固定為n的字串,n不能超過 254;
INTEGER: 值被標識為整數,依據值的大小可以依次被存儲為1,2,3,4,5,6,7,8;
REAL: 所有值都是浮動的數值,被存儲為8字節的IEEE浮動標記序號;
TEXT: 值為文本字符串,使用數據庫編碼存儲(TUTF-8, UTF-16BE or UTF-16-LE);
BLOB: 值是BLOB數據塊,以輸入的數據格式進行存儲。如何輸入就如何存儲,不改變格式;
DATA :包含了 年份、月份、日期;

TIME: 包含了 小時、分鐘、秒;

SQLite常用的方法

方法名稱 方法表示含義 openOrCreateDatabase(String path,SQLiteDatabase.CursorFactoryfactory) 創建數據庫 打開或創建數據庫 insert(String table,String nullColumnHack,ContentValuesvalues)插入數據 插入一條記錄 delete(String table,String whereClause,String[]whereArgs)刪除數據 刪除一條記錄 query(String table,String[] columns,String selection,String[]selectionArgs,String groupBy,String having,StringorderBy) 查找數據 查詢一條記錄 update(String table,ContentValues values,String whereClause,String[]whereArgs) 更新數據 修改記錄 execSQL(String sql) 執行一條SQL語句 close() 關閉數據

insert插入數據

insert(String table,String nullColumnHack,ContentValuesvalues) 傳入的參數:1,表名,2,空列的默認值,3,ContentValues,類似於hashMap,是一種儲存的機制,用法為:
/**
     * 創建一個用來插入數據的方法
     *
     * @param name  姓名
     * @param sex   性別
     * @param age   年齡
     * @param hobby 愛好
     */
    public void insert(String name, String sex, String age, String hobby) {
        //讓數據庫可寫
        SQLiteDatabase database = getWritableDatabase();
        /*
        類似於HashMap 都有鍵值對
        key 對應的列表中的某一列的名稱,字段
        value 對應字段要插入的值
         */
        ContentValues values = new ContentValues();
        values.put("name", name);
        values.put("sex", sex);
        values.put("age", age);
        values.put("hobby", hobby);
        //插入
        database.insert(TABLE_NAME, null, values);
        //插入完成後關閉,以免造成內存洩漏
        database.close();

    }

delete刪除數據

delete(String table,String whereClause,String[]whereArgs) 傳入的參數:參數1, 表名稱 參數2 , 刪除條件參數3 , 刪除條件值數組,用法為:
/**
     * 創建一個刪除數據的方法,傳入的參數越多,刪除時越精確的找到要刪除的哪一行
     *
     * @param name
     * @param sex
     * @param age
     * @param hobby
     */
    public void delete(int id, String name, String sex, String age, String hobby) {
        SQLiteDatabase database = getWritableDatabase();
        /*
        刪除的條件,當id = 傳入的參數id時,sex = 傳入的參數sex時,age = 傳入的age,hobby = 傳入的hobby時
        當條件都滿足時才刪除這行數據,一個條件不滿足就刪除失敗
         */
        String where = "id=? and name = ? and sex = ? and age = ? and hobby = ?";
        //刪除條件的參數
        String[] whereArgs = {id + "", name, sex, age, hobby};
        database.delete(TABLE_NAME, where, whereArgs);
        database.close();
    }

    /**
     * 再創建一個刪除一個刪除的方法,條件只有一個
     */
    public void delete(int id) {
        SQLiteDatabase database = getWritableDatabase();
        //當條件滿足id = 傳入的參數的時候,就刪除那整行數據,有可能有好幾行都滿足這個條件,滿足的全部都刪除
        String where = "id = ?";
        String[] whereArgs = {id + ""};
        database.delete(TABLE_NAME, where, whereArgs);
        database.close();
    }


updata修改數據

update(String table,ContentValues values,StringwhereClause, String[]whereArgs)方法 傳入的參數:參數1表名稱 參數2跟行列ContentValues類型的鍵值對Key-Value 參數3更新條件(where字句) 參數4更新條件數組      
/**
     * 創建一個修改數據的方法
     * @param id   條件,修改id為"id"的那一行數據
     * @param name
     * @param sex
     * @param age
     * @param hobby
     */
    public void updata(int id,String name, String sex, String age, String hobby) {
        SQLiteDatabase database = getWritableDatabase();
//        update(String table,ContentValues values,String  whereClause, String[]  whereArgs)
        String where = "id = ?";
        String[] whereArgs = {id+""};
        ContentValues values = new ContentValues();
        values.put("name", name);
        values.put("sex", sex);
        values.put("age", age);
        values.put("hobby", hobby);
        //參數1  表名稱	參數2  跟行列ContentValues類型的鍵值對Key-Value
       // 參數3  更新條件(where字句)	參數4  更新條件數組
        database.update(TABLE_NAME, values,where, whereArgs);
        database.close();
 

query查找數據

query(String table,String[] columns,String selection,String[]selectionArgs,String groupBy,String having,String orderBy,String limit) 傳入參數:參數table:表名稱 參數columns:列名稱數組 參數selection:條件字句,相當於where參數selectionArgs:條件字句,參數數組
參數groupBy:分組列 參數having:分組條件 參數orderBy:排序列 參數limit:分頁查詢限制
  /**
     * 創建一個查找數據庫的方法
     *
     * public  Cursor query(String table,String[] columns,String selection,String[]  selectionArgs,String groupBy,String having,String orderBy,String limit);
     各個參數的意義說明:
     參數table:表名稱
     參數columns:列名稱數組
     參數selection:條件字句,相當於where
     參數selectionArgs:條件字句,參數數組
     參數groupBy:分組列
     參數having:分組條件
     參數orderBy:排序列
     參數limit:分頁查詢限制
     參數Cursor:返回值,相當於結果集ResultSet
     Cursor是一個游標接口,提供了遍歷查詢結果的方法,如移動指針方法move(),獲得列值方法getString()等.
     */
    public Cursor query() {
        //數據庫可讀
        SQLiteDatabase database = getReadableDatabase();
        //查找
        Cursor query = database.query(TABLE_NAME, null, null, null, null, null, null);
        return query;
    }

循環遍歷,拿到數據
 /**
     * 通過查找數據庫,拿到裡面的數據
     */
    private List> getData() {
        list = new ArrayList<>();
        Cursor query = MyDataBase.getInstances(MainActivity.this).query();
        /*
        游標cursor默認是在-1的位置,query.moveToFirst()將游標移動到第一行,如果不寫這個就會報
         Caused by: android.database.CursorIndexOutOfBoundsException: Index -1 requested, with a size of 12
         這個問題坑爹,以後一定要注意
         */
        if (query.moveToFirst()) {
            do {
                String name = query.getString(query.getColumnIndex("name"));
                String sex = query.getString(query.getColumnIndex("sex"));
                String age = query.getString(query.getColumnIndex("age"));
                String hobby = query.getString(query.getColumnIndex("hobby"));
                int id = query.getInt(query.getColumnIndex("id"));
                Map map = new HashMap<>();
                map.put("id", id);
                map.put("name", name);
                map.put("sex", sex);
                map.put("age", age);
                map.put("hobby", hobby);
                list.add(map);
            } while (query.moveToNext());
        }
        //關閉查詢游標
        query.close();
        return list;
    }

demo具體實現

操作數據庫的類
package com.duanlian.databasedemo;

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

/**
 * Created by duanlian on 2016/9/13.
 */
public class MyDataBase extends SQLiteOpenHelper {
    //數據庫名字
    public static final String DB_NAME = "Students.db";
    //數據庫版本
    public static final int DB_VERSION = 1;
    //表名
    public static final String TABLE_NAME = "student";
    public static MyDataBase myDataBase;

    /**
     * 單例模式返回數據庫
     *
     * @param context 上下文
     * @return 數據庫對象
     */
    public static MyDataBase getInstances(Context context) {
        if (myDataBase == null) {
            return new MyDataBase(context);
        } else {
            return myDataBase;
        }
    }


    //上下文,數據庫名字,數據庫工廠,版本號
    public MyDataBase(Context context) {
        super(context, DB_NAME, null, DB_VERSION);
    }

    //此方法中創建表
    @Override
    public void onCreate(SQLiteDatabase sqLiteDatabase) {
        //這個有個坑,create table"+" " + TABLE_NAME 中間一定要加空格,別問為什麼,我也不知道,不加就語法錯誤,吐血
        sqLiteDatabase.execSQL("create table" + " " + TABLE_NAME + "(id INTEGER PRIMARY KEY AUTOINCREMENT,name text,sex text,age text,hobby text);");

    }

    /**
     * 用來更新數據庫版本的
     * onCreate方法只是在第一次安裝app的時候會調用,之後的數據庫要更改的話,必須使用數據庫版本上升,或者卸載了重新安裝
     *
     * @param sqLiteDatabase 數據庫
     * @param oldVersion     老的版本號
     * @param newVersion     更新後的版本號
     */
    @Override
    public void onUpgrade(SQLiteDatabase sqLiteDatabase, int oldVersion, int newVersion) {
        if (newVersion > oldVersion) {
            //刪除老表
            sqLiteDatabase.execSQL("drop" + TABLE_NAME);
            //重新創建表
            onCreate(sqLiteDatabase);
        }

    }

    /**
     * 創建一個用來插入數據的方法
     *
     * @param name  姓名
     * @param sex   性別
     * @param age   年齡
     * @param hobby 愛好
     */
    public void insert(String name, String sex, String age, String hobby) {
        //讓數據庫可寫
        SQLiteDatabase database = getWritableDatabase();
        /*
        類似於HashMap 都有鍵值對
        key 對應的列表中的某一列的名稱,字段
        value 對應字段要插入的值
         */
        ContentValues values = new ContentValues();
        values.put("name", name);
        values.put("sex", sex);
        values.put("age", age);
        values.put("hobby", hobby);
        //插入
        database.insert(TABLE_NAME, null, values);
        //插入完成後關閉,以免造成內存洩漏
        database.close();

    }


    /**
     * 創建一個查找數據庫的方法
     *
     * public  Cursor query(String table,String[] columns,String selection,String[]  selectionArgs,String groupBy,String having,String orderBy,String limit);
     各個參數的意義說明:
     參數table:表名稱
     參數columns:列名稱數組
     參數selection:條件字句,相當於where
     參數selectionArgs:條件字句,參數數組
     參數groupBy:分組列
     參數having:分組條件
     參數orderBy:排序列
     參數limit:分頁查詢限制
     參數Cursor:返回值,相當於結果集ResultSet
     Cursor是一個游標接口,提供了遍歷查詢結果的方法,如移動指針方法move(),獲得列值方法getString()等.
     */
    public Cursor query() {
        //數據庫可讀
        SQLiteDatabase database = getReadableDatabase();
        //查找
        Cursor query = database.query(TABLE_NAME, null, null, null, null, null, null);
        return query;
    }

    /**
     * 創建一個刪除數據的方法,傳入的參數越多,刪除時越精確的找到要刪除的哪一行
     *
     * @param name
     * @param sex
     * @param age
     * @param hobby
     */
    public void delete(int id, String name, String sex, String age, String hobby) {
        SQLiteDatabase database = getWritableDatabase();
        /*
        刪除的條件,當id = 傳入的參數id時,sex = 傳入的參數sex時,age = 傳入的age,hobby = 傳入的hobby時
        當條件都滿足時才刪除這行數據,一個條件不滿足就刪除失敗
         */
        String where = "id=? and name = ? and sex = ? and age = ? and hobby = ?";
        //刪除條件的參數
        String[] whereArgs = {id + "", name, sex, age, hobby};
        database.delete(TABLE_NAME, where, whereArgs);
        database.close();
    }

    /**
     * 再創建一個刪除一個刪除的方法,條件只有一個
     */
    public void delete(int id) {
        SQLiteDatabase database = getWritableDatabase();
        //當條件滿足id = 傳入的參數的時候,就刪除那整行數據,有可能有好幾行都滿足這個條件,滿足的全部都刪除
        String where = "id = ?";
        String[] whereArgs = {id + ""};
        database.delete(TABLE_NAME, where, whereArgs);
        database.close();
    }

    /**
     * 創建一個修改數據的方法
     * @param id   條件,修改id為"id"的那一行數據
     * @param name
     * @param sex
     * @param age
     * @param hobby
     */
    public void updata(int id,String name, String sex, String age, String hobby) {
        SQLiteDatabase database = getWritableDatabase();
//        update(String table,ContentValues values,String  whereClause, String[]  whereArgs)
        String where = "id = ?";
        String[] whereArgs = {id+""};
        ContentValues values = new ContentValues();
        values.put("name", name);
        values.put("sex", sex);
        values.put("age", age);
        values.put("hobby", hobby);
        //參數1  表名稱	參數2  跟行列ContentValues類型的鍵值對Key-Value
       // 參數3  更新條件(where字句)	參數4  更新條件數組
        database.update(TABLE_NAME, values,where, whereArgs);
        database.close();
    }
}

mainActivity裡面的代碼邏輯
package com.duanlian.databasedemo;

import android.content.DialogInterface;
import android.content.Intent;
import android.database.Cursor;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.AdapterView;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.Toast;

import com.duanlian.databasedemo.adapter.MyListViewAdapter;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class MainActivity extends AppCompatActivity {
    private List> list;
    private MyListViewAdapter adapter;
    private ListView mListView;


    @Override

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initView();
        setListener();
    }


    private void initView() {
        mListView = (ListView) findViewById(R.id.main_listview);
        List> data = getData();
        adapter = new MyListViewAdapter(this, data);
        mListView.setAdapter(adapter);
        adapter.notifyDataSetChanged();
    }

    private void setListener() {
        //點擊跳轉
        findViewById(R.id.insert).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent(MainActivity.this, AddActivity.class);
                startActivityForResult(intent, 0);
            }
        });
        //ListView的監聽事件
        mListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
//            private int id;

            @Override
            public void onItemClick(AdapterView adapterView, View view, int position, long l) {
//                //刪除是要拿到當前行的id值才能刪除當前行,下面的操作都是點擊某個item拿到對應item的id字段
//                //拿到當前position的 item的所有數據
//                //返回的數據格式為{name=段煉, age=25, sex=男, id=12, hobby=吃飯。睡覺}
//                Object itemAtPosition = mListView.getItemAtPosition(position);
//                Log.e("duanlian", itemAtPosition+"");
//                //轉換成String
//                String s = itemAtPosition.toString();
//                //如果字符串包含"id"字段
//                if (s.contains("id")) {
//                    //拿到id字段是處於字符串第幾個位置
//                    int a = s.indexOf("id");
//                    //"id"字段後面是"hobby"字段,拿到hobby字段的位置
//                    int b = s.indexOf("hobby");
//                    //切割字符串{name=段煉, age=25, sex=男, id=12, hobby=吃飯。睡覺}
//                    //從i開始+3個正好是id開始的地方,hobby-2正好是id結束的位置減去了一個h和一個逗號
//                    String substring = s.substring(a + 3, b-2);
//                    //得到id後轉換成int類型
//                    id = Integer.parseInt(substring);
//                }
//                //將得到id傳入到需要的方法中
//                showMyDialog(id, position);
                //得到對應item裡面的id
                Object id = list.get(position).get("id");
                int i = Integer.parseInt(id.toString());
                String name = list.get(position).get("name").toString();
                String sex = list.get(position).get("sex").toString();
                String age = list.get(position).get("age").toString();
                String hobby = list.get(position).get("hobby").toString();
                //將得到id傳入到需要的方法中
                showMyDialog(i, name, sex, age, hobby);
            }
        });
    }

    /**
     * 點擊顯示對話框選擇修改或者是刪除
     */
    private void showMyDialog(final int id, final String name, final String sex, final String age, final String hobby) {
        final AlertDialog.Builder builder = new AlertDialog.Builder(this);
        //設置一個標題
        builder.setTitle("請選擇");
        //給dialog設置item
        builder.setItems(new String[]{"修改", "刪除"}, new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialogInterface, int position) {
                switch (position) {
                    case 0://修改
                        Intent intent = new Intent(MainActivity.this, CorrectActivity.class);
                        intent.putExtra("id", id);
                        intent.putExtra("name", name);
                        intent.putExtra("sex", sex);
                        intent.putExtra("age", age);
                        intent.putExtra("hobby", hobby);
                        startActivityForResult(intent,0);
                        break;
                    case 1://刪除
                        MyDataBase.getInstances(MainActivity.this).delete(id);
                        //重新查詢,然後顯示
                        List> data = getData();
                        adapter.refreshList(data);
                        Toast.makeText(MainActivity.this, "刪除成功", Toast.LENGTH_SHORT).show();
                        break;
                }

            }
        });
        builder.show();
    }

    /**
     * 通過查找數據庫,拿到裡面的數據
     */
    private List> getData() {
        list = new ArrayList<>();
        Cursor query = MyDataBase.getInstances(MainActivity.this).query();
        /*
        游標cursor默認是在-1的位置,query.moveToFirst()將游標移動到第一行,如果不寫這個就會報
         Caused by: android.database.CursorIndexOutOfBoundsException: Index -1 requested, with a size of 12
         這個問題坑爹,以後一定要注意
         */
        if (query.moveToFirst()) {
            do {
                String name = query.getString(query.getColumnIndex("name"));
                String sex = query.getString(query.getColumnIndex("sex"));
                String age = query.getString(query.getColumnIndex("age"));
                String hobby = query.getString(query.getColumnIndex("hobby"));
                int id = query.getInt(query.getColumnIndex("id"));
                Map map = new HashMap<>();
                map.put("id", id);
                map.put("name", name);
                map.put("sex", sex);
                map.put("age", age);
                map.put("hobby", hobby);
                list.add(map);
            } while (query.moveToNext());
        }
        //關閉查詢游標
        query.close();
        return list;
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode == 0) {
            List> data1 = getData();
//            adapter = new MyListViewAdapter(this, data1);
//            mListView.setAdapter(adapter);
            adapter.refreshList(data1);

        }
    }
}

插入數據邏輯
package com.duanlian.databasedemo;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;

public class AddActivity extends AppCompatActivity {

    private EditText edt_name;
    private EditText edt_sex;
    private EditText edt_age;
    private EditText edt_hobby;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_add);
        initView();
    }

    private void initView() {
        edt_name = (EditText) findViewById(R.id.add_name);
        edt_sex = (EditText) findViewById(R.id.add_sex);
        edt_age = (EditText) findViewById(R.id.add_age);
        edt_hobby = (EditText) findViewById(R.id.add_hobby);
    }
    public void add(View view){
        //拿到輸入的數據
        String name = edt_name.getText().toString().trim();
        String sex = edt_sex.getText().toString().trim();
        String age = edt_age.getText().toString().trim();
        String hobby = edt_hobby.getText().toString().trim();
        //調用插入方法
        MyDataBase.getInstances(AddActivity.this).insert(name,sex,age,hobby);
        finish();


    }

}

修改數據邏輯
package com.duanlian.databasedemo;

import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;

public class CorrectActivity extends AppCompatActivity {

    private int id;
    private String name;
    private String sex;
    private String age;
    private String hobby;
    private EditText edt_name;
    private EditText edt_sex;
    private EditText edt_age;
    private EditText edt_hobby;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_correct);
        id = getIntent().getIntExtra("id", 0);
        name = getIntent().getStringExtra("name");
        sex = getIntent().getStringExtra("sex");
        age = getIntent().getStringExtra("age");
        hobby = getIntent().getStringExtra("hobby");
        initView();
    }

    private void initView() {
        edt_name = (EditText) findViewById(R.id.correct_name);
        edt_sex = (EditText) findViewById(R.id.correct_sex);
        edt_age = (EditText) findViewById(R.id.correct_age);
        edt_hobby = (EditText) findViewById(R.id.correct_hobby);
        edt_name.setText(name);
        edt_sex.setText(sex);
        edt_age.setText(age);
        edt_hobby.setText(hobby);
    }

    public void choose(View view) {
        switch (view.getId()) {
            case R.id.correct_cancel:
                finish();
                break;
            case R.id.correct_sure:
                //得到輸入的
                String name = edt_name.getText().toString().trim();
                String sex = edt_sex.getText().toString().trim();
                String age = edt_age.getText().toString().trim();
                String hobby = edt_hobby.getText().toString().trim();
                //調用修改方法
                MyDataBase.getInstances(CorrectActivity.this).updata(id, name, sex, age, hobby);
                finish();
                break;

        }
    }
}

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved