Android储存---SQLite数据库的简单使用,实现增删改查
demo效果增加数据:删除数据 修改数据SQLite介绍SQLite,是一款轻型的数据库,是遵守ACID的关系型数据库管理系统,它包含在一个相对小的C库中。它是D.RichardHipp建立的公有领域项目。它的设计目标是嵌入式的,而且目前已经在很多嵌入式产品中使用了它,它占用资源非常的低,在嵌入式设备中,可能只需要几百K的内存就够了。它能够支持Wi...
demo效果
增加数据:
删除数据 修改数据
SQLite介绍
SQLite,是一款轻型的数据库,是遵守ACID的关系型数据库管理系统,它包含在一个相对小的C库中。它是D.RichardHipp建立的公有领域项目。它的设计目标是嵌入式的,而且目前已经在很多嵌入式产品中使用了它,它占用资源非常的低,在嵌入式设备中,可能只需要几百K的内存就够了。它能够支持Windows/Linux/Unix等等主流的操作系统,同时能够跟很多程序语言相结合,比如 Tcl、C#、PHP、Java等,还有ODBC接口,同样比起Mysql、PostgreSQL这两款开源的世界著名数据库管理系统来讲,它的处理速度比他们都快。SQLite第一个Alpha版本诞生于2000年5月。 至2015年已经有15个年头,SQLite也迎来了一个版本 SQLite 3已经发布。
------(摘自百度百科)
SQLite数据类型
一般数据采用的固定的静态数据类型,而SQLite采用的是动态数据类型,会根据存入值自动判断。SQLite具有以下五种常用的数据类型:
NULL: 这个值为空值;
VARCHAR(n):长度不固定且其最大长度为 n 的字串,n不能超过 4000;
CHAR(n):长度固定为n的字串,n不能超过 254;
INTEGER: 值被标识为整数,依据值的大小可以依次被存储为1,2,3,4,5,6,7,8;
REAL: 所有值都是浮动的数值,被存储为8字节的IEEE浮动标记序号;
TEXT: 值为文本字符串,使用数据库编码存储(TUTF-8, UTF-16BE or UTF-16-LE);
BLOB: 值是BLOB数据块,以输入的数据格式进行存储。如何输入就如何存储,不改 变格式;
DATA :包含了 年份、月份、日期;
TIME: 包含了 小时、分钟、秒;
SQLite常用的方法
方法名称 | 方法表示含义 |
openOrCreateDatabase(String path,SQLiteDatabase.CursorFactory factory) 创建数据库 | 打开或创建数据库 |
insert(String table,String nullColumnHack,ContentValues values)插入数据 | 插入一条记录 |
delete(String table,String whereClause,String[] whereArgs)删除数据 | 删除一条记录 |
query(String table,String[] columns,String selection,String[] selectionArgs,String groupBy,String having,String orderBy) 查找数据 | 查询一条记录 |
update(String table,ContentValues values,String whereClause,String[] whereArgs) 更新数据 | 修改记录 |
execSQL(String sql) | 执行一条SQL语句 |
close() 关闭数据 |
insert插入数据
insert(String table,String nullColumnHack,ContentValues values)
传入的参数:1,表名,2,空列的默认值,3,ContentValues,类似于hashMap,是一种储存的机制,用法为:
/**
* 创建一个用来插入数据的方法
*
* @param name 姓名
* @param sex 性别
* @param age 年龄
* @param hobby 爱好
*/
public void insert(String name, String sex, String age, String hobby) {
//让数据库可写
SQLiteDatabase database = getWritableDatabase();
/*
类似于HashMap 都有键值对
key 对应的列表中的某一列的名称,字段
value 对应字段要插入的值
*/
ContentValues values = new ContentValues();
values.put("name", name);
values.put("sex", sex);
values.put("age", age);
values.put("hobby", hobby);
//插入
database.insert(TABLE_NAME, null, values);
//插入完成后关闭,以免造成内存泄漏
database.close();
}
delete删除数据
delete(String table,String whereClause,String[] whereArgs)
传入的参数:参数1, 表名称 参数2 , 删除条件参数3 , 删除条件值数组,用法为:
/**
* 创建一个删除数据的方法,传入的参数越多,删除时越精确的找到要删除的哪一行
*
* @param name
* @param sex
* @param age
* @param hobby
*/
public void delete(int id, String name, String sex, String age, String hobby) {
SQLiteDatabase database = getWritableDatabase();
/*
删除的条件,当id = 传入的参数id时,sex = 传入的参数sex时,age = 传入的age,hobby = 传入的hobby时
当条件都满足时才删除这行数据,一个条件不满足就删除失败
*/
String where = "id=? and name = ? and sex = ? and age = ? and hobby = ?";
//删除条件的参数
String[] whereArgs = {id + "", name, sex, age, hobby};
database.delete(TABLE_NAME, where, whereArgs);
database.close();
}
/**
* 再创建一个删除一个删除的方法,条件只有一个
*/
public void delete(int id) {
SQLiteDatabase database = getWritableDatabase();
//当条件满足id = 传入的参数的时候,就删除那整行数据,有可能有好几行都满足这个条件,满足的全部都删除
String where = "id = ?";
String[] whereArgs = {id + ""};
database.delete(TABLE_NAME, where, whereArgs);
database.close();
}
updata修改数据
update(String table,ContentValues values,String whereClause, String[] whereArgs)方法
传入的参数:参数1 表名称 参数2 跟行列ContentValues类型的键值对Key-Value
参数3 更新条件(where字句) 参数4 更新条件数组
/**
* 创建一个修改数据的方法
* @param id 条件,修改id为"id"的那一行数据
* @param name
* @param sex
* @param age
* @param hobby
*/
public void updata(int id,String name, String sex, String age, String hobby) {
SQLiteDatabase database = getWritableDatabase();
// update(String table,ContentValues values,String whereClause, String[] whereArgs)
String where = "id = ?";
String[] whereArgs = {id+""};
ContentValues values = new ContentValues();
values.put("name", name);
values.put("sex", sex);
values.put("age", age);
values.put("hobby", hobby);
//参数1 表名称 参数2 跟行列ContentValues类型的键值对Key-Value
// 参数3 更新条件(where字句) 参数4 更新条件数组
database.update(TABLE_NAME, values,where, whereArgs);
database.close();
query查找数据
query(String table,String[] columns,String selection,String[] selectionArgs,String groupBy,String having,String orderBy,String limit)
传入参数:参数table:表名称 参数columns:列名称数组 参数selection:条件字句,相当于where 参数selectionArgs:条件字句,参数数组
参数groupBy:分组列 参数having:分组条件 参数orderBy:排序列 参数limit:分页查询限制
/**
* 创建一个查找数据库的方法
*
* public Cursor query(String table,String[] columns,String selection,String[] selectionArgs,String groupBy,String having,String orderBy,String limit);
各个参数的意义说明:
参数table:表名称
参数columns:列名称数组
参数selection:条件字句,相当于where
参数selectionArgs:条件字句,参数数组
参数groupBy:分组列
参数having:分组条件
参数orderBy:排序列
参数limit:分页查询限制
参数Cursor:返回值,相当于结果集ResultSet
Cursor是一个游标接口,提供了遍历查询结果的方法,如移动指针方法move(),获得列值方法getString()等.
*/
public Cursor query() {
//数据库可读
SQLiteDatabase database = getReadableDatabase();
//查找
Cursor query = database.query(TABLE_NAME, null, null, null, null, null, null);
return query;
}
循环遍历,拿到数据
/**
* 通过查找数据库,拿到里面的数据
*/
private List<Map<String, Object>> getData() {
list = new ArrayList<>();
Cursor query = MyDataBase.getInstances(MainActivity.this).query();
/*
游标cursor默认是在-1的位置,query.moveToFirst()将游标移动到第一行,如果不写这个就会报
Caused by: android.database.CursorIndexOutOfBoundsException: Index -1 requested, with a size of 12
这个问题坑爹,以后一定要注意
*/
if (query.moveToFirst()) {
do {
String name = query.getString(query.getColumnIndex("name"));
String sex = query.getString(query.getColumnIndex("sex"));
String age = query.getString(query.getColumnIndex("age"));
String hobby = query.getString(query.getColumnIndex("hobby"));
int id = query.getInt(query.getColumnIndex("id"));
Map<String, Object> map = new HashMap<>();
map.put("id", id);
map.put("name", name);
map.put("sex", sex);
map.put("age", age);
map.put("hobby", hobby);
list.add(map);
} while (query.moveToNext());
}
//关闭查询游标
query.close();
return list;
}
demo具体实现
操作数据库的类
package com.duanlian.databasedemo;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
/**
* Created by duanlian on 2016/9/13.
*/
public class MyDataBase extends SQLiteOpenHelper {
//数据库名字
public static final String DB_NAME = "Students.db";
//数据库版本
public static final int DB_VERSION = 1;
//表名
public static final String TABLE_NAME = "student";
public static MyDataBase myDataBase;
/**
* 单例模式返回数据库
*
* @param context 上下文
* @return 数据库对象
*/
public static MyDataBase getInstances(Context context) {
if (myDataBase == null) {
return new MyDataBase(context);
} else {
return myDataBase;
}
}
//上下文,数据库名字,数据库工厂,版本号
public MyDataBase(Context context) {
super(context, DB_NAME, null, DB_VERSION);
}
//此方法中创建表
@Override
public void onCreate(SQLiteDatabase sqLiteDatabase) {
//这个有个坑,create table"+" " + TABLE_NAME 中间一定要加空格,别问为什么,我也不知道,不加就语法错误,吐血
sqLiteDatabase.execSQL("create table" + " " + TABLE_NAME + "(id INTEGER PRIMARY KEY AUTOINCREMENT,name text,sex text,age text,hobby text);");
}
/**
* 用来更新数据库版本的
* onCreate方法只是在第一次安装app的时候会调用,之后的数据库要更改的话,必须使用数据库版本上升,或者卸载了重新安装
*
* @param sqLiteDatabase 数据库
* @param oldVersion 老的版本号
* @param newVersion 更新后的版本号
*/
@Override
public void onUpgrade(SQLiteDatabase sqLiteDatabase, int oldVersion, int newVersion) {
if (newVersion > oldVersion) {
//删除老表
sqLiteDatabase.execSQL("drop" + TABLE_NAME);
//重新创建表
onCreate(sqLiteDatabase);
}
}
/**
* 创建一个用来插入数据的方法
*
* @param name 姓名
* @param sex 性别
* @param age 年龄
* @param hobby 爱好
*/
public void insert(String name, String sex, String age, String hobby) {
//让数据库可写
SQLiteDatabase database = getWritableDatabase();
/*
类似于HashMap 都有键值对
key 对应的列表中的某一列的名称,字段
value 对应字段要插入的值
*/
ContentValues values = new ContentValues();
values.put("name", name);
values.put("sex", sex);
values.put("age", age);
values.put("hobby", hobby);
//插入
database.insert(TABLE_NAME, null, values);
//插入完成后关闭,以免造成内存泄漏
database.close();
}
/**
* 创建一个查找数据库的方法
*
* public Cursor query(String table,String[] columns,String selection,String[] selectionArgs,String groupBy,String having,String orderBy,String limit);
各个参数的意义说明:
参数table:表名称
参数columns:列名称数组
参数selection:条件字句,相当于where
参数selectionArgs:条件字句,参数数组
参数groupBy:分组列
参数having:分组条件
参数orderBy:排序列
参数limit:分页查询限制
参数Cursor:返回值,相当于结果集ResultSet
Cursor是一个游标接口,提供了遍历查询结果的方法,如移动指针方法move(),获得列值方法getString()等.
*/
public Cursor query() {
//数据库可读
SQLiteDatabase database = getReadableDatabase();
//查找
Cursor query = database.query(TABLE_NAME, null, null, null, null, null, null);
return query;
}
/**
* 创建一个删除数据的方法,传入的参数越多,删除时越精确的找到要删除的哪一行
*
* @param name
* @param sex
* @param age
* @param hobby
*/
public void delete(int id, String name, String sex, String age, String hobby) {
SQLiteDatabase database = getWritableDatabase();
/*
删除的条件,当id = 传入的参数id时,sex = 传入的参数sex时,age = 传入的age,hobby = 传入的hobby时
当条件都满足时才删除这行数据,一个条件不满足就删除失败
*/
String where = "id=? and name = ? and sex = ? and age = ? and hobby = ?";
//删除条件的参数
String[] whereArgs = {id + "", name, sex, age, hobby};
database.delete(TABLE_NAME, where, whereArgs);
database.close();
}
/**
* 再创建一个删除一个删除的方法,条件只有一个
*/
public void delete(int id) {
SQLiteDatabase database = getWritableDatabase();
//当条件满足id = 传入的参数的时候,就删除那整行数据,有可能有好几行都满足这个条件,满足的全部都删除
String where = "id = ?";
String[] whereArgs = {id + ""};
database.delete(TABLE_NAME, where, whereArgs);
database.close();
}
/**
* 创建一个修改数据的方法
* @param id 条件,修改id为"id"的那一行数据
* @param name
* @param sex
* @param age
* @param hobby
*/
public void updata(int id,String name, String sex, String age, String hobby) {
SQLiteDatabase database = getWritableDatabase();
// update(String table,ContentValues values,String whereClause, String[] whereArgs)
String where = "id = ?";
String[] whereArgs = {id+""};
ContentValues values = new ContentValues();
values.put("name", name);
values.put("sex", sex);
values.put("age", age);
values.put("hobby", hobby);
//参数1 表名称 参数2 跟行列ContentValues类型的键值对Key-Value
// 参数3 更新条件(where字句) 参数4 更新条件数组
database.update(TABLE_NAME, values,where, whereArgs);
database.close();
}
}
mainActivity里面的代码逻辑
package com.duanlian.databasedemo;
import android.content.DialogInterface;
import android.content.Intent;
import android.database.Cursor;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.AdapterView;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.Toast;
import com.duanlian.databasedemo.adapter.MyListViewAdapter;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class MainActivity extends AppCompatActivity {
private List<Map<String, Object>> list;
private MyListViewAdapter adapter;
private ListView mListView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
setListener();
}
private void initView() {
mListView = (ListView) findViewById(R.id.main_listview);
List<Map<String, Object>> data = getData();
adapter = new MyListViewAdapter(this, data);
mListView.setAdapter(adapter);
adapter.notifyDataSetChanged();
}
private void setListener() {
//点击跳转
findViewById(R.id.insert).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent(MainActivity.this, AddActivity.class);
startActivityForResult(intent, 0);
}
});
//ListView的监听事件
mListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
// private int id;
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int position, long l) {
// //删除是要拿到当前行的id值才能删除当前行,下面的操作都是点击某个item拿到对应item的id字段
// //拿到当前position的 item的所有数据
// //返回的数据格式为{name=段炼, age=25, sex=男, id=12, hobby=吃饭。睡觉}
// Object itemAtPosition = mListView.getItemAtPosition(position);
// Log.e("duanlian", itemAtPosition+"");
// //转换成String
// String s = itemAtPosition.toString();
// //如果字符串包含"id"字段
// if (s.contains("id")) {
// //拿到id字段是处于字符串第几个位置
// int a = s.indexOf("id");
// //"id"字段后面是"hobby"字段,拿到hobby字段的位置
// int b = s.indexOf("hobby");
// //切割字符串{name=段炼, age=25, sex=男, id=12, hobby=吃饭。睡觉}
// //从i开始+3个正好是id开始的地方,hobby-2正好是id结束的位置减去了一个h和一个逗号
// String substring = s.substring(a + 3, b-2);
// //得到id后转换成int类型
// id = Integer.parseInt(substring);
// }
// //将得到id传入到需要的方法中
// showMyDialog(id, position);
//得到对应item里面的id
Object id = list.get(position).get("id");
int i = Integer.parseInt(id.toString());
String name = list.get(position).get("name").toString();
String sex = list.get(position).get("sex").toString();
String age = list.get(position).get("age").toString();
String hobby = list.get(position).get("hobby").toString();
//将得到id传入到需要的方法中
showMyDialog(i, name, sex, age, hobby);
}
});
}
/**
* 点击显示对话框选择修改或者是删除
*/
private void showMyDialog(final int id, final String name, final String sex, final String age, final String hobby) {
final AlertDialog.Builder builder = new AlertDialog.Builder(this);
//设置一个标题
builder.setTitle("请选择");
//给dialog设置item
builder.setItems(new String[]{"修改", "删除"}, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int position) {
switch (position) {
case 0://修改
Intent intent = new Intent(MainActivity.this, CorrectActivity.class);
intent.putExtra("id", id);
intent.putExtra("name", name);
intent.putExtra("sex", sex);
intent.putExtra("age", age);
intent.putExtra("hobby", hobby);
startActivityForResult(intent,0);
break;
case 1://删除
MyDataBase.getInstances(MainActivity.this).delete(id);
//重新查询,然后显示
List<Map<String, Object>> data = getData();
adapter.refreshList(data);
Toast.makeText(MainActivity.this, "删除成功", Toast.LENGTH_SHORT).show();
break;
}
}
});
builder.show();
}
/**
* 通过查找数据库,拿到里面的数据
*/
private List<Map<String, Object>> getData() {
list = new ArrayList<>();
Cursor query = MyDataBase.getInstances(MainActivity.this).query();
/*
游标cursor默认是在-1的位置,query.moveToFirst()将游标移动到第一行,如果不写这个就会报
Caused by: android.database.CursorIndexOutOfBoundsException: Index -1 requested, with a size of 12
这个问题坑爹,以后一定要注意
*/
if (query.moveToFirst()) {
do {
String name = query.getString(query.getColumnIndex("name"));
String sex = query.getString(query.getColumnIndex("sex"));
String age = query.getString(query.getColumnIndex("age"));
String hobby = query.getString(query.getColumnIndex("hobby"));
int id = query.getInt(query.getColumnIndex("id"));
Map<String, Object> map = new HashMap<>();
map.put("id", id);
map.put("name", name);
map.put("sex", sex);
map.put("age", age);
map.put("hobby", hobby);
list.add(map);
} while (query.moveToNext());
}
//关闭查询游标
query.close();
return list;
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == 0) {
List<Map<String, Object>> data1 = getData();
// adapter = new MyListViewAdapter(this, data1);
// mListView.setAdapter(adapter);
adapter.refreshList(data1);
}
}
}
插入数据逻辑
package com.duanlian.databasedemo;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;
public class AddActivity extends AppCompatActivity {
private EditText edt_name;
private EditText edt_sex;
private EditText edt_age;
private EditText edt_hobby;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_add);
initView();
}
private void initView() {
edt_name = (EditText) findViewById(R.id.add_name);
edt_sex = (EditText) findViewById(R.id.add_sex);
edt_age = (EditText) findViewById(R.id.add_age);
edt_hobby = (EditText) findViewById(R.id.add_hobby);
}
public void add(View view){
//拿到输入的数据
String name = edt_name.getText().toString().trim();
String sex = edt_sex.getText().toString().trim();
String age = edt_age.getText().toString().trim();
String hobby = edt_hobby.getText().toString().trim();
//调用插入方法
MyDataBase.getInstances(AddActivity.this).insert(name,sex,age,hobby);
finish();
}
}
修改数据逻辑
package com.duanlian.databasedemo;
import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;
public class CorrectActivity extends AppCompatActivity {
private int id;
private String name;
private String sex;
private String age;
private String hobby;
private EditText edt_name;
private EditText edt_sex;
private EditText edt_age;
private EditText edt_hobby;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_correct);
id = getIntent().getIntExtra("id", 0);
name = getIntent().getStringExtra("name");
sex = getIntent().getStringExtra("sex");
age = getIntent().getStringExtra("age");
hobby = getIntent().getStringExtra("hobby");
initView();
}
private void initView() {
edt_name = (EditText) findViewById(R.id.correct_name);
edt_sex = (EditText) findViewById(R.id.correct_sex);
edt_age = (EditText) findViewById(R.id.correct_age);
edt_hobby = (EditText) findViewById(R.id.correct_hobby);
edt_name.setText(name);
edt_sex.setText(sex);
edt_age.setText(age);
edt_hobby.setText(hobby);
}
public void choose(View view) {
switch (view.getId()) {
case R.id.correct_cancel:
finish();
break;
case R.id.correct_sure:
//得到输入的
String name = edt_name.getText().toString().trim();
String sex = edt_sex.getText().toString().trim();
String age = edt_age.getText().toString().trim();
String hobby = edt_hobby.getText().toString().trim();
//调用修改方法
MyDataBase.getInstances(CorrectActivity.this).updata(id, name, sex, age, hobby);
finish();
break;
}
}
}
demo下载地址:
更多推荐
所有评论(0)