源码这里很多逻辑都写在一起了,要使用其他逻辑需要屏蔽一些代码,代码比较简单,不做过多解释,有问题评论。
Activity代码
package com.uyac.andriodsqlite;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
private String TAG = "MainActivity";
private Context context;
private RecyclerView recyclerview;
private List<PersonModel> mList;
private RecyclerAdapter mAdapter;
private Button add, delete, modify, query,update;
private MySqliteHelper mySqliteHelper;
private Random mRandom;
//名字数组,用于添加数据时随机
private String nameArray[] = {"大一", "小二", "张三", "李四", "王五", "马六", "胡七", "王八", "金九", "银十", "天地", "玄黄", "宇宙", "洪荒", "嘻嘻", "欣欣向荣", "小明", "小红帽", "五天", "陈奕迅"};
private String addressArray[] = {"北京市东花市北里20号楼6单元501室",
"虹口区西康南路125弄34号201室 ",
"湖北省荆州市红苑大酒店 李有财 ",
"河南南阳市八一路272号特钢公司",
"广东中山市东区亨达花园7栋702",
"福建省厦门市莲花五村龙昌里34号601室",
"山东省青岛市开平路53号国棉四厂二宿舍1号楼2单元204户甲",
"河南省南阳市中州路42号",
"中国四川省江油市川西北矿区采气一队 ",
"北京市朝阳区霄云路50号",
"北京市西城区槐柏树街22号",
"广东省广州市越秀区中山六路",
"上海市浦东新区x606"};
private int ageArray[] = {464, 654, 564, 56, 456, 456, 4, 56131, 8, 1, 3, 556, 464, 611, 66, 5, 79, 9, 8, 79, 1, 100, 12, 15, 10000};
private int isBoyArray[] = {1, 1, 0, 1, 0, 10, 1, 1, 0, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1, 01, 0, 1, 0, 0, 0, 0,};
private int imgArray[] = {R.mipmap.ic_launcher, R.mipmap.pic_1, R.mipmap.pic_2, R.mipmap.pic_3, R.mipmap.pic_4, R.mipmap.pic_5, R.mipmap.pic_6, R.mipmap.pic_7, R.mipmap.pic_8, R.mipmap.pic_9, R.mipmap.pic_10, R.mipmap.pic_11, R.mipmap.pic_12, R.mipmap.pic_spc};
private byte picArray[][];
//用于更新的版本号
private int currentVersion;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
context = this;
viewInit();
dataInit();
eventInit();
}
private void viewInit() {
// TODO Auto-generated method stub
recyclerview = (RecyclerView) findViewById(R.id.recyclerview);
add = (Button) findViewById(R.id.add);
delete = (Button) findViewById(R.id.delete);
modify = (Button) findViewById(R.id.modify);
query = (Button) findViewById(R.id.query);
update = (Button) findViewById(R.id.update);
}
private void dataInit() {
// TODO Auto-generated method stub
mRandom = new Random();
mySqliteHelper = new MySqliteHelper(context, Constants.DB_NAME, null, Constants.DB_VERSION);
currentVersion = Constants.DB_VERSION;
mList = new ArrayList<>();
mAdapter = new RecyclerAdapter(context, mList);
recyclerview.setAdapter(mAdapter);
recyclerview.setLayoutManager(new LinearLayoutManager(context, LinearLayoutManager.VERTICAL, false));
//加载图片
loadImg();
}
private void eventInit() {
// TODO Auto-generated method stub
add.setOnClickListener(this);
delete.setOnClickListener(this);
modify.setOnClickListener(this);
query.setOnClickListener(this);
update.setOnClickListener(this);
}
@Override
protected void onResume() {
super.onResume();
mList.clear();
mList.addAll(mySqliteHelper.queryAllPersonData());
Log.e(TAG, "" + mList.size());
mAdapter.notifyDataSetChanged();
}
private void loadImg() {
picArray = new byte[imgArray.length][];
for (int i = 0; i < imgArray.length; i++) {
picArray[i] = picTobyte(imgArray[i]);
}
}
/**
* @param resourceID 图片资源id
* @return 将图片转化成byte
*/
private byte[] picTobyte(int resourceID)
{
ByteArrayOutputStream baos = new ByteArrayOutputStream();
InputStream is = context.getResources().openRawResource(resourceID);
Bitmap bitmap = BitmapFactory.decodeStream(is);
//压缩图片,100代表不压缩(0~100)
bitmap.compress(Bitmap.CompressFormat.PNG, 100, baos);
return baos.toByteArray();
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.add:
addDataReturnID();
// addData();
// addDataSql();
break;
case R.id.delete:
if (mList == null || mList.size() == 0) {
ToastUtils.show(context, "请先添加数据");
return;
}
mySqliteHelper.deletePersonData(mList.get(0));
// mySqliteHelper.deletePersonDataSql(new PersonModel());
notifyData();
ToastUtils.show(context, "删除第一条数据成功");
break;
case R.id.modify:
if (mList == null || mList.size() == 0) {
ToastUtils.show(context, "请先添加数据");
return;
}
PersonModel model = getPersonModel();
model.setId(mList.get(0).getId());
mySqliteHelper.updatePersonData(model);
// mySqliteHelper.updatePersonDataSql(getPersonModel());
ToastUtils.show(context, "修改第一条数据成功");
notifyData();
break;
case R.id.query:
if (mList == null || mList.size() == 0) {
ToastUtils.show(context, "请先添加数据");
return;
}
mList.clear();
mList.addAll(mySqliteHelper.queryAllPersonDataOrderBy());
// mList.addAll(mySqliteHelper.rawQueryAllPersonData());
mAdapter.notifyDataSetChanged();
break;
case R.id.update:
//增加版本号来更新数据库
// mySqliteHelper = new MySqliteHelper(context, Constants.DB_NAME, null, ++currentVersion);
// Log.e(TAG, " currentVersion = "+currentVersion );
break;
}
}
/**
* 添加数据
*/
private void addData() {
PersonModel model = new PersonModel();
model.setAddress(addressArray[mRandom.nextInt(addressArray.length)]);
model.setName(nameArray[mRandom.nextInt(nameArray.length)]);
model.setAge(mRandom.nextInt(101));
model.setIsBoy(isBoyArray[mRandom.nextInt(isBoyArray.length)]);
model.setPic(picArray[mRandom.nextInt(picArray.length)]);
boolean isSucc = mySqliteHelper.addPersonData(model);
if (isSucc) {
ToastUtils.show(context, "添加数据成功");
mList.add(0, model);
mAdapter.notifyDataSetChanged();
} else {
ToastUtils.show(context, "添加失败");
}
}
/**
* 添加数据返回id
*/
private void addDataReturnID() {
PersonModel model = new PersonModel();
model.setAddress(addressArray[mRandom.nextInt(addressArray.length)]);
model.setName(nameArray[mRandom.nextInt(nameArray.length)]);
model.setAge(mRandom.nextInt(101));
model.setIsBoy(isBoyArray[mRandom.nextInt(isBoyArray.length)]);
model.setPic(picArray[mRandom.nextInt(picArray.length)]);
model = mySqliteHelper.addPersonDataReturnID(model);
if (model != null) {
ToastUtils.show(context, "添加数据成功");
mList.add(0, model);
mAdapter.notifyDataSetChanged();
} else {
ToastUtils.show(context, "添加失败");
}
}
/**
* 用sql语句添加数据
*/
private void addDataSql() {
PersonModel model = new PersonModel();
model.setAddress(addressArray[mRandom.nextInt(addressArray.length)]);
model.setName(nameArray[mRandom.nextInt(nameArray.length)]);
model.setAge(mRandom.nextInt(101));
model.setIsBoy(isBoyArray[mRandom.nextInt(isBoyArray.length)]);
model.setPic(picArray[mRandom.nextInt(picArray.length)]);
mySqliteHelper.addPersonDataSql(model);
mList.add(0, model);
mAdapter.notifyDataSetChanged();
}
/**
* @return 生成一个随机的PersonModel
*/
private PersonModel getPersonModel() {
PersonModel model = new PersonModel();
model.setAddress(addressArray[mRandom.nextInt(addressArray.length)]);
model.setName(nameArray[mRandom.nextInt(nameArray.length)]);
model.setAge(mRandom.nextInt(101));
model.setIsBoy(isBoyArray[mRandom.nextInt(isBoyArray.length)]);
model.setPic(picArray[mRandom.nextInt(picArray.length)]);
return model;
}
/**
* @param min
* @param max
* @return 随机几到几
*/
private int randomNum(int min, int max) {
if (min > max) {
int temp = min;
min = max;
max = temp;
}
//专为此类设计
max = max - 1;
int r = Math.abs(max - min) + 1;
return mRandom.nextInt(r) + min;
}
private void notifyData() {
mList.clear();
mList.addAll(mySqliteHelper.queryAllPersonData());
mAdapter.notifyDataSetChanged();
}
}
activity布局代码
<?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:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="com.uyac.andriodsqlite.MainActivity">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:autoLink="web"
android:text="增删改查 需要自己去调用特定的方法,在MySqliteHelper类里面,同时需要屏蔽其他操作方法\nhttps://github.com/zhuzhushang/AndriodSqlite"
/>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
>
<Button
android:id="@+id/add"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:layout_margin="5dp"
android:text="增"
/>
<Button
android:id="@+id/delete"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:layout_margin="5dp"
android:text="删"
/>
<Button
android:id="@+id/modify"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:layout_margin="5dp"
android:text="改"
/>
<Button
android:id="@+id/query"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:layout_margin="5dp"
android:text="查id↑↓"
/>
<Button
android:id="@+id/update"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:visibility="gone"
android:layout_margin="5dp"
android:text="更新"
/>
</LinearLayout>
<android.support.v7.widget.RecyclerView
android:id="@+id/recyclerview"
android:layout_width="match_parent"
android:layout_height="wrap_content" >
</android.support.v7.widget.RecyclerView>
</LinearLayout>
adapter代码
package com.uyac.andriodsqlite;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import java.util.List;
/**
* Created by ShaoQuanwei on 2017/2/14.
*/
public class RecyclerAdapter extends RecyclerView.Adapter<RecyclerAdapter.ViewHolder> {
private Context context;
private List<PersonModel> list;
public RecyclerAdapter(Context context, List<PersonModel> list) {
this.context = context;
this.list = list;
}
public void setList(List<PersonModel> list) {
this.list = list;
}
@Override
public RecyclerAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(context).inflate(R.layout.item_person, null);
RecyclerAdapter.ViewHolder viewHolder = new RecyclerAdapter.ViewHolder(view);
return viewHolder;
}
@Override
public void onBindViewHolder(RecyclerAdapter.ViewHolder holder, int position) {
PersonModel model = list.get(position);
holder.name.setText("名字:" + model.getName() + "(" + model.getId()+")");
holder.address.setText("地址:" + model.getAddress());
if (model.getIsBoy() == 1) {
holder.sex.setText("性别:男");
} else {
holder.sex.setText("性别:女");
}
holder.age.setText("年龄:" + model.getAge());
// ByteArrayInputStream bais = new ByteArrayInputStream(model.getPic(),0,model.getPic().length);
// holder.pic.setImageDrawable(Drawable.createFromStream(bais,"img"));
Bitmap b = BitmapFactory.decodeByteArray(model.getPic(), 0, model.getPic().length);
holder.pic.setImageBitmap(b);
}
@Override
public int getItemCount() {
return list != null ? list.size() : 0;
}
public class ViewHolder extends RecyclerView.ViewHolder {
private ImageView pic;
private TextView name;
private TextView sex;
private TextView age;
private TextView address;
public ViewHolder(View itemView) {
super(itemView);
pic = (ImageView) itemView.findViewById(R.id.pic);
name = (TextView) itemView.findViewById(R.id.name);
sex = (TextView) itemView.findViewById(R.id.sex);
age = (TextView) itemView.findViewById(R.id.age);
address = (TextView) itemView.findViewById(R.id.address);
}
}
}
数据库代码
package com.uyac.andriodsqlite;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;
import java.util.ArrayList;
import java.util.List;
/**
* Created by ShaoQuanwei on 2017/2/15.
*/
public class MySqliteHelper extends SQLiteOpenHelper {
private String TAG = "MySqliteHelper";
/*表名*/
private final String TABLE_NAME_PERSON = "person";
/*id字段*/
private final String VALUE_ID = "_id";
private final String VALUE_NAME = "name";
private final String VALUE_ISBOY = "isboy";
private final String VALUE_AGE = "age";
private final String VALUE_ADDRESS = "address";
/*头像字段*/
private final String VALUE_PIC = "pic";
/*创建表语句 语句对大小写不敏感 create table 表名(字段名 类型,字段名 类型,…)*/
private final String CREATE_PERSON = "create table " + TABLE_NAME_PERSON + "(" +
VALUE_ID + " integer primary key," +
VALUE_NAME + " text ," +
VALUE_ISBOY + " integer," +
VALUE_AGE + " ingeter," +
VALUE_ADDRESS + " text," +
VALUE_PIC + " blob" +
")";
public MySqliteHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
super(context, name, factory, version);
Log.e(TAG, "-------> MySqliteHelper");
}
@Override
public void onCreate(SQLiteDatabase db) {
//创建表
db.execSQL(CREATE_PERSON);
Log.e(TAG, "-------> onCreate");
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
Log.e(TAG, "-------> onUpgrade");
}
/**
* @param model 数据模型
* @return 返回添加数据有木有成功
*/
public boolean addPersonData(PersonModel model) {
//把数据添加到ContentValues
ContentValues values = new ContentValues();
values.put(VALUE_NAME, model.getName());
values.put(VALUE_AGE, model.getAge());
values.put(VALUE_ISBOY, model.getIsBoy());
values.put(VALUE_ADDRESS, model.getAddress());
values.put(VALUE_PIC, model.getPic());
//添加数据到数据库
long index = getWritableDatabase().insert(TABLE_NAME_PERSON, null, values);
//大于0表示添加成功
if (index > 0) {
return true;
} else {
return false;
}
}
/**
* 添加数据
* @param model 数据模型
* @return 返回添加数据有木有成功
*/
public PersonModel addPersonDataReturnID(PersonModel model) {
//把数据添加到ContentValues
ContentValues values = new ContentValues();
values.put(VALUE_NAME, model.getName());
values.put(VALUE_AGE, model.getAge());
values.put(VALUE_ISBOY, model.getIsBoy());
values.put(VALUE_ADDRESS, model.getAddress());
//这里存储图片,model.getPic() 是一个字节数组
values.put(VALUE_PIC, model.getPic());
//添加数据到数据库
long index = getWritableDatabase().insert(TABLE_NAME_PERSON, null, values);
//不等于-1表示添加成功(可以看insert源码)
// public long insert(String table, String nullColumnHack, ContentValues values) {
// try {
// return insertWithOnConflict(table, nullColumnHack, values, CONFLICT_NONE);
// } catch (SQLException e) {
// Log.e(TAG, "Error inserting " + values, e);
// return -1;
// }
// }
if (index != -1) {
model.setId(index);
return model;
} else {
return null;
}
}
/**
* sql语句添加数据,比较麻烦
*/
public void addPersonDataSql(PersonModel model) {
//格式: insert into 表名 (字段名,字段名,…)value('字段值','字段值','…')
//看着很多,其实就是这个 insert into person (name,age,isboy,address,pic) values('五天','3','0','上海市浦东新区x606','[B@5340395')
String insertSql = "insert into " + TABLE_NAME_PERSON + " (" +
VALUE_NAME + "," +
VALUE_AGE + "," +
VALUE_ISBOY + "," +
VALUE_ADDRESS + "," +
VALUE_PIC + ")" +
" values" + "(" +
"'" + model.getName() + "'," +
"'" + model.getAge() + "'," +
"'" + model.getIsBoy() + "'," +
"'" + model.getAddress() + "'," +
"'" + model.getPic() + "'" +
")";
Log.e(TAG, "" + insertSql);
getWritableDatabase().execSQL(insertSql);
}
/**
* 方法删除数据库数据
*/
public void deletePersonData(PersonModel model) {
//where后跟条件表达式 =,!=,>,<,>=,<=
//多条件 and or
//删除数据库里的model数据 因为_id具有唯一性。
getWritableDatabase().delete(TABLE_NAME_PERSON, VALUE_ID + "=?", new String[]{"" + model.getId()});
/*//删除数据库里 _id = 1 的数据
getWritableDatabase().delete(TABLE_NAME_PERSON,VALUE_ID+"=?",new String[]{"1"});
//删除 age >= 18 的数据
getWritableDatabase().delete(TABLE_NAME_PERSON,VALUE_AGE+">=?",new String[]{"18"});
//删除 id > 5 && age <= 18 的数据
getWritableDatabase().delete(TABLE_NAME_PERSON,VALUE_ID+">?"+" and "+VALUE_AGE +"<=?",new String[]{"5","18"});
//删除 id > 5 || age <= 18 的数据
getWritableDatabase().delete(TABLE_NAME_PERSON,VALUE_ID+">?"+" or "+VALUE_AGE +"<=?",new String[]{"5","18"});
//删除数据库里 _id != 1 的数据
getWritableDatabase().delete(TABLE_NAME_PERSON,VALUE_ID+"!=?",new String[]{"1"});
//删除所有 _id >= 7 的男生
getWritableDatabase().delete(TABLE_NAME_PERSON,VALUE_ISBOY+"=?"+" and "+VALUE_ID+">=?",new String[]{"1","7"});
//删除所有 _id >= 7 和 _id = 3 的数据
getWritableDatabase().delete(TABLE_NAME_PERSON,VALUE_ID+">=?"+" or "+VALUE_ID+"=?",new String[]{"7","3"});*/
}
/**
* sql删除数据库数据
*/
public void deletePersonDataSql(PersonModel model) {
//条件表达式 =,!=,>,<,>=,<=
//语法格式 delete from 表名 where 字段 条件表达式 '值'
//语法示例 delete from person where _id='2'
//多条件 delete from person where _id>'10' and age>'100'
//多条件 delete from person where _id>'10' or _id<'5'
//删除数据库里的model数据 因为_id具有唯一性。
String sql1 = "delete from " + TABLE_NAME_PERSON + " where " +
VALUE_ID + "=" + "'" + model.getId() + "'";
//删除数据库里 _id = 1 的数据
String sql2 = "delete from " + TABLE_NAME_PERSON + " where " +
VALUE_ID + "=" + "'" + 1 + "'";
//删除 age >= 18 的数据
String sql3 = "delete from " + TABLE_NAME_PERSON + " where " +
VALUE_AGE + ">=" + "'" + 18 + "'";
//删除 id > 5 && age <= 18 的数据
String sql4 = "delete from " + TABLE_NAME_PERSON + " where " +
VALUE_ID + ">" + "'" + 5 + "'" + " and " +
VALUE_AGE + "<=" + "'" + 18 + "'";
////删除 id > 5 || age <= 18 的数据
String sql5 = "delete from " + TABLE_NAME_PERSON + " where " +
VALUE_ID + ">" + "'" + 5 + "'" + " or " +
VALUE_AGE + "<=" + "'" + 18 + "'";
//删除数据库里 _id != 1 的数据
String sql6 = "delete from " + TABLE_NAME_PERSON + " where " +
VALUE_ID + "!=" + "'" + 1 + "'";
//删除所有 _id >= 7 的男生
String sql7 = "delete from " + TABLE_NAME_PERSON + " where " +
VALUE_ID + ">=" + "'" + 7 + "'" + " and " +
VALUE_ISBOY + "=" + "'" + 1 + "'";
//删除所有 _id >= 7 和 _id = 3 的数据
String sql8 = "delete from " + TABLE_NAME_PERSON + " where " +
VALUE_ID + ">=" + "'" + 7 + "'" + " and " +
VALUE_ID + "=" + "'" + 3 + "'";
Log.e(TAG, "" + sql7);
getWritableDatabase().execSQL(sql7);
}
/**
* 方法修改数据库数据
*/
public void updatePersonData(PersonModel model) {
//条件表达式 =,!=,>,<,>=,<=
//多条件 and or and和or都可以无限连接
//多条件示例 _id>=? and _id<=?
//多条件示例 _id>=? or _id=? or _id=?
//将数据添加至ContentValues
ContentValues values = new ContentValues();
values.put(VALUE_NAME, model.getName());
values.put(VALUE_ADDRESS, model.getAddress());
values.put(VALUE_ISBOY, model.getIsBoy());
values.put(VALUE_AGE, model.getAge());
values.put(VALUE_PIC, model.getPic());
//修改model的数据
getWritableDatabase().update(TABLE_NAME_PERSON, values, VALUE_ID + "=?", new String[]{"" + model.getId()});
/*//将 _id>20 的数据全部修改成model 适合重置数据
getWritableDatabase().update(TABLE_NAME_PERSON,values,VALUE_ID+">?",new String[]{"20"});
//将 _id>=30 && _id<=40 的数据全部修改成model 适合重置数据
getWritableDatabase().update(TABLE_NAME_PERSON,values,VALUE_ID+">=? and "+VALUE_ID+"<=?",new String[]{"30","40"});
//将 _id>=40 || _id=30 || _id=20的 age 修改成18 (需先将model的数据修成成18) 这里and 和 or 的效果时一样的 因为_id是唯一的
int count = getWritableDatabase().update(TABLE_NAME_PERSON,values,VALUE_ID+">=?"+" or "+VALUE_ID+"=?"+" or "+VALUE_ID+"=?",new String[]{"40","30","20"});*/
// count 返回被修改的条数 >0 表示修改成功
Log.e(TAG, "" + VALUE_ID + ">=? and " + VALUE_ID + "<=?");
Log.e(TAG, "" + VALUE_ID + ">=?" + " or " + VALUE_ID + "=?" + " or " + VALUE_ID + "=?");
}
/**
* sql修改数据库数据
*/
public void updatePersonDataSql(PersonModel model) {
//条件表达式 =,!=,>,<,>=,<=
//多条件 and or and和or都可以无限连接
//修改格式 update 表名 set 字段='字段值', 字段='字段值',… where 字段='字段值'
//多条件示例 update person set name='钢铁侠',isboy='1' where _id='2'
//多条件示例 update person set name='天地',isboy='1',age='79',address='山东省青岛市开平路53号国棉四厂二宿舍1号楼2单元204户甲',pic='[B@266d768b' where _id>='30' and _id<='40'
//多条件示例 update person set name='小二',isboy='1',age='18',address='河南南阳市八一路272号特钢公司',pic='[B@17560c26' where _id>='40' or _id='30' or _id='20'
//修改model的数据
String update1 = "update " + TABLE_NAME_PERSON + " set " +
VALUE_NAME + "=" + "'" + model.getName() + "'," +
VALUE_ISBOY + "=" + "'" + model.getIsBoy() + "'," +
VALUE_AGE + "=" + "'" + model.getAge() + "'," +
VALUE_ADDRESS + "=" + "'" + model.getAddress() + "'," +
VALUE_PIC + "=" + "'" + model.getPic() + "'" + " where " +
VALUE_ID + "=" + "'" + model.getId() + "'";
//将 _id>20 的数据全部修改成model 适合重置数据
String update2 = "update " + TABLE_NAME_PERSON + " set " +
VALUE_NAME + "=" + "'" + model.getName() + "'," +
VALUE_ISBOY + "=" + "'" + model.getIsBoy() + "'," +
VALUE_AGE + "=" + "'" + model.getAge() + "'," +
VALUE_ADDRESS + "=" + "'" + model.getAddress() + "'," +
VALUE_PIC + "=" + "'" + model.getPic() + "'" + " where " +
VALUE_ID + ">=" + "'" + "20" + "'";
//将 _id>=30 && _id<=40 的数据全部修改成model 适合重置数据
String update3 = "update " + TABLE_NAME_PERSON + " set " +
VALUE_NAME + "=" + "'" + model.getName() + "'," +
VALUE_ISBOY + "=" + "'" + model.getIsBoy() + "'," +
VALUE_AGE + "=" + "'" + model.getAge() + "'," +
VALUE_ADDRESS + "=" + "'" + model.getAddress() + "'," +
VALUE_PIC + "=" + "'" + model.getPic() + "'" + " where " +
VALUE_ID + ">=" + "'" + "30" + "'" + " and " +
VALUE_ID + "<=" + "'" + "40" + "'";
//将 _id>=40 || _id=30 || _id=20的 age 修改成18 (需先将model的数据修成成18) 这里and 和 or 的效果时一样的 因为_id是唯一的
String update4 = "update " + TABLE_NAME_PERSON + " set " +
VALUE_NAME + "=" + "'" + model.getName() + "'," +
VALUE_ISBOY + "=" + "'" + model.getIsBoy() + "'," +
VALUE_AGE + "=" + "'" + "18" + "'," +
VALUE_ADDRESS + "=" + "'" + model.getAddress() + "'," +
VALUE_PIC + "=" + "'" + model.getPic() + "'" + " where " +
VALUE_ID + ">=" + "'" + "40" + "'" + " or " +
VALUE_ID + "=" + "'" + "30" + "'" + " or " +
VALUE_ID + "=" + "'" + "20" + "'";
//其实前面set语句都一样,后面的where 不一样
Log.e(TAG, "" + update1);
Log.e(TAG, "" + update4);
;
getWritableDatabase().execSQL(update4);
}
private boolean order_by;
/**
* 查询全部数据
*/
public List<PersonModel> queryAllPersonData() {
//查询全部数据
Cursor cursor = getWritableDatabase().query(TABLE_NAME_PERSON, null, null, null, null, null, null, null);
List<PersonModel> list = new ArrayList<>();
if (cursor.getCount() > 0) {
//移动到首位
cursor.moveToFirst();
for (int i = 0; i < cursor.getCount(); i++) {
int id = cursor.getInt(cursor.getColumnIndex(VALUE_ID));
String name = cursor.getString(cursor.getColumnIndex(VALUE_NAME));
int isBoy = cursor.getInt(cursor.getColumnIndex(VALUE_ISBOY));
int age = cursor.getInt(cursor.getColumnIndex(VALUE_AGE));
String address = cursor.getString(cursor.getColumnIndex(VALUE_ADDRESS));
byte pic[] = cursor.getBlob(cursor.getColumnIndex(VALUE_PIC));
PersonModel model = new PersonModel();
model.setId(id);
model.setName(name);
model.setIsBoy(isBoy);
model.setAge(age);
model.setAddress(address);
model.setPic(pic);
list.add(model);
//移动到下一位
cursor.moveToNext();
}
}
cursor.close();
getWritableDatabase().close();
return list;
}
/**
* 查询全部数据,按id降序或者升序排列。
*/
public List<PersonModel> queryAllPersonDataOrderBy() {
order_by = !order_by;
//查询全部数据
Cursor cursor = getWritableDatabase().query(TABLE_NAME_PERSON, null, null, null, null, null, order_by ? VALUE_ID + " desc" : VALUE_ID + " asc", null);
List<PersonModel> list = new ArrayList<>();
if (cursor.getCount() > 0) {
//移动到首位
cursor.moveToFirst();
for (int i = 0; i < cursor.getCount(); i++) {
int id = cursor.getInt(cursor.getColumnIndex(VALUE_ID));
String name = cursor.getString(cursor.getColumnIndex(VALUE_NAME));
int isBoy = cursor.getInt(cursor.getColumnIndex(VALUE_ISBOY));
int age = cursor.getInt(cursor.getColumnIndex(VALUE_AGE));
String address = cursor.getString(cursor.getColumnIndex(VALUE_ADDRESS));
byte pic[] = cursor.getBlob(cursor.getColumnIndex(VALUE_PIC));
PersonModel model = new PersonModel();
model.setId(id);
model.setName(name);
model.setIsBoy(isBoy);
model.setAge(age);
model.setAddress(address);
model.setPic(pic);
list.add(model);
//移动到下一位
cursor.moveToNext();
}
}
cursor.close();
getWritableDatabase().close();
return list;
}
/**
* query()方法查询
* 一些查询用法
*/
public Cursor queryPersonData() {
Cursor cursor = null;
//查询全部数据
cursor = getWritableDatabase().query(TABLE_NAME_PERSON, null, null, null, null, null, null);
//查询 _id = 1 的数据
cursor = getWritableDatabase().query(TABLE_NAME_PERSON, null, VALUE_ID + "=?", new String[]{"1"}, null, null, null);
//查询 name = 张三 并且 age > 23 的数据
cursor = getWritableDatabase().query(TABLE_NAME_PERSON, null, VALUE_NAME + "=?" + " and " + VALUE_AGE + ">?", new String[]{"张三", "23"}, null, null, null);
//查询 name = 张三 并且 age > 23 的数据 并按照id 降序排列
cursor = getWritableDatabase().query(TABLE_NAME_PERSON, null, VALUE_NAME + "=?" + " and " + VALUE_AGE + ">?", new String[]{"张三", "23"}, null, null, VALUE_ID + " desc");
//查询数据按_id降序排列 并且只取前4条。
cursor = getWritableDatabase().query(TABLE_NAME_PERSON, null, null, null, null, null, VALUE_ID + " desc", "0,4");
return cursor;
}
/**
* rawQuery()方法查询
*
* 一些查询用法
*
* 容易出错,万千注意。
*
* 注意空格、单引号、单词不要写错了。
*
*/
public Cursor rawQueryPersonData() {
Cursor cursor = null;
String rawQuerySql = null;
//查询全部数据
rawQuerySql = "select * from "+TABLE_NAME_PERSON;
//查询_id = 1 的数据 select * from person where _id = 1
rawQuerySql = "select * from "+TABLE_NAME_PERSON+" where "+VALUE_ID +" = 1";
//查询 name = 张三 并且 age > 23 的数据 通配符? select * from person where name = ? and age > ?
rawQuerySql = "select * from "+TABLE_NAME_PERSON+" where "+VALUE_NAME +" = ?"+" and "+ VALUE_AGE +" > ?";
// cursor = getWritableDatabase().rawQuery(rawQuerySql,new String[]{"张三","23"});
//查询 name = 张三 并且 age >= 23 的数据 select * from person where name = '张三' and age >= '23'
rawQuerySql = "select * from "+TABLE_NAME_PERSON+" where "+VALUE_NAME +" = '张三'"+" and "+ VALUE_AGE +" >= '23'";
//查询 name = 张三 并且 age >= 23 的数据 并按照id 降序排列 select * from person where name = '张三' and age >= '23' order by _id desc
rawQuerySql = "select * from "+TABLE_NAME_PERSON+" where "+VALUE_NAME +" = '张三'"+" and "+ VALUE_AGE +" >= '23'"+" order by "+VALUE_ID +" desc";
//查询数据按_id降序排列 并且只取前4条。(测试下标是从0开始) select * from person order by _id desc limit 0, 4
rawQuerySql = "select * from "+TABLE_NAME_PERSON+" order by "+VALUE_ID +" desc"+" limit 0, 4";
//查询年龄在20岁以上或者是女生 的数据 select age,isboy from person where age > 20 or isboy != 1
rawQuerySql = "select "+VALUE_AGE+","+VALUE_ISBOY +" from " +TABLE_NAME_PERSON+" where "+VALUE_AGE+" > 20"+" or "+VALUE_ISBOY +" != 1";
//查询年龄小于等于20 或者 大于等于 80的数据 并且按年龄升序排列 select * from person where age <= 20 or age >=80 order by age asc
rawQuerySql = "select * from "+TABLE_NAME_PERSON+" where "+VALUE_AGE+" <= 20"+" or "+VALUE_AGE+" >=80"+" order by "+VALUE_AGE+" asc";
cursor = getWritableDatabase().rawQuery(rawQuerySql,null);
Log.e(TAG, rawQuerySql );
return cursor;
}
/**
* 查询全部数据
*/
public List<PersonModel> rawQueryAllPersonData() {
//查询全部数据
Cursor cursor = rawQueryPersonData();
List<PersonModel> list = new ArrayList<>();
if (cursor != null && cursor.getCount() > 0) {
//移动到首位
cursor.moveToFirst();
for (int i = 0; i < cursor.getCount(); i++) {
int id = cursor.getInt(cursor.getColumnIndex(VALUE_ID));
String name = cursor.getString(cursor.getColumnIndex(VALUE_NAME));
int isBoy = cursor.getInt(cursor.getColumnIndex(VALUE_ISBOY));
int age = cursor.getInt(cursor.getColumnIndex(VALUE_AGE));
String address = cursor.getString(cursor.getColumnIndex(VALUE_ADDRESS));
byte pic[] = cursor.getBlob(cursor.getColumnIndex(VALUE_PIC));
PersonModel model = new PersonModel();
model.setId(id);
model.setName(name);
model.setIsBoy(isBoy);
model.setAge(age);
model.setAddress(address);
model.setPic(pic);
list.add(model);
//移动到下一位
cursor.moveToNext();
}
}
cursor.close();
getWritableDatabase().close();
return list;
}
}
model代码
package com.uyac.andriodsqlite;
/**
* Created by ShaoQuanwei on 2017/2/14.
*/
public class PersonModel {
private long id;
private String name;
/*1代表是男孩*/
private int isBoy;
private int age;
private String address;
private byte[] pic;
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public int getIsBoy() {
return isBoy;
}
public void setIsBoy(int isBoy) {
this.isBoy = isBoy;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public byte[] getPic() {
return pic;
}
public void setPic(byte[] pic) {
this.pic = pic;
}
}
item代码
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:padding="8dp">
<ImageView
android:id="@+id/pic"
android:layout_width="64dp"
android:layout_height="64dp"
android:src="@mipmap/ic_launcher"
/>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="8dp"
android:orientation="vertical"
>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
>
<TextView
android:id="@+id/name"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="张三"
/>
<TextView
android:id="@+id/sex"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="性别:男"
/>
</LinearLayout>
<TextView
android:id="@+id/age"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="8dp"
android:text="年龄:17"
/>
<TextView
android:id="@+id/address"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="8dp"
android:text="深圳市南山区深南大道10000号"
/>
</LinearLayout>
</LinearLayout>
<View
android:layout_width="match_parent"
android:layout_height="0.6dp"
android:background="@color/colorAccent"
/>
</LinearLayout>
目录结构