您的位置:首页 > 数据库

数据存储之 SQLite 数据库操作(二)

2016-04-28 05:45 387 查看
上一讲我们讲解了SQLite数据库的创建[数据存储之
SQLite 数据库操作(一)],还有更新的操作,这一讲我们来讲解一下数据库的增删改查,这边的程序是对上一个程序进行修改,建议结合上一讲内容进行学习。

1. SQLiteDatabase介绍

1. 在 SQLiteOpenHelper 类中,调用getWritableDatabase()方法也会完成创建或者打开数据库的操作主要是用来读和写,它返回的类型是 :SQLiteDatabase,下面我们就来看一下这个类的介绍

查看其 API介绍
这个类主要是用来管理数据库,它有一些方法来完成创建,删除,执行SQL语句,还有执行其他相同数据库管理的任务。
查看相关方法

可以发现这个类里面的方法很多都是用来维护数据库的,类似查询等。
查看这个 public void execSQL (String sql, Object[] bindArgs) 方法用来执行一个SQL语句,在这个方法说明中,Android建议我们使用以下这种方式来进行对数据库的增删改查的。

insert(String, String, ContentValues)
insertOrThrow(String, String, ContentValues)
insertWithOnConflict(String, String, ContentValues, int)
同理还有其他操作数据库的操作,详情请参考api文档

【备注】:这种对数据库的操作方式是 Android 官方给我们建议的,我们会在下一讲中介绍这种方式,在这一讲中,下面的例子操作数据库的方式主要是使用数据库的 SQL语句。

2. 程序实现

1. 布局文件 activity_main.xml 这里就不贴出来,主要几个按钮的定义

2. DBOpenHelper.java 用来对数据库进行创建和更新,上一讲对这个文件有详细讲解,如有不懂,建议查看上一讲内容。

[java] view
plain copy

package com.android.sqlitedemo.db;

import android.content.Context;

import android.database.sqlite.SQLiteDatabase;

import android.database.sqlite.SQLiteOpenHelper;

public class DBOpenHelper extends SQLiteOpenHelper {

private static String name = "mydb.db"; // 表示数据库的名称

private static int version = 1; // 表示数据库的版本号

public DBOpenHelper(Context context) {

super(context, name, null, version);

// TODO Auto-generated constructor stub

}

// 当数据库创建的时候,是第一次被执行,完成对数据库的表的创建

@Override

public void onCreate(SQLiteDatabase db) {

// TODO Auto-generated method stub

// SQLite 数据创建支持的数据类型: 整型数据,字符串类型,日期类型,二进制的数据类型

// 数据库这边有一个特点,就是SQLite数据库中文本类型没有过多的约束,也就是可以把布尔类型的数据存储到文本类型中,这样也是可以的

String sql = "create table person(id integer primary key autoincrement,name varchar(64),address varchar(64),sex varchar(8))";

db.execSQL(sql); // 完成数据库的创建

}

@Override

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

// TODO Auto-generated method stub

}

}

3. PersonService.java 定义增删改查接口

[java] view
plain copy

package com.android.sqlitedemo.service;

import java.util.List;

import java.util.Map;

/**

* 定义好增删改查接口

* @author xukunhui

*

*/

public interface PersonService {

public boolean addPersion(Object[] params);

public boolean deletePerson(Object[] params);

public boolean updatePerson(Object[] params);

//使用 Map<String, String> 做一个封装,比如说查询数据库的时候返回的单条记录

public Map<String, String> viewPerson(String[] selectionArgs);

//使用 List<Map<String, String>> 做一个封装,比如说查询数据库的时候返回的多条记录

public List<Map<String, String>> listPersonMaps(String[] selectionArgs);

}

4. PersonDao.java 实现增删改查功能

[java] view
plain copy

package com.android.sqlitedemo.dao;

import java.util.ArrayList;

import java.util.HashMap;

import java.util.List;

import java.util.Map;

import android.content.Context;

import android.database.Cursor;

import android.database.sqlite.SQLiteDatabase;

