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

2. 程序实现

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

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

[java]  view plain  copy
  1. package com.android.sqlitedemo.db;  
  2.   
  3. import android.content.Context;  
  4. import android.database.sqlite.SQLiteDatabase;  
  5. import android.database.sqlite.SQLiteOpenHelper;  
  6.   
  7. public class DBOpenHelper extends SQLiteOpenHelper {  
  8.   
  9.     private static String name = "mydb.db"// 表示数据库的名称  
  10.     private static int version = 1// 表示数据库的版本号  
  11.   
  12.     public DBOpenHelper(Context context) {  
  13.         super(context, name, null, version);  
  14.         // TODO Auto-generated constructor stub  
  15.     }  
  16.   
  17.     // 当数据库创建的时候,是第一次被执行,完成对数据库的表的创建  
  18.     @Override  
  19.     public void onCreate(SQLiteDatabase db) {  
  20.         // TODO Auto-generated method stub  
  21.         // SQLite 数据创建支持的数据类型: 整型数据,字符串类型,日期类型,二进制的数据类型  
  22.         // 数据库这边有一个特点,就是SQLite数据库中文本类型没有过多的约束,也就是可以把布尔类型的数据存储到文本类型中,这样也是可以的  
  23.         String sql = "create table person(id integer primary key autoincrement,name varchar(64),address varchar(64),sex varchar(8))";  
  24.         db.execSQL(sql); // 完成数据库的创建  
  25.     }  
  26.   
  27.     @Override  
  28.     public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {  
  29.         // TODO Auto-generated method stub  
  30.     }  
  31.   
  32. }  
3. PersonService.java 定义增删改查接口
[java]  view plain  copy
  1. package com.android.sqlitedemo.service;  
  2.   
  3. import java.util.List;  
  4. import java.util.Map;  
  5.   
  6.   
  7. /** 
  8.  * 定义好增删改查接口 
  9.  * @author xukunhui 
  10.  * 
  11.  */  
  12. public interface PersonService {  
  13.   
  14.     public boolean addPersion(Object[] params);   
  15.       
  16.     public boolean deletePerson(Object[] params);  
  17.       
  18.     public boolean updatePerson(Object[] params);  
  19.       
  20.     //使用 Map<String, String> 做一个封装,比如说查询数据库的时候返回的单条记录  
  21.     public Map<String, String> viewPerson(String[] selectionArgs);  
  22.       
  23.     //使用 List<Map<String, String>> 做一个封装,比如说查询数据库的时候返回的多条记录  
  24.     public List<Map<String, String>> listPersonMaps(String[] selectionArgs);  
  25. }  
4. PersonDao.java 实现增删改查功能
[java]  view plain  copy
  1. package com.android.sqlitedemo.dao;  
  2.   
  3. import java.util.ArrayList;  
  4. import java.util.HashMap;  
  5. import java.util.List;  
  6. import java.util.Map;  
  7.   
  8. import android.content.Context;  
  9. import android.database.Cursor;  
  10. import android.database.sqlite.SQLiteDatabase;  
  11.   
  12. import com.android.sqlitedemo.db.DBOpenHelper;  
  13. import com.android.sqlitedemo.service.PersonService;  
  14.   
  15.   
  16. /** 
  17.  * 数据库的访问工具类 
  18.  * 实现定义好的增删改查接口 
  19.  * @author xukunhui 
  20.  * 
  21.  */  
  22. public class PersonDao implements PersonService {  
  23.   
  24.     //获得 helper对象用来操纵数据库  
  25.     private DBOpenHelper helper = null;  
  26.     public PersonDao(Context context) {  
  27.         helper = new DBOpenHelper(context);  
  28.     }  
  29.   
  30.     /** 
  31.      * 下面四个方法实现对数据库的增删改查功能  
  32.      */  
  33.       
  34.     @Override  
  35.     public boolean addPersion(Object[] params) {  
  36.         boolean flag = false;  
  37.         SQLiteDatabase database = null;  
  38.         try {  
  39.             //这里面问好表示占位符,所以要需要传入所有的占位符的值,传入值有这个方法中的参数传递  
  40.             String sql = "insert into person(name,address,sex) values(?,?,?)";  
  41.             database = helper.getWritableDatabase(); //实现对数据库写的操作  
  42.             database.execSQL(sql, params);  
  43.             flag = true;  
  44.         } catch (Exception e) {  
  45.             e.printStackTrace();  
  46.         } finally {  
  47.             if(database != null) {  
  48.                 database.close();  
  49.             }  
  50.         }  
  51.         return flag;  
  52.     }  
  53.   
  54.     @Override  
  55.     public boolean deletePerson(Object[] params) {  
  56.         boolean flag = false;  
  57.         SQLiteDatabase database = null;  
  58.         try {  
  59.             String sql = "delete from person where id = ? ";  
  60.             database = helper.getWritableDatabase();  
  61.             database.execSQL(sql, params);  
  62.             flag = true;              
  63.         } catch (Exception e) {  
  64.             e.printStackTrace();  
  65.         } finally {  
  66.             if(database != null) {  
  67.                 database.close();  
  68.             }  
  69.         }  
  70.         return flag;  
  71.     }  
  72.   
  73.     @Override  
  74.     public boolean updatePerson(Object[] params) {  
  75.         boolean flag = false;  
  76.         SQLiteDatabase database = null;  
  77.         try {  
  78.             String sql = "update person set name = ?, address = ?, sex = ? where id = ? ";  
  79.             database = helper.getWritableDatabase();  
  80.             database.execSQL(sql, params);  
  81.             flag = true;  
  82.         } catch (Exception e) {  
  83.             e.printStackTrace();  
  84.         } finally {  
  85.             if(database != null) {  
  86.                 database.close();  
  87.             }  
  88.         }  
  89.         return flag;  
  90.     }  
  91.   
  92.     //根据Id号来查询,查询的每一行数据返回用 Map 集合来存储  
  93.     @Override  
  94.     public Map<String, String> viewPerson(String[] selectionArgs) {  
  95.         Map<String, String> map = new HashMap<String, String>();  
  96.         SQLiteDatabase database = null;  
  97.         try {  
  98.             String sql = "select * from person where id = ? ";  
  99.             database = helper.getReadableDatabase(); //查询读取数据,查询结果使用Map来存储  
  100.             //声明一个游标,这个是行查询的操作,支持原生SQL语句的查询  
  101.             Cursor cursor = database.rawQuery(sql, selectionArgs); //ID所在行查询             
  102.             int colums = cursor.getColumnCount();//获得数据库的列的个数  
  103.             //cursor.moveToNext() 移动到下一条记录  
  104.             while(cursor.moveToNext()){  
  105.                 for(int i = 0; i < colums; i++) {  
  106.                     String cols_name = cursor.getColumnName(i); //提取列的名称  
  107.                     String cols_value = cursor.getString(cursor.getColumnIndex(cols_name)); //根据列的名称提取列的值  
  108.                     //数据库中有写记录是允许有空值的,所以这边需要做一个处理  
  109.                     if(cols_value == null) {  
  110.                         cols_value = "";  
  111.                     }  
  112.                     map.put(cols_name, cols_value);  
  113.                 }  
  114.             }  
  115.         } catch (Exception e) {  
  116.             e.printStackTrace();  
  117.         } finally {  
  118.             if(database != null){  
  119.                 database.close();  
  120.             }  
  121.         }  
  122.         return map;  
  123.     }  
  124.   
  125.     //多条记录 用 List<Map<String, String>> 来封装,每一行产生一个 Map集合来装载这一行的数据  
  126.     //这样就有多个Map值,然后放入List中.  
  127.     @Override  
  128.     public List<Map<String, String>> listPersonMaps(String[] selectionArgs) {  
  129.         List<Map<String, String>> list = new ArrayList<Map<String,String>>();  
  130.         SQLiteDatabase database = null;  
  131.         try {  
  132.             String sql = "select * from person "//这个是查询表中所有的内容,所以就不需要传入的这个参数值了  
  133.             database = helper.getReadableDatabase();  
  134.             Cursor cursor = database.rawQuery(sql, selectionArgs);  
  135.             int colums = cursor.getColumnCount();  
  136.             while(cursor.moveToNext()) {  
  137.                 Map<String, String> map = new HashMap<String, String>();  
  138.                 for(int i = 0; i < colums; i++) {  
  139.                     String cols_name = cursor.getColumnName(i);  
  140.                     String cols_value = cursor.getString(cursor.getColumnIndex(cols_name));  
  141.                     if(cols_name == null) {  
  142.                         cols_value = "";    
  143.                     }  
  144.                     map.put(cols_name, cols_value);  
  145.                 }  
  146.                 list.add(map);  
  147.             }  
  148.         } catch (Exception e) {  
  149.             // TODO: handle exception  
  150.         } finally {  
  151.             if(database != null){  
  152.                 database.close();  
  153.             }  
  154.         }  
  155.         return list;  
  156.     }    
  157. }  
5. 主程序文件 MainActivity.java 文件
[java]  view plain  copy
  1. package com.android.sqlitedemo;  
  2.   
  3. import java.util.List;  
  4. import java.util.Map;  
  5.   
  6. import com.android.sqlitedemo.dao.PersonDao;  
  7. import com.android.sqlitedemo.db.DBOpenHelper;  
  8. import com.android.sqlitedemo.service.PersonService;  
  9.   
  10. import android.os.Bundle;  
  11. import android.app.Activity;  
  12. import android.util.Log;  
  13. import android.view.Menu;  
  14. import android.view.View;  
  15. import android.view.View.OnClickListener;  
  16. import android.widget.Button;  
  17.   
  18. public class MainActivity extends Activity {  
  19.   
  20.     private Button button1;  
  21.     private Button button2;  
  22.     private Button button3;  
  23.     private Button button4;  
  24.     private Button button5;  
  25.     private Button button6;  
  26.       
  27.     private static final String TAG = "MainActivity";  
  28.     @Override  
  29.     protected void onCreate(Bundle savedInstanceState) {  
  30.         super.onCreate(savedInstanceState);  
  31.         setContentView(R.layout.activity_main);  
  32.         initComponent();  
  33.         button1.setOnClickListener(new OnClickListener() {  
  34.               
  35.             @Override  
  36.             public void onClick(View v) {  
  37.                 // TODO Auto-generated method stub  
  38.                 DBOpenHelper helper = new DBOpenHelper(MainActivity.this);  
  39.                 //调用 getWritableDatabase()或者 getReadableDatabase()其中一个方法将数据库建立  
  40.                 helper.getWritableDatabase();  
  41.             }  
  42.         });  
  43.         button2.setOnClickListener(new OnClickListener() {  
  44.               
  45.             @Override  
  46.             public void onClick(View v) {  
  47.                 // TODO Auto-generated method stub  
  48.                 PersonService service = new PersonDao(MainActivity.this);  
  49.                 //Object[] params = {"张三","北京","男"};  
  50.                 Object[] params = {"李四","上海","男"}; //新增加一条记录  
  51.                 boolean flag = service.addPersion(params);  
  52.                 Log.i(TAG, "--->" + flag);  
  53.             }  
  54.         });  
  55.         button3.setOnClickListener(new OnClickListener() {             
  56.             @Override  
  57.             public void onClick(View v) {  
  58.                 PersonService service = new PersonDao(MainActivity.this);  
  59.                 Object[] params = {1};  
  60.                 //将ID为1的记录删除  
  61.                 boolean flag = service.deletePerson(params);  
  62.                 Log.i(TAG, "---->" + flag);  
  63.             }  
  64.         });  
  65.         button4.setOnClickListener(new OnClickListener() {  
  66.               
  67.             @Override  
  68.             public void onClick(View v) {  
  69.                 // TODO Auto-generated method stub  
  70.                 //将ID为3的这一条记录修改  
  71.                 PersonService service = new PersonDao(MainActivity.this);  
  72.                 Object[] params = {"AHuier""厦门""男""3"};  
  73.                 boolean flag = service.updatePerson(params);  
  74.                 Log.i(TAG, "--->" + flag);  
  75.             }  
  76.         });  
  77.         button5.setOnClickListener(new OnClickListener() {  
  78.               
  79.             @Override  
  80.             public void onClick(View v) {  
  81.                 //查询ID为3的单条记录  
  82.                 PersonService service = new PersonDao(MainActivity.this);  
  83.                 String[] seleStrings = {"3"};  
  84.                 Map<String, String> map = service.viewPerson(seleStrings);  
  85.                 Log.i(TAG, "------查询单条记录--> " + map.toString());  
  86.             }  
  87.         });  
  88.         button6.setOnClickListener(new OnClickListener() {  
  89.               
  90.             @Override  
  91.             public void onClick(View v) {  
  92.                 //查询多条记录,这里我们不需要传递参数,所以可以参数可以置为null  
  93.                 PersonService service = new PersonDao(MainActivity.this);  
  94.                 List<Map<String, String>> list = service.listPersonMaps(null);  
  95.                 Log.i(TAG, "---查询所有记录--->> " + list.toString());  
  96.             }  
  97.         });  
  98.     }  
  99.   
  100.     @Override  
  101.     public boolean onCreateOptionsMenu(Menu menu) {  
  102.         // Inflate the menu; this adds items to the action bar if it is present.  
  103.         getMenuInflater().inflate(R.menu.main, menu);  
  104.         return true;  
  105.     }  
  106.       
  107.     private void initComponent(){  
  108.         button1 = (Button)findViewById(R.id.button1);  
  109.         button2 = (Button)findViewById(R.id.button2);  
  110.         button3 = (Button)findViewById(R.id.button3);  
  111.         button4 = (Button)findViewById(R.id.button4);  
  112.         button5 = (Button)findViewById(R.id.button5);  
  113.         button6 = (Button)findViewById(R.id.button6);  
  114.     }  
  115.   
  116. }  

3. 程序执行结果如下:

1. 界面如下


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


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


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


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


原文地址: http://blog.csdn.net/ahuier/article/details/10418147
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值