使用数据库SQLite 主要有两种方式进行操作,一种为写sql 语句,另外一种为 安卓已封装好sql方法 ,属于安卓自带的方法.
直接写sql 语句 有很大的方便性,而使用安卓自带的sql 方法局限性会多.
直接写sql 语句 ; 安卓自带的sql方法。
1.建库
有三种:
一种是直接拼写SQL语句,使用SQLiteDatabase.execSQL("SQL")方法执行该SQL语句,
第二种是使用 SQLiteOpenHelper 对象做CURD操作。
第三种 Context.openOrCreateDatabase(name, mode, factory)
参数:
参数一:数据库名称,
参数二:操作模式, MODE_PRIVATE--默认模式 MODE_WORLD_READABLE--可读 MODE_WORLD_WRITEABLE--可写
参数三:附加的一个工厂类,当SQLiteDatabase实例的query函数被调用时,会使用该工厂类返回一个Cursor。可为null。
说明:
SQLiteOpenHelper 中有两个抽象方法,分别是onCreate()和onUpgrade(),我们必须在自己的帮助类里面重写这两个方法,
然后分别在这两个方法中去实现创建、升级数据库的逻辑。
onCreate(SQLiteDatabase db):创建数据库时的操作,如建表
onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion):当打开数据库时传入的版本号与当前的版本号不同时会调用该方法。
SQLiteOpenHelper中还有两个非常重要的实例方法,getReadableDatabase()和getWritableDatabase()。这两个方法都可
以创建或打开一个现有的数据库(如果数据库已存在则直接打开,否则创建一个新的数据库),并返回一个可对数据库进
行读写操作的对象。不同的是,当数据库不可写入的时候(如磁盘空间已满)getReadableDatabase()方法返回的对象将以
只读的方式去打开数据库,而getWritableDatabase()方法则将出现异常。
建表
SQLiteDatabase.execSQL(“create table 表名(id integer primary key autoincrement,列名 数据类型(最大长度),列名
数据类型(最大长度)) ” )
示例代码:
create table Book (
id integer primary key autoincrement,
author text,
price real,
pages integer,
name text);增删改查
3.1 第一种方式
CURD 创建(Create)、更新(Update)、读取(Read)和删除(Delete) 增:(插入) 有占位符: SQLiteDatabase.execSQL("insert into 表名(要插入数据的列名1,要插入数据的列名2) values(?,?) ,new Object[] {"插到列名1的数据", "插到列名2的数据" }"); 参数一:要执行的SQL, 参数二:占位符(?)所对应的数据 无占位符: SQLiteDatabase.execSQL("insert into 表名(要插入数据的列名1,要插入数据的列名2) values('插到列名1的数据', '插到列名2的数据') "); 删除(删): 有占位符: SQLiteDatabase.execSQL("delete from 表名 where 要删除数据的列名 = ?",new String[]{"要删除的对比信息"}); 无占位符: SQLiteDatabase.execSQL("delete from 表名 where 要删除数据的列名 = '要删除的对比信息'"); 修改(改): 有占位符: SQLiteDatabase.execSQL("update 表名 set 要修改数据的列名 = ? where 要插入数据的列名= ?",new String[]{"修改后 ,该列名对应的数据","该列名对应的原始数据"}); 无占位符: SQLiteDatabase.execSQL("update 表名 set 要修改数据的列名 = '修改后的数据' where 要修改数据的列名='修改前的数据'"); 查询(查): Cursor(指针) cursor=SQLiteDatabase.rawQuery("select * from 表名 where 要查询数据的列名 = ?",new String[] {"要查询的数据" }); cursor.getCount():通过指定条件查询出的数据的总条数 cursor.moveToNext();是否还有下一条符合条件的数据
3.2 第二种方式 安卓自带
增: SQLiteDatabase.insert(table, nullColumnHack, values) 参数一:表名 参数二:当values参数为空或者里面没有内容的时候,就会将你指定的这个列名的值设为null,然后再向数据库中插入 参数三:代表一行要插入的数据。 返回值(long):插入不成功返回-1,插入成功返回行号ID 删: SQLiteDatabase.delete(table, whereClause, whereArgs) 参数一:表名 参数二:删除条件 参数三:删除条件里(参数二),占位符(?)所对应的参数列表 返回值(int):被删除的行数(影响的行数) 改: SQLiteDatabase.update(table, values, whereClause, whereArgs) 参数一:表名 参数二:要修改的数据 参数三:修改条件 参数四:修改条件里(参数二),占位符(?)所对应的参数列表 返回值(int):被修改的行数(影响的行数) 查: SQLiteDatabase.query(table, columns, selection, selectionArgs, groupBy, having, orderBy, limit) Table 表名 Columens 要返回的列 Selection 查询条件 selectionArgs 查询条件占位符对应的内容 groupBy 分组判断条件 Having 是否含有的判断条件 orderBy 排序判断条件 Limit 分页查询判断条件 返回值(Cursor ):Cursor 对象里包含了查询到的数据 查询使用的方法: Cursor.moveToNext()//指针是否可以移动到下一行(是否还有下一行数据) Cursor.getColumnIndex(String columnName)//获取指定列所在列的索引 Cursor.getString(int columnIndex);//根据指定的列的索引,去拿与该列对应的数据,返回值为String Cursor.getInt(int columnIndex);//根据指定的列的索引,去拿与该列对应的数据,返回值为int Cursor.getLong(int columnIndex);//根据指定的列的索引,去拿与该列对应的数据,返回值为long
注意事项:
4.1 在有占位符(?)的SQL中,占位符的顺序与其内容所对应的数组的元素的顺序一致
示例代码
一。 第一种方式
a. 建立数据库
public class MyHelper extends SQLiteOpenHelper{
private static String NAME="day02.db";
//建表语句
private static String CREATE_TABLE=" create table day02 (_id integer primary key autoincrement ,name text ,age text);";
// 四个参数 : context 上下文 name 数据库的名称 factory 游标工厂 version 版本号,必须从一开始
public MyHelper(Context context) {
super(context, NAME, null, 1);
}
//当数据库创建的时候调用
@Override
public void onCreate(SQLiteDatabase db) {
//建表
db.execSQL(CREATE_TABLE);
}
//更新数据库的时候调用
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// 比较 oldVersion 与 newVersion ,newVersion 大于 oldVersion 则进行更新操作。
// Toast.makeText(context, text, duration).show();
}
}
b. 建立Bean 接收数据
public class Person {
public Person(int id, String name, int age) {
super();
this.id = id;
this.name = name;
this.age = age;
}
public Person() {
super();
// TODO Auto-generated constructor stub
}
private int id;
private String name;
private int age;
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 int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Person [id=" + id + ", name=" + name + ", age=" + age + "]";
}
}
c. 活动中代码实现,展示:
public class MainActivity extends Activity implements OnClickListener{
private MyHelper myHelper;
private EditText name;
private EditText age;
private String name5;
private String age5;
private TextView content;
private ListView listView;
private ArrayList<Person> list;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//1.获取数据库对象 ,该对象还未创建表格
myHelper = new MyHelper(this);
list = new ArrayList<Person>();
init();
}
private void init() {
Button add=(Button) findViewById(R.id.add);
Button delt=(Button) findViewById(R.id.delt);
Button query=(Button) findViewById(R.id.query);
Button update=(Button) findViewById(R.id.update);
name = (EditText) findViewById(R.id.name);
age = (EditText) findViewById(R.id.age);
content = (TextView) findViewById(R.id.content);
listView = (ListView) findViewById(R.id.listView);
add.setOnClickListener(this);
delt.setOnClickListener(this);
query.setOnClickListener(this);
update.setOnClickListener(this);
// SQLiteDatabase db=SQLiteDatabase.openDatabase(path, factory, flags);
// SQLiteDatabase.openOrCreateDatabase(file, factory);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.add:
//获取数据
String name1=name.getText().toString();
String age1=age.getText().toString();
//1. 通过帮助实例,获取数据库 ,此时会调用 帮助类中的 onCreate 方法。
SQLiteDatabase database_add = myHelper.getWritableDatabase();
//2. 给表中添加数据 定义sql语句
String sql="insert into day02 (name,age) values (?,?);";
//3. 执行sql 语句
database_add.execSQL(sql, new String[]{name1,age1});
//4. 关闭数据库
database_add.close();
break;
case R.id.delt:
//将相同名字的条目删除
String name2=name.getText().toString();
//1. 通过帮助实例,获取数据库, 此时会调用 帮助类中的 onCreate 方法
SQLiteDatabase database_delt = myHelper.getWritableDatabase();
//2. 定义删除 sql 语句
String sql_delt ="delete from day02 where name=?;";
//3. 执行sql 语句
database_delt.execSQL(sql_delt, new String[]{name2});
//4. 关闭数据库
database_delt.close();
break;
case R.id.update:
//清空集合
list.clear();
//根据名字更新年龄
String name3=name.getText().toString();
String age3=age.getText().toString();
//1、 通过帮助实例,获取数据库 ,此时会调用 帮助类 中的 onCreate 方法
SQLiteDatabase database_update = myHelper.getWritableDatabase();
//2. 定义更新sql语句
String sql_update="update day02 set age=? where name=? ;";
//3. 执行sql语句
database_update.execSQL(sql_update, new String[]{age3,name3});
//4. 关闭数据库
database_update.close();
break;
case R.id.query:
//根据名字查询数据
String name4=name.getText().toString();
String age4=age.getText().toString();
//1. 获取帮助实例,获取数据库,此时会调用帮助类中的 onCreate 方法
SQLiteDatabase database_query = myHelper.getWritableDatabase();
//2. 定义查询语句 结果集
String sql_select=" select * from day02 where name = ? ;";
Cursor cursor = database_query.rawQuery(sql_select, new String[]{name4});
//3.遍历结果集
while(cursor.moveToNext()){
String name5=cursor.getString(cursor.getColumnIndex("name"));
int age5=cursor.getInt(cursor.getColumnIndex("age"));
int id5=cursor.getInt(cursor.getColumnIndex("_id"));
Person person= new Person(id5, name5, age5);
list.add(person);
}
listView.setAdapter(new ArrayAdapter<Person>(MainActivity.this, android.R.layout.simple_list_item_1, list));
/* //2. 定义查询语句 结果集
Cursor cursor = database_query.query("day02", new String[]{"name","age"}, "name=?", new String[]{name4}, null, null, null);
//3. 遍历结果集
while(cursor.moveToNext()){
name5 += cursor.getString(cursor.getColumnIndex("name"));
age5 += cursor.getString(cursor.getColumnIndex("age"));
content.setText("NAME--------"+name5+"age_____"+age5);
}*/
//关闭数据库
database_query.close();
break;
default:
break;
}
}
}
d. 控件
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center_horizontal"
android:orientation="vertical" >
<EditText
android:id="@+id/name"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="姓名" />
<EditText
android:id="@+id/age"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="年龄" />
<Button
android:id="@+id/add"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="添加" />
<Button
android:id="@+id/delt"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="删除" />
<Button
android:id="@+id/update"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="修改" />
<Button
android:id="@+id/query"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="查询" />
<TextView
android:id="@+id/content"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:text="数据展示"
android:textColor="#66ff0000"
/>
<ListView
android:id="@+id/listView"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
></ListView>
</LinearLayout>
二。 第二种方式
a. 创建数据库
public class MyHelper extends SQLiteOpenHelper{
private static String NAME="day02.db";
//建表语句
private static String CREATE_TABLE=" create table day02 (_id integer primary key autoincrement ,name text ,age text);";
// 四个参数 : context 上下文 name 数据库的名称 factory 游标工厂 version 版本号,必须从一开始
public MyHelper(Context context) {
super(context, NAME, null, 1);
}
//当数据库创建的时候调用
@Override
public void onCreate(SQLiteDatabase db) {
//建表
db.execSQL(CREATE_TABLE);
}
//更新数据库的时候调用
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// 比较 oldVersion 与 newVersion ,newVersion 大于 oldVersion 则进行更新操作。
// Toast.makeText(context, text, duration).show();
}
}
b. 创建Bean ,按对象接收数据
public class Person {
public Person(int id, String name, int age) {
super();
this.id = id;
this.name = name;
this.age = age;
}
public Person() {
super();
// TODO Auto-generated constructor stub
}
private int id;
private String name;
private int age;
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 int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Person [id=" + id + ", name=" + name + ", age=" + age + "]";
}
}
c. 主活动 代码实现,并展示
public class MainActivity extends Activity implements OnClickListener{
private MyHelper myHelper;
private EditText name;
private EditText age;
private String name5;
private String age5;
private TextView content;
private ListView listView;
private ArrayList<Person> list;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//1.获取数据库对象 ,该对象还未创建表格
myHelper = new MyHelper(this);
list = new ArrayList<Person>();
init();
}
private void init() {
Button add=(Button) findViewById(R.id.add);
Button delt=(Button) findViewById(R.id.delt);
Button query=(Button) findViewById(R.id.query);
Button update=(Button) findViewById(R.id.update);
name = (EditText) findViewById(R.id.name);
age = (EditText) findViewById(R.id.age);
content = (TextView) findViewById(R.id.content);
listView = (ListView) findViewById(R.id.listView);
add.setOnClickListener(this);
delt.setOnClickListener(this);
query.setOnClickListener(this);
update.setOnClickListener(this);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.add:
//获取数据
String name1=name.getText().toString();
String age1=age.getText().toString();
//1. 通过帮助实例,获取数据库 ,此时会调用 帮助类中的 onCreate 方法。
SQLiteDatabase database_add = myHelper.getWritableDatabase();
//2. 给表中添加数据 定义sql语句
ContentValues values=new ContentValues();
values.put("name", name1);
values.put("age", age1);
database_add.insert("day02", null, values);
//4. 关闭数据库
database_add.close();
break;
case R.id.delt:
//将相同名字的条目删除
String name2=name.getText().toString();
//1. 通过帮助实例,获取数据库, 此时会调用 帮助类中的 onCreate 方法
SQLiteDatabase database_delt = myHelper.getWritableDatabase();
//2. 定义删除 语句
database_delt.delete("day02", "name=?", new String[]{name2});
//3. 关闭数据库
database_delt.close();
break;
case R.id.update:
//根据名字更新年龄
String name3=name.getText().toString();
String age3=age.getText().toString();
//1、 通过帮助实例,获取数据库 ,此时会调用 帮助类 中的 onCreate 方法
SQLiteDatabase database_update = myHelper.getWritableDatabase();
//2. 执行跟新语句
ContentValues values2=new ContentValues();
values2.put("name", "xiaomingming");
values2.put("age", "20周岁");
database_update.update("day02", values2, "name=?", new String[]{name3});
//3. 关闭数据库
database_update.close();
break;
case R.id.query:
//清空数据
list.clear();
//根据名字查询数据
String name4=name.getText().toString();
String age4=age.getText().toString();
//1. 获取帮助实例,获取数据库,此时会调用帮助类中的 onCreate 方法
SQLiteDatabase database_query = myHelper.getWritableDatabase();
//2. 执行查询语句 获取 结果集
Cursor cursor = database_query.query("day02", null, "name=?", new String[]{name4}, null, null, null);
//3.遍历结果集
while(cursor.moveToNext()){
String name5=cursor.getString(cursor.getColumnIndex("name"));
int age5=cursor.getInt(cursor.getColumnIndex("age"));
int id5=cursor.getInt(cursor.getColumnIndex("_id"));
Person person= new Person(id5, name5, age5);
list.add(person);
}
listView.setAdapter(new ArrayAdapter<Person>(MainActivity.this, android.R.layout.simple_list_item_1, list));
//4.关闭数据库
database_query.close();
break;
default:
break;
}
}
}
d. 布局文件
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center_horizontal"
android:orientation="vertical" >
<EditText
android:id="@+id/name"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="姓名" />
<EditText
android:id="@+id/age"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="年龄" />
<Button
android:id="@+id/add"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="添加" />
<Button
android:id="@+id/delt"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="删除" />
<Button
android:id="@+id/update"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="修改" />
<Button
android:id="@+id/query"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="查询" />
<TextView
android:id="@+id/content"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:text="数据展示"
android:textColor="#66ff0000"
/>
<ListView
android:id="@+id/listView"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
></ListView>
</LinearLayout>