SQLite數據庫的簡單介紹

SQLite是android已經封裝好的數據庫,只需要簡單的代碼就可以實現增刪改查。用來做android簡易的數據庫非常方便,下面簡單的介紹下其實現:

首選需要創建數據庫,使用SQLiteOpenHelper來實現創建和更新版本

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

import com.linqinen.mho.bean.NormalMaterialPrice;

import java.util.List;
public class SQlite extends SQLiteOpenHelper {

    private final String TAG = "SQlite ";

    public static final String TABLE_NAME = "rank";
    public static int version = 1;

    List<NormalMaterialPrice> mListCache;

    public SQlite(Context context, String name, CursorFactory factory,
                  int version) {
        super(context, TABLE_NAME+".db"/*數據庫名*/, null/*factory 一般不用*/, version);
    }
    public SQlite(Context context,List<NormalMaterialPrice> mListCache){
        super(context, TABLE_NAME+".db", null/*factory 一般不用*/, version);
        this.mListCache = mListCache;


    }

    //onCreate用來創建數據庫
    @Override
    public void onCreate(SQLiteDatabase db) {

        //當調用了getReadableDataBase或者getWritealbeDatabase函數就會創建數據庫
        db.execSQL("create table " + TABLE_NAME + "(_id integer primary key autoincrement , name text , num integer , price integer , isRefresh integer)");
        /**/
        //參數1.表名
                //參數2.指定是否可以爲空(儘量不要爲空)
                //參數3.要保存的數據
                //key是字段的名字,必須和建表時字段相同

        for (int i = 0; i < mListCache.size(); i++) {
            ContentValues contentValuses = new ContentValues();
            contentValuses.put("name", mListCache.get(i).getName());
            contentValuses.put("num", mListCache.get(i).getNum());
            contentValuses.put("price", mListCache.get(i).getPrice());
            contentValuses.put("isRefresh", mListCache.get(i).getIsRefresh());

            db.insert(SQlite.TABLE_NAME, "name", contentValuses);
        }

    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    }

}

之後創建一個自定義的類,實現增刪改查等方法

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

import com.linqinen.mho.bean.NormalMaterialPrice;

import java.util.ArrayList;
import java.util.List;


//數據庫的增刪改查
public class RankDBhelper{

    private final String TAG = "RankDBhelper";
    private List<NormalMaterialPrice> mListCache;

    private SQlite sqlite;
    private SQLiteDatabase dataBase;
    public RankDBhelper(Context context,List<NormalMaterialPrice> mListCache){
        this.mListCache = mListCache;
        if (sqlite == null) {
            sqlite = new SQlite(context,mListCache);
        }
        dataBase = sqlite.getWritableDatabase();
    }



    public void closeSQLiteDatabase(){
        if (dataBase.isOpen()) {
            dataBase.close();
        }
    }

    public Cursor cursorQuery(){
        String querySql = "select * from " + SQlite.TABLE_NAME;
        return dataBase.rawQuery(querySql, null);
    }

    public void onlyQueryAllData(){

        //cursor遊標(迭代器)方法的各個參數意義:1.表名 2.列名 3和4.需要查詢的條件                          5和6.其他條件   7排序的方式
        Cursor cursor = dataBase.query(SQlite.TABLE_NAME,null,null,null,null,null,null);
        while (cursor.moveToNext()) {
            NormalMaterialPrice mBean = new NormalMaterialPrice();
            mBean.setName(cursor.getString(cursor.getColumnIndex("name")));
            mBean.setNum(cursor.getString(cursor.getColumnIndex("num")));
            mBean.setPrice(cursor.getString(cursor.getColumnIndex("price")));
            mBean.setIsRefresh(cursor.getInt(cursor.getColumnIndex("isRefresh")));
            mListCache.add(mBean);
        }
//每次遊標cursor用完後都需要關閉,否則會報異常
        cursor.close();
    }

    //查詢並更新數據
    public void updateData(String oldName,String newName , String num , String price){
        ContentValues contentValues = new ContentValues();
        contentValues.put("name", newName);
        contentValues.put("num", num);
        contentValues.put("price", price);
        contentValues.put("isRefresh", 1);
        dataBase.update(SQlite.TABLE_NAME, contentValues, "name=?", new String[]{oldName});
    }

    /**刪除數據庫條目*/
    public void deleteData(String oldName){
        dataBase.delete(SQlite.TABLE_NAME,  "name=?", new String[]{oldName});
    }

    //清空數據庫存檔
    public void resetData(){
        dataBase.delete(SQlite.TABLE_NAME, null, null);
    }

    /**增加單條數據庫條目*/
    public void addData(String name , String num , String price){
        ContentValues contentValues = new ContentValues();
        contentValues.put("name", name);
        contentValues.put("num", num);
        contentValues.put("price", price);
        contentValues.put("isRefresh", 1);
        dataBase.insert(SQlite.TABLE_NAME, "name", contentValues);
    }

