1. 程式人生 > >xutils使用手冊(二)——資料庫

xutils使用手冊(二)——資料庫

Xutils使用手冊

Xutils對資料庫的增刪改查

在上一篇部落格中我們講到了怎麼在Android Studio環境中新增xutils依賴,這裡我們通過xutils來對資料庫進行增刪改查

一、初始化資料庫

在MainApplication(參考上一篇部落格)中新增如下程式碼:

private DbManager.DaoConfig config;

    @Override
    public void onCreate() {
        super.onCreate();
        x.Ext.init(this);
        x.Ext.setDebug(true
);//是否輸出Debug日誌 config = new DbManager.DaoConfig(); //每一個config物件描述一個數據庫,多個數據庫就建立多個config物件 //這裡作為示例,我們只建立一個名字為dbName版本號為1的資料庫 config.setDbName("dbName").setDbVersion(1);//設定資料庫版本號 //config.setDbDir(File file); // 該語句會將資料庫檔案儲存在你想儲存的地方 //如果不設定則預設儲存在應用程式目錄下/database/dbName.db
config.setDbUpgradeListener(new DbManager.DbUpgradeListener() { @Override public void onUpgrade(DbManager db, int oldVersion, int newVersion) { //用來監聽資料庫是否升級 //如果當前資料庫版本號比已存在的資料庫版本號高則執行此片段 //用途:軟體升級之後在第一次執行時執行一些必要的初始化操作 } }); config.setTableCreateListener(new
DbManager.TableCreateListener() { @Override public void onTableCreated(DbManager db, TableEntity<?> table) { //用來監聽資料表的建立 //當第一次建立表的時候執行此片段 } }); config.setAllowTransaction(true); //是否允許開啟事務 }

因為DbManager這個物件我們會在其他地方使用,我們可以存放到一個專門的配置檔案中存放,但是出於方便考慮,我們在MainApplication中提供一個get方法

public DbManager.DaoConfig getDaoConfig() {
        return config;
}

ok,資料庫初始化完畢

二、建立一個數據表模型類

建立一個包com.doservlet.dao
並在包下建立一個User物件

package com.doservlet.dao;

import org.xutils.db.annotation.Column;
import org.xutils.db.annotation.Table;

/**
 * Created by 陳小默
 */
//Table註解指定了這個Bean類對應的資料表
@Table(name = "user")
public class User {
    //Column註解指明瞭這個屬性在資料表中狀態
    @Column(name = "id", isId = true)
    private int id;
    @Column(name = "name")
    private String name;
    @Column(name = "age")
    private int age;
    @Column(name = "sex")
    private boolean sex;

    public User() {
    }

    public User(int age, String name, boolean sex) {
        this.age = age;
        this.name = name;
        this.sex = sex;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    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 boolean isSex() {
        return sex;
    }

    public void setSex(boolean sex) {
        this.sex = sex;
    }

    @Override
    public String toString() {
        return "User{" +
                "age=" + age +
                ", id=" + id +
                ", name='" + name + '\'' +
                ", sex=" + sex +
                '}';
    }
}

定義好模型類我們就開始下一步操作

三、簡單的UI佈局搭建

修改activity_main.xml佈局檔案

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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:orientation="vertical"
    tools:context="com.doservlet.xutilsdemo.MainActivity">

    <Button
        android:id="@+id/insert"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:onClick="insert"
        android:text="insert" />

    <EditText
        android:id="@+id/id"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

    <Button
        android:id="@+id/delete"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:onClick="delete"
        android:text="delete" />

    <Button
        android:id="@+id/update"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:onClick="update"
        android:text="update" />

    <Button
        android:id="@+id/query"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:onClick="query"
        android:text="query" />

    <TextView
        android:id="@+id/query_list"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
</LinearLayout>

現在我們來完善MainActivity的程式碼

三、Java程式碼

int age = (int) (Math.random() * 20 + 10);
User user = new User(age, "name" + age, age % 2 == 0);
//我們只需要建立一個bean類
DbManager db = x.getDb(((MainApplication) getApplication()).getDaoConfig());
try {
    db.save(user);
} catch (DbException e) {
    query_list.setText("save failure:" + e.getMessage());
}

這裡我使用了三種方式

//方式1
//通過建立一個條件物件來刪除,注意不要向這個條件物件裡賦除了條件以外的其他任何值
{
    User user = new User();
    user.setId(id);
    try {
        db.delete(user);
    } catch (DbException e) {
        query_list.setText("delete failure:" + e.getMessage());
    }
}
//方式二
//通過自己構建條件來刪除
{
    try {
        db.delete(User.class, WhereBuilder.b("id", "=", id));
        //引數解析 第一個引數是列名 第二個引數是條件= != > <等等條件,第三個引數為傳遞的值
        //如果條件引數不止一個的話,我們還可以使用.and("id", "=", id)方法
        //同理還有.or("id", "=", id)方法
    } catch (DbException e) {
        query_list.setText("delete failure:" + e.getMessage());
    }
}
//方式三
{
try {
db.deleteById(User.class, id);
} catch (DbException e) {
                e.printStackTrace();
            }
        }

        DbManager db = x.getDb(((MainApplication) getApplication()).getDaoConfig());
        int id = Integer.parseInt(et.getText().toString());
        try {
            User user = new User();
            user.setId(id);
            user.setName("update");
            db.update(user, "name");
            //這裡更改的條件只有id,這裡引數的意思是將id=id的資料的name列屬性改為user物件中的name屬性
        } catch (DbException e) {
            e.printStackTrace();
        }

        DbManager db = x.getDb(((MainApplication) getApplication()).getDaoConfig());
        List<User> all = null;
            //輸入0查詢全部
        try {
            Selector<User> selector = db.selector(User.class);
            //如果要使用條件查詢的話可以使用 
            //Selector<User> selector = db.selector(User.class).where("id","=",id).and("age",">",10);
            all = selector.findAll();
        } catch (DbException e) {
            e.printStackTrace();
        }
        StringBuilder sb = new StringBuilder();
        if (all != null)
            for (User user : all) {
                sb.append(user.toString()).append("\r\n");
            }
        else {
            sb.append("null");
        }
        query_list.setText(sb.toString());
    }

附上MainActivity的完整程式碼

package com.doservlet.xutilsdemo;

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

import com.doservlet.dao.User;

import org.xutils.DbManager;
import org.xutils.common.util.KeyValue;
import org.xutils.db.Selector;
import org.xutils.db.sqlite.SqlInfo;
import org.xutils.db.sqlite.SqlInfoBuilder;
import org.xutils.db.sqlite.WhereBuilder;
import org.xutils.ex.DbException;
import org.xutils.x;

import java.util.List;

public class MainActivity extends AppCompatActivity {
    private TextView query_list;
    private EditText et;

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

    private void initView() {
        query_list = (TextView) findViewById(R.id.query_list);
        et = (EditText) findViewById(R.id.id);
    }

    public void insert(View view) {
        int age = (int) (Math.random() * 20 + 10);
        User user = new User(age, "name" + age, age % 2 == 0);
        DbManager db = x.getDb(((MainApplication) getApplication()).getDaoConfig());
        try {
            db.save(user);
        } catch (DbException e) {
            query_list.setText("save failure:" + e.getMessage());
        }
    }

    public void delete(View view) {
        DbManager db = x.getDb(((MainApplication) getApplication()).getDaoConfig());
        int id = Integer.parseInt(et.getText().toString());
        //方式1
        //通過建立一個條件物件來刪除,注意不要向這個條件物件裡賦除了條件以外的其他任何值
        {
            User user = new User();
            user.setId(id);
            try {
                db.delete(user);
            } catch (DbException e) {
                query_list.setText("delete failure:" + e.getMessage());
            }
        }
        //方式二
        //通過自己構建條件來刪除
        {
            try {
                db.delete(User.class, WhereBuilder.b("id", "=", id));
                //引數解析 第一個引數是列名 第二個引數是條件= != > <等等條件,第三個引數為傳遞的值
                //如果條件引數不止一個的話,我們還可以使用.and("id", "=", id)方法
                //同理還有.or("id", "=", id)方法
            } catch (DbException e) {
                query_list.setText("delete failure:" + e.getMessage());
            }
        }
        //方式三
        {
            try {
                db.deleteById(User.class, id);
            } catch (DbException e) {
                e.printStackTrace();
            }
        }
    }

    public void update(View view) {
        DbManager db = x.getDb(((MainApplication) getApplication()).getDaoConfig());
        int id = Integer.parseInt(et.getText().toString());
        try {
            User user = new User();
            user.setId(id);
            user.setName("update");
            db.update(user, "name");
        } catch (DbException e) {
            e.printStackTrace();
        }
    }

    public void query(View view) {
        DbManager db = x.getDb(((MainApplication) getApplication()).getDaoConfig());
        int id = Integer.parseInt(et.getText().toString());
        List<User> all = null;
            try {
                Selector<User> selector = db.selector(User.class);
                all = selector.findAll();
            } catch (DbException e) {
                e.printStackTrace();
            }
        }
        StringBuilder sb = new StringBuilder();
        if (all != null)
            for (User user : all) {
                sb.append(user.toString()).append("\r\n");
            }
        else {
            sb.append("null");
        }
        query_list.setText(sb.toString());
    }
}

四、效果演示

這裡寫圖片描述

點選3次insert按鈕
增加3條資料
在點選一下query按鈕

這裡寫圖片描述

現在我們在輸入框中輸入 1 ,然後單擊delete按鈕

這裡寫圖片描述

現在點選query查詢一下資料庫

這裡寫圖片描述

id=1的資料確實被刪除掉了

現在我們實驗一下update,在輸入框中輸入2,然後點選update按鈕,再點選query插敘資料庫

這裡寫圖片描述

測試完畢

結語(一定要看)

到這裡我們已經能夠使用xutils來操作資料庫了。
從以上教程我們可以發現一個很嚴重的問題,那就是xutils的資料庫操作過程十分繁瑣,甚至比直接使用Android sdk提供的資料操作方法更為複雜。
完全失去了其作為一個工具類框架應有的簡潔與優雅
作為替代,後面我會抽時間介紹其他資料庫工具類在Android上的應用