數據存儲之SQLite與LitePal

SQLite

一.簡意:

(1)SQLite:是一款輕量級關係數據庫,佔用資源少,運行速度快

(2)適用於大量複雜關係數據(file,sp此時不太適合)

二,用法:

(1)創建一個類 繼承SQLiteOpenHelper,重寫onCreate()和onUpgrade()方法

onCreate()方法:創建表

onUpgrade():版本更新

如下:

public class MyDatabaseHelper extends SQLiteOpenHelper {
    private Context mContext;

    //創表語句
    public static final String CREATE_BOOK = "create table Book ("
            + "id integer primary key autoincrement, "
            + "author text, "
            + "price real, "
            + "pages integer, "
            +"name text)";

    //創表語句2
    public static final String CREATE_CATEGORY = "create table Category ("
            + "id integer primary key autoincrement, "
            + "category_name text, "
            + "category_code integer)";

    public MyDatabaseHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
        super(context, name, factory, version);
        mContext = context;
    }

    /**
     * 創建表
     * @param db
     */
    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL(CREATE_BOOK);
        db.execSQL(CREATE_CATEGORY);
        Toast.makeText(mContext , "Create successed" , Toast.LENGTH_SHORT).show();
    }

    /**
     * 更新數據表
     * @param db
     * @param oldVersion
     * @param newVersion
     */
    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        db.execSQL("drop table if exists Book");
        db.execSQL("drop table if exists Category");
        onCreate(db);
    }
}


2.在Activity中去測試:增刪改查等操作

佈局,定義簡單的幾個按鈕:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent">

    <Button
        android:id="@+id/create_database"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Create database"/>
    <Button
        android:id="@+id/add"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="add data"/>
    <Button
        android:id="@+id/delete"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="delete data"/>
    <Button
        android:id="@+id/update"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="update data"/>
    <Button
        android:id="@+id/retrieve"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="retrieve data"/>

</LinearLayout>

在Activity中去執行操作,

四個方法的運用說明在例子中

public class DataBaseActivity extends AppCompatActivity {

    //創建數據庫
    @ViewInject(R.id.create_database)
    private Button mBtnCreate;

    //增加數據
    @ViewInject(R.id.add)
    private Button mBtnAdd;

    //更新數據
    @ViewInject(R.id.update)
    private Button mBtnUpdate;

    //刪除數據
    @ViewInject(R.id.delete)
    private Button mBtnDelete;

    //查詢數據
    @ViewInject(R.id.retrieve)
    private Button mBtnRetrieve;

    //MyDatabaseHelper對象
    private MyDatabaseHelper dbHelper;
    //SQLiteDatabase對象
    private SQLiteDatabase db;

    private static final String TAG = "DataBaseActivity";

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_database);

        ViewUtils.inject(this);

        //初始化:4個參數:上下文,數據庫名字,CursorFactory對象,版本號;
        //當需要更新數據庫版本時可以+1
        dbHelper = new MyDatabaseHelper(this , "BookStore.db" , null ,1);
        db = dbHelper.getWritableDatabase();
    }


    /**
     * 創建數據庫表
     * @param view
     */
    @OnClick(R.id.create_database)
    public void CreateDatabase(View view){

        //創建或打開一個現有的數據庫
        //getReadableDatabase():當磁盤空間滿時,將以只讀方式去打開
        //getWritableDatabase():當磁盤已滿時,拋出異常
        dbHelper.getWritableDatabase();
    }


    /**
     * 增加數據:public long insert(String table, String nullColumnHack, ContentValues values)
     * table:表名
     * nullColunmHack:用於在未指定添加數據時,給某些空列自動賦值null
     * values:ContentValues對象,添加相應數據
     * @param view
     */
    @OnClick(R.id.add)
    public void addDate(View view){

        ContentValues values = new ContentValues();
        //
        values.put("name" , "第一行代碼");
        values.put("author" , "郭霖");
        values.put("pages" , 570);
        values.put("price" , 79.00);

        db.insert("Book" , null , values);
        values.clear();

        //
        values.put("name" , "編譯原理");
        values.put("author" ,"MouMou");
        values.put("pages" , 500);
        values.put("price" , 66.00);
        db.insert("Book" , null , values);
    }


    /**
     * 更新數據:4個參數
     * 假如突然打折,更新某個商品價格
     * public int update(String table, ContentValues values, String whereClause, String[] whereArgs)
     * whereClause:約束某些行
     * whereArgs:約束某些行的更新數據
     * @param view
     */
    @OnClick(R.id.update)
    public void updateData(View view){

        ContentValues values = new ContentValues();
        values.put("price" , 58.99);
        db.update("Book" , values , "name = ?",new String[]{"編譯原理"});

    }

    /**
     * 刪除數據:4個參數
     * public int delete(String table, String whereClause, String[] whereArgs)
     * 與update類似
     * @param view
     */
    @OnClick(R.id.delete)
    public void deleteData(View view){

        db.delete("Book" , "price < ?" ,new  String[]{"60"});
    }


    /**
     * 查詢數據:7個參數
     *     public Cursor query(String table, String[] columns, String selection,
     * String[] selectionArgs, String groupBy, String having,
     * String orderBy)
     * table--查詢的表名,columns--指定要查詢的列名(select column1,column2...)
     * selection ---- 指定where的約束條件(where column = value)
     * selectionArgs---爲where中的佔位符提供具體值
     * groupBy  --- 指定需要group by 的列(group by column)
     * having -- 對group by後的結果進行約束(having column = value)
     * orderBy    指定查詢結果的排序方式(order by column1,column2,,,)
     * @param view
     */
    @OnClick(R.id.retrieve)
    public void retrieveData(View view){

        Cursor cursor = db.query("Book" , null ,null, null ,null , null ,null);
        if(cursor.moveToFirst()){
            do{
                String name = cursor.getString(cursor.getColumnIndex("name"));
                String author = cursor.getString(cursor.getColumnIndex("author"));
                int pages = cursor.getInt(cursor.getColumnIndex("pages"));
                double price = cursor.getDouble(cursor.getColumnIndex("price"));

                Log.d(TAG , "book name is " + name);
                Log.d(TAG , "book author is " + author);
                Log.d(TAG , "book pages is " + pages);
                Log.d(TAG , "book price is " + price);

            }while (cursor.moveToNext());

        }//if
        cursor.close();
    }
}


現在基本操作就這樣了,

記得自己去看SQLiteDatabase和SQLiteOpenHelper的源碼略....


LitePal:


這是github上的開源庫,穩定性強,操作簡單,效率高等等

運用:

(1)在build.gradle(app)添加依賴:

compile 'org.litepal.android:core:1.5.1'
(2)在app/src/main下新建一個路徑命名:assets,然後在該目錄下創建xml文件litepal.xml

內容如下:

<?xml version="1.0" encoding="utf-8" ?>
<litepal>

<!--數據庫名字.db-->
<dbname value = "BookStore"/>

<!--數據庫版本,更新時改動版本-->
<version value = "1"/>

<!--這是自己新建的用於數據庫存放表數據類型-->
<list>
    <mapping class = "testsdcard.cai.maiyu.mdaima06_01.bean.Book"/>
</list>
</litepal>

無疑是指定數據庫名字,版本,還有一個後面你自己創建的數據表類型(可以先不添加)

(3)在manifest中去配置:

在<application   

android:name="org.litepal.LitePalApplication"
.....

>

......

</application>

若是用自己的application也一樣,記得在自己定義的application的onCreate方法中初始化:LitePal 。初始化(this);


(4)創建數據表類:繼承DataSupport

public class Book extends DataSupport{
    private int id;     //id
    private String name;    //書名
    private String author;  //作者
    private int pages;      //頁數
    private double price;   //價格
  //  private String press; //出版社

//    public String getPress() {
//        return press;
//    }
//
//    public void setPress(String press) {
//        this.press = press;
//    }

    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 String getAuthor() {
        return author;
    }

    public void setAuthor(String author) {
        this.author = author;
    }

    public int getPages() {
        return pages;
    }

    public void setPages(int pages) {
        this.pages = pages;
    }

    public double getPrice() {
        return price;
    }

    public void setPrice(double price) {
        this.price = price;
    }
}

(5)Activity中使用:

public class TestLitePalActivity extends AppCompatActivity {

    //創建數據庫
    @ViewInject(R.id.create_database)
    private Button mBtnCreate;

    //增加數據
    @ViewInject(R.id.add)
    private Button mBtnAdd;

    //更新數據
    @ViewInject(R.id.update)
    private Button mBtnUpdate;

    //刪除數據
    @ViewInject(R.id.delete)
    private Button mBtnDelete;

    //查詢數據
    @ViewInject(R.id.retrieve)
    private Button mBtnRetrieve;

    private static final String TAG = "TestLitePalActivity";

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_database);

        ViewUtils.inject(this);

    }

    //創建數據庫
    @OnClick(R.id.create_database)
    public void createDatabase(View view){


        //獲取數據庫
        LitePal.getDatabase();
    }

    /**
     * 添加數據
     * @param view
     */
    @OnClick(R.id.add)
    public void addData(View view){

        Book book = new Book();
        book.setName("大話數據結構");
        book.setAuthor("程傑");
        book.setPages(516);
        book.setPrice(43.00);
        //book.setPress("Unknow");//增加出版社
        book.save();
    }


    /**
     * 刪除數據
     * @param view
     */
    @OnClick(R.id.delete)
    public void deleteData(View view){

        DataSupport.deleteAll(Book.class , "price < ?" , "60");

    }

    /**
     * 更新數據
     * @param view
     */
    @OnClick(R.id.update)
    public void updateData(View view){

        Book book = new Book();
        book.setPrice(38.50);
        book.updateAll("name = ? and author = ?" , "大話數據結構" , "程傑");
//更新數據爲默認值
//        book.setToDefault("pages");
//        book.updateAll();
    }

    /**
     * 查詢數據
     * @param view
     */
    @OnClick(R.id.retrieve)
    public void retrieveData(View view){

        List<Book> books = DataSupport.findAll(Book.class);
        for(Book book : books){
            Log.d(TAG , "book name is " + book.getName());
            Log.d(TAG , "book author is " + book.getAuthor());
            Log.d(TAG , "book pages is " + book.getPages());
            Log.d(TAG , "book price is " + book.getPrice());

        }


        //(2)添加限制:select--選定哪幾列
        //where--約束條件,   order--結果排序 ,limit---結果的數量
        //offset---查詢結果的便宜了offset(1)代表查詢表中的從第2條開始
//        List<Book> books = DataSupport.select("name" , "author" ,"pages")
//                .where("pages > ?" , "600")
//                .order("pages")
//                .limit(10)
//                .offset(10)
//                .find(Book.class);
        //(3)用原生數據庫語句查詢
//        Cursor cursor = DataSupport.findBySQL("select * from Book where pages > ?" +
//                " and price < ?" ,"700" ,"60");

    }
}

從代碼中,對比SQLite,發現更簡單,更方便,是不是呢?

(1)創建,更新,刪除,增加,是不是更方便呢,

(2)而版本更新,只需要在litepal.xml中改版本號

(3)查詢,之前要7個參數,現在利用DataSupport.findXXX就可以了

(4)記得創建數據表類要繼承DataSupport類

(5)查詢還支持多種查詢,原生SQL語句查詢,

。。。最後去看一下源碼





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章