    /**增加所有數據庫條目*/
    public void addAllData(){
        for (int i = 0; i < mListCache.size(); i++) {
            ContentValues contentValues = new ContentValues();
            contentValues.put("name", mListCache.get(i).getName());
            contentValues.put("num", mListCache.get(i).getNum());
            contentValues.put("price", mListCache.get(i).getPrice());
            contentValues.put("isRefresh", mListCache.get(i).getIsRefresh());
            dataBase.insert(SQlite.TABLE_NAME, "name", contentValues);
        }
    }


}

到此數據庫搭建完成,下面看看如何使用:

import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.Toolbar;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.EditText;
import android.widget.Spinner;

import java.text.Collator;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Locale;

import butterknife.BindView;
import butterknife.ButterKnife;

public class MainActivity extends AppCompatActivity {

    @BindView(R.id.recyclerView)
    android.support.v7.widget.RecyclerView mRecyclerView;

    public RankDBhelper mDBhelper;
    private String name = "全部";
    private NormalMaterialPriceListAdapter mAdapter;
    public List<NormalMaterialPrice> mListCache = new ArrayList<>();
    private List<NormalMaterialPrice> mList = new ArrayList<>();

    private Context mContext;
    public static final int ADD_ITEM = 0, DELETE_ALL_DATA = 1, FILTRATE_BE_MODIFIED_DATA = 2;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ButterKnife.bind(this);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        mContext = this;
        initData();
    }

/**每次activity,onDestroy的時候,務必關閉數據庫,否則容易報異常*/
    @Override
    public void onDestroy() {
        super.onDestroy();
        mDBhelper.closeSQLiteDatabase();
    }

/**初始化數據庫*/
    private void initData() {

        mDBhelper = new RankDBhelper(mContext, mListCache);
        mDBhelper.onlyQueryAllData();
        if (mListCache.size() < 1) {
            addRecyclerViewData();
            mDBhelper.addAllData();
        }

        initFirstSpinner();
        initRecyclerView();
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.menu_normal_material_price, menu);

        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        setOnOptionsItemSelected(item.getItemId());
        return super.onOptionsItemSelected(item);
    }

    public void setOnOptionsItemSelected(int selecte) {
        if (mAdapter != null) {
            switch (selecte) {
                case R.id.addItem:
                    LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                    View view = inflater.inflate(R.layout.inflate_addsqlitedata_normal_material_price, null);
                    final EditText mEtName = (EditText) view.findViewById(R.id.et_name);
                    final EditText mEtNum = (EditText) view.findViewById(R.id.et_num);
                    final EditText mEtMinPrice = (EditText) view.findViewById(R.id.et_minPrice);
                    final EditText mEtMaxPrice = (EditText) view.findViewById(R.id.et_maxPrice);
                    new AlertDialog.Builder(mContext)
                            .setView(view)
                            .setPositiveButton("確定", new DialogInterface.OnClickListener() {
                                @Override
                                public void onClick(DialogInterface dialog, int which) {
                                    mDBhelper.addData(mEtName.getText().toString(), mEtNum.getText().toString(), mEtMinPrice.getText().toString() + "--" + mEtMaxPrice.getText().toString());
                                    mListCache.add(new NormalMaterialPrice(mEtName.getText().toString(),
                                            mEtNum.getText().toString(), mEtMinPrice.getText().toString() + "--" + mEtMaxPrice.getText().toString(),
                                            1
                                    ));
                                    mList.clear();
                                    mList.addAll(mListCache);
                                    mAdapter.notifyDataSetChanged();
                                }
                            })
                            .setNegativeButton("取消", null)
                            .show();
                    break;
                case R.id.deleteAllData:
                    new AlertDialog.Builder(mContext)
                            .setTitle("溫馨提示")
                            .setMessage("是否刪除所有數據庫信息")
                            .setPositiveButton("刪除", new DialogInterface.OnClickListener() {
                                @Override
                                public void onClick(DialogInterface dialog, int which) {
                                    mDBhelper.resetData();
                                    mList.clear();
                                    mListCache.clear();
                                    addRecyclerViewData();
                                    mList.addAll(mListCache);
                                    mAdapter.notifyDataSetChanged();
                                }
                            })
                            .setNegativeButton("取消", null)
                            .show();
                    break;
                case R.id.filtrateBeModifiedData:
                    mList.clear();
                    for (int i = 0; i < mListCache.size(); i++) {
                        if (mListCache.get(i).getIsRefresh() == 1) {
                            mList.add(mListCache.get(i));
                        }
                    }
                    mAdapter.notifyDataSetChanged();
                    break;

                default:
                    break;
            }
        }
    }

    private void initRecyclerView() {

        mRecyclerView.setLayoutManager(new LinearLayoutManager(mContext));
        mAdapter = new NormalMaterialPriceListAdapter(mContext, mList);
        mRecyclerView.setAdapter(mAdapter);
        mAdapter.setOnItemLongClickListener(new MyRecyclerViewAdapter.OnItemLongClickListener() {

            @Override
            public void onItemLongClick(View view2, int position) {
                LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                View view = inflater.inflate(R.layout.inflate_addsqlitedata_normal_material_price, null);
                final EditText mEtName = (EditText) view.findViewById(R.id.et_name);
                final EditText mEtNum = (EditText) view.findViewById(R.id.et_num);
                final EditText mEtMinPrice = (EditText) view.findViewById(R.id.et_minPrice);
                final EditText mEtMaxPrice = (EditText) view.findViewById(R.id.et_maxPrice);

                final NormalMaterialPrice mNormalMaterialPrice = mList.get(position);
                mEtName.setText(mNormalMaterialPrice.getName());
                mEtNum.setText(mNormalMaterialPrice.getNum());

                String price[] = mNormalMaterialPrice.getPrice().split("--");
                if (price.length > 0) {
                    mEtMinPrice.setText(price[0]);
                }
                if (price.length > 1) {
                    mEtMaxPrice.setText(price[1]);
                }

                new AlertDialog.Builder(mContext)
                        .setView(view)
                        .setPositiveButton("確定", new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialog, int which) {

                                mDBhelper.updateData(mNormalMaterialPrice.getName(), mEtName.getText().toString(), mEtNum.getText().toString(), mEtMinPrice.getText().toString() + "--" + mEtMaxPrice.getText().toString());
                                mList.clear();
                                mListCache.clear();
                                mDBhelper.onlyQueryAllData();

                                if (!name.equals("全部")) {
                                    reInitRecyclerViewNameData(name);
                                } else {
                                    mList.addAll(mListCache);
                                    mAdapter.notifyDataSetChanged();
                                }
//                                mAdapter.notifyItemChanged(position);
                            }
                        })
                        .setNeutralButton("刪除", new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialog, int which) {
                                mDBhelper.deleteData(mNormalMaterialPrice.getName());
                                mList.clear();
                                mListCache.clear();
                                mDBhelper.onlyQueryAllData();
                                mList.addAll(mListCache);
                                mAdapter.notifyDataSetChanged();
                            }
                        })
                        .setNegativeButton("取消", null)
                        .show();
            }
        });

    }


    private void initFirstSpinner() {
        Spinner spinner = (Spinner) findViewById(R.id.spinner_first);

        final List<String> list = new ArrayList<>();

        for (int i = 0; i < mListCache.size(); i++) {
            list.add(mListCache.get(i).getName());
        }

        /**java中的中文排序邏輯*/
        Collator coll = Collator.getInstance(Locale.CHINESE);
        Collections.sort(list, coll);

        list.add(0, "全部");

        //android.R.layout.simple_spinner_item爲系統默認樣式
        ArrayAdapter<String> adapter = new ArrayAdapter<>(mContext, android.R.layout.simple_spinner_item, list);

        adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        spinner.setAdapter(adapter);

        spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
            @Override
            public void onItemSelected(AdapterView<?> adapterView, View view, int position, long l) {
                name = list.get(position).substring(2);
                if (position == 0) {
                    mList.clear();
                    mList.addAll(mListCache);
                    mAdapter.notifyDataSetChanged();
                } else {
                    reInitRecyclerViewNameData(name);
                }
            }

            @Override
            public void onNothingSelected(AdapterView<?> adapterView) {

            }
        });
    }

    public void reInitRecyclerViewNameData(String name) {
        mList.clear();
        for (int i = 0; i < mListCache.size(); i++) {
            if (mListCache.get(i).getName().contains(name)) {
                mList.add(mListCache.get(i));
            }
        }
        mAdapter.notifyDataSetChanged();
    }


    private void addRecyclerViewData() {
        mListCache.add(new NormalMaterialPrice("土蜂幼蟲",
                "1", "98--198", 0
        ));
        mListCache.add(new NormalMaterialPrice("殺人蜂幼蟲",
                "1", "98--222", 0
        ));
        mListCache.add(new NormalMaterialPrice("山青蟲",
                "1", "99--133", 0
        ));
        mListCache.add(new NormalMaterialPrice("藍閃蝶",
                "1", "520--655", 0
        ));
    }

}

Demo下載地址https://github.com/linqinen708/SQLite.git

這個是之前看到的SQlite寫的非常詳細的文章,大家可以參考下,非常推薦 http://blog.csdn.net/codeeer/article/details/30237597/

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