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/