Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Sqlite在Android中的簡單使用

Sqlite在Android中的簡單使用

編輯:關於Android編程

說到Android中的數據存儲方式,聽人說有5種 其實具體有幾種寡人不甚清楚,無所謂,愛有幾種要幾種

讓我來縷一縷到底有幾種方式吧 shit

回顧一下android中數據存儲的方式有很多種:

(1) SharePreferences 通過api進行get、put操作 ----進程內部使用,可以實現資源共享,局限性比較大

可以參考:SharedPreference 實現不同進程間的數據共享

(2) 通過file進行一些輸入輸出流控制 ----能實現進程間的共享,但是使用比較麻煩,個人不太喜歡用

(3) 通過SQLite進行數據庫的讀寫 ----進程內部使用,可以實現資源共享,局限性比較大

(4) ContentProvider 進行數據的存儲 ----可以實現進程間的共享,可以和SQLite配合使用(當然也可以用其他幾個存儲方式,稍後補充上實例),一般實現的是大型數據操作

(5) 網絡存儲數據 ----比較麻煩,有局限性

(6) system.prop 也可以進行簡單的數據存儲 ----有局限性,有default值,可以臨時修改,重啟後就會恢復默認值或重新設置

//這個是網上蕩來的,我並不清楚,也沒有用過,,有時間百度一下

使用ContentProvider共享數據的好處是統一了數據訪問方式,可以存儲 一些圖片等的數據。而這些其他是有局限性的。

本篇文章講述如何利用Android內置數據庫sqlite進行數據的存儲

說到數據庫就要說到SQLiteOpenHelper這個類了,在Android開發中利用SQLiteOpenHelper實現數據庫的增刪改查操作

讓我們看看如何實例化這個類

/**
 *
 * Created by xuenan on 2016/3/17.
 */
public class PersonDbOpenHelper extends SQLiteOpenHelper{
    private static final String DATABASE_NAME = "mysql.db";
    private static final String TABLE_NAME = "person";
    private static final int DATABASE_VERSION = 1;
    private SQLiteDatabase mDb;
    public PersonDbOpenHelper(Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
        mDb = getWritableDatabase();
    }
    //  當數據庫第一創建的時候調用
    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL("CREATE TABLE " + TABLE_NAME + " (_id INTEGER PRIMARY KEY, name TEXT, age INTEGER, height REAL)");
    }
    // 當數據庫版本更新的時候調用
    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        db.execSQL("ALTER TABLE person ADD COLUMN sex TEXT");
    }
    /**
     * 插入一條數據
     * @param person
     * @return
     */
    public long insert(Person person) {
        ContentValues values = new ContentValues();
        values.put("name", person.getName());
        values.put("age", person.getAge());
        values.put("height", person.getHeight());
        //public long insert (String table, String nullColumnHack, ContentValues values)
        //table:表名;
        //nullColumnHack:設置為null;
        //valuse:你要插入的值,類型為ContentValues。
        return mDb.insert(TABLE_NAME, null, values);
    }

    /**
     * 查詢所有
     * @return
     */
    public List> queryAll() {
        // public Cursor query (String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy, String limit)
        //table:數據庫表的名稱
        //columns:數據庫列名稱數組 寫入後最後返回的Cursor中只能查到這裡的列的內容
        //selection:查詢條件
        //selectionArgs:查詢結果
        //groupBy:分組列
        //having:分組條件
        //orderBy:排序列
        //limit:分頁查詢限制 第八個參數,在方法中沒有體現
        Cursor cursor = mDb.query(TABLE_NAME, null, null, null, null, null, null);
        List> list = new ArrayList<>();
        while (cursor.moveToNext()) {
            Map map = new HashMap<>();
            for (int i = 0; i < cursor.getColumnCount(); i++) {
                int type = cursor.getType(i);
                switch(type) {
                    case Cursor.FIELD_TYPE_FLOAT:
                        map.put(cursor.getColumnName(i), cursor.getFloat(i));
                        break;
                    case Cursor.FIELD_TYPE_INTEGER:
                        map.put(cursor.getColumnName(i), cursor.getInt(i));
                        break;
                    case Cursor.FIELD_TYPE_NULL:
                        map.put(cursor.getColumnName(i), null);
                        break;
                    case Cursor.FIELD_TYPE_STRING:
                        map.put(cursor.getColumnName(i), cursor.getString(i));
                        break;
                }
            }
            list.add(map);
        }
        cursor.close();
        return list;
    }

    /**
     * 刪除所有
     */
    public void deleteAll() {
        mDb.delete(TABLE_NAME, null, null);
    }

    /**
     * 根據id刪除
     * @param id
     */
    public void deleteById(int id) {
        //public int delete (String table, String whereClause, String[] whereArgs)
        //table:表名;
        //whereClause:刪除的條件,用法和update裡的一樣。如果為null,則刪除全部行。
        //whereArgs:用法和update裡的一樣。
        mDb.delete(TABLE_NAME, "_id=?", new String[] {String.valueOf(id)});
    }

    /**
     * 根據id查詢
     * @param id
     * @return
     */
    public Person queryById(int id) {
        Cursor cursor = mDb.query(TABLE_NAME, null, "_id=?", new String[] {String.valueOf(id)}, null, null, null);
        if (cursor.moveToFirst()) {
            Person p = new Person();
            p.setAge(cursor.getInt(cursor.getColumnIndex("age")));
            p.setHeight(cursor.getFloat(cursor.getColumnIndex("height")));
            p.setId(id);
            p.setName(cursor.getString(cursor.getColumnIndex("name")));
            return p;
        }
        cursor.close();
        return null;
    }

    /**
     * 根據id更新
     * @param person
     * @return
     */
    public int updateById(Person person) {
        ContentValues values = new ContentValues();
        values.put("_id", person.getId());
        values.put("name", person.getName());
        values.put("age", person.getAge());
        values.put("height", person.getHeight());
        //public int update (String table, ContentValues values, String whereClause, String[] whereArgs)
        //table:表名;
        //values:你需要更新個數據組成的一個map,由列的名字和列的新值構成,null是合法的值,會被轉化為NULL;
        //whereClause:更新的條件,為一個字符串。如果為null,則所有行都將更新;
        //whereArgs:字符串數組,和whereClause配合使用。有兩種用法,
        // 如果whereClause的條件已經直接給出,如“class = “ + num,num是傳入的參數,則whereArgs可設為null。
        // 如果是”class = ?“,則?會被whereArgs這個數組中對應的值替換,whereArgs給出?代表的值,有多個?的,字符串數組裡的值依次填入。
        return mDb.update(TABLE_NAME, values, "_id=?", new String[] {String.valueOf(person.getId())});
    }
}

主要的方法就是增刪改查,當然還有一個創建一個數據庫和表
類創建完之後就是使用了,上邊看到了,為了方便,我們使用了一個person類

public class Person {

    private int id;
    private String name;
    private int age;
    private float height;

    public Person() {

    }
    public Person(int id, String name, int age, float height) {
        super();
        this.id = id;
        this.name = name;
        this.age = age;
        this.height = height;
    }
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public float getHeight() {
        return height;
    }
    public void setHeight(float height) {
        this.height = height;
    }

    @Override
    public String toString() {
        return "id="+id+"--"+"name="+name+"--"+"age="+age+"--"+"height="+height;
    }
}

方法在Activity中的使用

public class MainActivity extends AppCompatActivity {
    private EditText nameBox, ageBox, heightBox, idBox;
    private TextView showText;
    private PersonDbOpenHelper dbHelper;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        // 初始化控件
        nameBox = (EditText) findViewById(R.id.editText_name);
        ageBox = (EditText) findViewById(R.id.editText_age);
        heightBox = (EditText) findViewById(R.id.editText_height);
        idBox = (EditText) findViewById(R.id.editText_id);
        showText = (TextView) findViewById(R.id.textView_show);
        // 生成Helper對象
        dbHelper = new PersonDbOpenHelper(this);
    }
    /*
     * 注意:因沒有進行容錯處理,需要正確輸入數據,否則會報異常
     */
    public void buttonClick(View v) {
        Person p;

        switch(v.getId()) {
            //插入一條數據
            case R.id.button_addData:
                String age = ageBox.getText().toString().trim();
                String height = heightBox.getText().toString().trim();
                String name = nameBox.getText().toString().trim();
                p = new Person();
                if((StringUtils.isEmpty(age))||(StringUtils.isEmpty(height))||(StringUtils.isEmpty(name))){
                    Toast.makeText(MainActivity.this,"請輸入完整",Toast.LENGTH_SHORT).show();
                    return;
                }
                if(!StringUtils.isUsualCharacter(name)){
                    Toast.makeText(MainActivity.this,"請輸入平常字符",Toast.LENGTH_SHORT).show();
                    return;
                }
                if(!StringUtils.isNumeric(age)){
                    Toast.makeText(MainActivity.this,"請輸入整數",Toast.LENGTH_SHORT).show();
                    return;
                }
                p.setAge(Integer.parseInt(age));
                p.setHeight(Float.parseFloat(height));
                p.setName(name);
                dbHelper.insert(p);
                break;
            //查詢所有
            case R.id.button_showAll:
                List> list = dbHelper.queryAll();
                showText.setText(list.toString());
                break;
            //清楚顯示數據
            case R.id.button_clear:
                showText.setText(null);
                break;
            //刪除所有數據
            case R.id.button_deleteAll:
                dbHelper.deleteAll();
                break;
            //根據id進行查找
            case R.id.button_queryById:
                String id = idBox.getText().toString().trim();
                if(!StringUtils.isNumeric(id)){
                    Toast.makeText(MainActivity.this,"請輸入數字",Toast.LENGTH_SHORT).show();
                    return;
                }
                p = dbHelper.queryById(Integer.parseInt(id));
                showText.setText(p.toString());
                break;
            //根據id進行更新
            case R.id.button_updateById:
                String age_update = ageBox.getText().toString().trim();
                String height_update = heightBox.getText().toString().trim();
                String name_update = nameBox.getText().toString().trim();
                String id_update = idBox.getText().toString().trim();
                p = new Person();
                if((StringUtils.isEmpty(age_update))||(StringUtils.isEmpty(height_update))||(StringUtils.isEmpty(name_update))){
                    Toast.makeText(MainActivity.this,"請輸入完整",Toast.LENGTH_SHORT).show();
                    return;
                }
                if(!StringUtils.isNumeric(id_update)){
                    Toast.makeText(MainActivity.this,"請輸入數字",Toast.LENGTH_SHORT).show();
                    return;
                }
                if(!StringUtils.isUsualCharacter(name_update)){
                    Toast.makeText(MainActivity.this,"請輸入平常字符",Toast.LENGTH_SHORT).show();
                    return;
                }
                if(!StringUtils.isNumeric(age_update)){
                    Toast.makeText(MainActivity.this,"請輸入整數",Toast.LENGTH_SHORT).show();
                    return;
                }
                p.setAge(Integer.parseInt(age_update));
                p.setHeight(Float.parseFloat(height_update));
                p.setName(name_update);
                p.setId(Integer.parseInt(id_update));
                dbHelper.updateById(p);
                break;
            //根據id進行刪除
            case R.id.button_deleteById:
                String id_delete = idBox.getText().toString().trim();
                if(!StringUtils.isNumeric(id_delete)){
                    Toast.makeText(MainActivity.this,"請輸入數字",Toast.LENGTH_SHORT).show();
                    return;
                }
                dbHelper.deleteById(Integer.parseInt(id_delete));
                break;
        }
    }
}
//為了防止插入數據報錯,進行了容錯處理
  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved