【Android 开发】:数据存储之 SQLite 数据库操作(二)

上一讲我们讲解了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,ContentValues)
insertWithOnConflict(String,ContentValues,int)
同理还有其他操作数据库的操作,详情请参考api文档
【备注】:这种对数据库的操作方式是 Android 官方给我们建议的,我们会在下一讲中介绍这种方式,在这一讲中,下面的例子操作数据库的方式主要是使用数据库sql语句。

2. 程序实现

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

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

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 定义增删改查接口
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 实现增删改查功能
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>();
                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 文件
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. 点击"查询单条记录"按钮 和 点击"查询多条记录"按钮返回结果




敬请关注我们下一讲(数据库讲解内容)

相关文章

安装 在Windows上安装SQLite。 访问官网下载下Precompliled Binaries for Windows的两个压缩包。 创建s...
一、安装 下载地址:http://www.sqlite.org/download.html 将Precompiled Binaries for Windows下的包下...
实例: 会员信息管理 功能:1.查看数据库 2.清空数据库 3.增加会员 4.删除会员 5.更新会员 6.查找会员  ...
关于SQLite SQLite是一个轻量的、跨平台的、开源的数据库引擎,它的在读写效率、消耗总量、延迟时间和整...