import com.android.sqlitedemo.db.DBOpenHelper;

import com.android.sqlitedemo.service.PersonService;

/**

* 数据库的访问工具类

* 实现定义好的增删改查接口

* @author xukunhui

*

*/

public class PersonDao implements PersonService {

//获得 helper对象用来操纵数据库

private DBOpenHelper helper = null;

public PersonDao(Context context) {

helper = new DBOpenHelper(context);

}

/**

* 下面四个方法实现对数据库的增删改查功能

*/

@Override

public boolean addPersion(Object[] params) {

boolean flag = false;

SQLiteDatabase database = null;

try {

//这里面问好表示占位符,所以要需要传入所有的占位符的值,传入值有这个方法中的参数传递

String sql = "insert into person(name,address,sex) values(?,?,?)";

database = helper.getWritableDatabase(); //实现对数据库写的操作

database.execSQL(sql, params);

flag = true;

} catch (Exception e) {

e.printStackTrace();

} finally {

if(database != null) {

database.close();

}

}

return flag;

}

@Override

public boolean deletePerson(Object[] params) {

boolean flag = false;

SQLiteDatabase database = null;

try {

String sql = "delete from person where id = ? ";

database = helper.getWritableDatabase();

database.execSQL(sql, params);

flag = true;

} catch (Exception e) {

e.printStackTrace();

} finally {

if(database != null) {

database.close();

}

}

return flag;

}

@Override

public boolean updatePerson(Object[] params) {

boolean flag = false;

SQLiteDatabase database = null;

try {

String sql = "update person set name = ?, address = ?, sex = ? where id = ? ";

database = helper.getWritableDatabase();

database.execSQL(sql, params);

flag = true;

} catch (Exception e) {

e.printStackTrace();

} finally {

if(database != null) {

database.close();

}

}

return flag;

}

//根据Id号来查询,查询的每一行数据返回用 Map 集合来存储

@Override

public Map<String, String> viewPerson(String[] selectionArgs) {

Map<String, String> map = new HashMap<String, String>();

SQLiteDatabase database = null;

try {

String sql = "select * from person where id = ? ";

database = helper.getReadableDatabase(); //查询读取数据,查询结果使用Map来存储

//声明一个游标,这个是行查询的操作,支持原生SQL语句的查询

Cursor cursor = database.rawQuery(sql, selectionArgs); //ID所在行查询

int colums = cursor.getColumnCount();//获得数据库的列的个数

//cursor.moveToNext() 移动到下一条记录

while(cursor.moveToNext()){

for(int i = 0; i < colums; i++) {

String cols_name = cursor.getColumnName(i); //提取列的名称

String cols_value = cursor.getString(cursor.getColumnIndex(cols_name)); //根据列的名称提取列的值

//数据库中有写记录是允许有空值的,所以这边需要做一个处理

if(cols_value == null) {

cols_value = "";

}

map.put(cols_name, cols_value);

}

}

} catch (Exception e) {

e.printStackTrace();

} finally {

if(database != null){

database.close();

}

}

return map;

}

//多条记录 用 List<Map<String, String>> 来封装,每一行产生一个 Map集合来装载这一行的数据

//这样就有多个Map值,然后放入List中.

@Override

public List<Map<String, String>> listPersonMaps(String[] selectionArgs) {

List<Map<String, String>> list = new ArrayList<Map<String,String>>();

SQLiteDatabase database = null;

try {

String sql = "select * from person "; //这个是查询表中所有的内容,所以就不需要传入的这个参数值了

database = helper.getReadableDatabase();

Cursor cursor = database.rawQuery(sql, selectionArgs);

int colums = cursor.getColumnCount();

while(cursor.moveToNext()) {

Map<String, String> map = new HashMap<String, String>();

for(int i = 0; i < colums; i++) {

String cols_name = cursor.getColumnName(i);

String cols_value = cursor.getString(cursor.getColumnIndex(cols_name));

if(cols_name == null) {

cols_value = "";

}

map.put(cols_name, cols_value);

}

list.add(map);

}

} catch (Exception e) {

// TODO: handle exception

} finally {

if(database != null){

database.close();

}

}

return list;

}

}

5. 主程序文件 MainActivity.java 文件

[java] view
plain copy

package com.android.sqlitedemo;

import java.util.List;

import java.util.Map;

import com.android.sqlitedemo.dao.PersonDao;

import com.android.sqlitedemo.db.DBOpenHelper;

import com.android.sqlitedemo.service.PersonService;

import android.os.Bundle;

import android.app.Activity;

import android.util.Log;

import android.view.Menu;

import android.view.View;

import android.view.View.OnClickListener;

import android.widget.Button;

public class MainActivity extends Activity {

private Button button1;

private Button button2;

private Button button3;

private Button button4;

private Button button5;

private Button button6;

private static final String TAG = "MainActivity";

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

initComponent();

button1.setOnClickListener(new OnClickListener() {

@Override

public void onClick(View v) {

// TODO Auto-generated method stub

DBOpenHelper helper = new DBOpenHelper(MainActivity.this);

//调用 getWritableDatabase()或者 getReadableDatabase()其中一个方法将数据库建立

helper.getWritableDatabase();

}

});

button2.setOnClickListener(new OnClickListener() {

@Override

public void onClick(View v) {

// TODO Auto-generated method stub

PersonService service = new PersonDao(MainActivity.this);

//Object[] params = {"张三","北京","男"};

Object[] params = {"李四","上海","男"}; //新增加一条记录

boolean flag = service.addPersion(params);

Log.i(TAG, "--->" + flag);

}

});

button3.setOnClickListener(new OnClickListener() {

@Override

public void onClick(View v) {

PersonService service = new PersonDao(MainActivity.this);

Object[] params = {1};

//将ID为1的记录删除

boolean flag = service.deletePerson(params);

Log.i(TAG, "---->" + flag);

}

});

button4.setOnClickListener(new OnClickListener() {

@Override

public void onClick(View v) {

// TODO Auto-generated method stub

//将ID为3的这一条记录修改

PersonService service = new PersonDao(MainActivity.this);

Object[] params = {"AHuier", "厦门", "男", "3"};

boolean flag = service.updatePerson(params);

Log.i(TAG, "--->" + flag);

}

});

button5.setOnClickListener(new OnClickListener() {

@Override

public void onClick(View v) {

//查询ID为3的单条记录

PersonService service = new PersonDao(MainActivity.this);

String[] seleStrings = {"3"};

Map<String, String> map = service.viewPerson(seleStrings);

Log.i(TAG, "------查询单条记录--> " + map.toString());

}

});

button6.setOnClickListener(new OnClickListener() {

@Override

public void onClick(View v) {

//查询多条记录,这里我们不需要传递参数,所以可以参数可以置为null

PersonService service = new PersonDao(MainActivity.this);

List<Map<String, String>> list = service.listPersonMaps(null);

Log.i(TAG, "---查询所有记录--->> " + list.toString());

}

});

}

@Override

public boolean onCreateOptionsMenu(Menu menu) {

// Inflate the menu; this adds items to the action bar if it is present.

getMenuInflater().inflate(R.menu.main, menu);

return true;

}

private void initComponent(){

button1 = (Button)findViewById(R.id.button1);

button2 = (Button)findViewById(R.id.button2);

button3 = (Button)findViewById(R.id.button3);

button4 = (Button)findViewById(R.id.button4);

button5 = (Button)findViewById(R.id.button5);

button6 = (Button)findViewById(R.id.button6);

}

}

3. 程序执行结果如下:

1. 界面如下



2. 点击"建立数据库"按钮后执行"插入数据"按钮



3. 点击"删除数据"按钮



4. 点击"修改数据"按钮



5. 点击"查询单条记录"按钮 和 点击"查询多条记录"按钮返回结果



原文地址: http://blog.csdn.net/ahuier/article/details/10418147
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: