【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. 点击"查询单条记录"按钮 和 点击"查询多条记录"按钮返回结果




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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


SQLite架构简单,又有Json计算能力,有时会承担Json文件/RESTful的计算功能,但SQLite不能直接解析Json文件/RESTful,需要用Java代码硬写,或借助第三方类库,最后再拼成insert语句插入数据表,代码非常繁琐,这里就不展示了。参考前面的代码可知,入库的过程比较麻烦,不能只用SQL,还要借助Java或命令行。SPL是现代的数据计算语言,属于简化的面向对象的语言风格,有对象的概念,可以用点号访问属性并进行多步骤计算,但没有继承重载这些内容,不算彻底的面向对象语言。...
使用Python操作内置数据库SQLite以及MySQL数据库。
破解微信数据库密码,用python导出微信聊天记录
(Unity)SQLite 是一个软件库,实现了自给自足的、无服务器的、零配置的、事务性的 SQL 数据库引擎。SQLite 是在世界上最广泛部署的 SQL 数据库引擎。SQLite 源代码不受版权限制。本教程将告诉您如何使用 SQLite 编程,并让你迅速上手。.................................
安卓开发,利用SQLite实现登陆注册功能
相比大多数数据库而言,具有等优势,广泛应用于、等领域。
有时候,一个项目只有一个数据库,比如只有SQLite,或者MySQL数据库,那么我们只需要使用一个固定的数据库即可。但是一个项目如果写好了,有多个用户使用,但是多个用户使用不同的数据库,这个时候,我们就需要把软件设计成可以连接多个数据库的模式,用什么数据库,就配置什么数据库即可。4.Users实体类,这个实体类要和数据库一样的,形成一一对应的关系。11.Sqlite数据库,需要在代码里面创建数据库,建立表,再建立数据。8.我们开启MySQL数据库,然后进行调试,看程序的结果。2.安装SqlSugar。
基于Android的背单词软件,功能强大完整。
SQLite,是一款轻型的数据库,是遵守ACID的关系型数据库管理系统。说白了就是使用起来轻便简单,
Android的简单购物车案例
SQLite,是一款轻型的数据库,是遵守ACID的关系型数据库管理系统,它包含在一个相对小的C库中。它是D.RichardHipp建立的公有领域项目。它的设计目标是嵌入式的,而且已经在很多嵌入式产品中使用了它,它占用资源非常的低,在嵌入式设备中,可能只需要几百K的内存就够了。它能够支持Windows/Linux/Unix等等主流的操作系统,同时能够跟很多程序语言相结合,比如 Tcl、C#、PHP、Java等,还有ODBC接口,同样比起Mysql、PostgreSQL这两款开源的世界著名数据库...
Qt设计较为美观好看的登录注册界面(包含SQLite数据库以及TCP通信的应用)
SQLite是用C语言开发的跨平台小型数据库,可嵌入其他开发语言,也可在单机执行。SPL是用Java开发的跨平台的数据计算语言,可嵌入Java,可在单机执行,可以数据计算服务的形式被远程调用。两者的代码都是解释执行的。...
新建库.openDATA_BASE;新建表createtableLIST_NAME(DATA);语法:NAME关键字...<用逗号分割>删除表droptableNAME;查看表.schema查看表信息新建数据insertintoLIST_NAMEvalues();语法:CLASS,PARAMETER...,CLASS是类别,PARAMETER是参数<用逗号分割新建的
importsqlite3classDemo01:def__init__(self):self.conn=sqlite3.connect("sql_demo_001.db")self.cursor1=self.conn.cursor()self.cursor1.execute("select*fromtable_001wherename=?andid=?",('ssss&#0
 在客户端配置文件<configuration>节点下,添加:<connectionStrings>      <add name="localdb" connectionString="Data Source=config/local.db;Version=3;UseUTF16Encoding=True;" providerName="System.Data.SQLite.SQLiteFactory"/&g
提到锁就不得不说到死锁的问题,而SQLite也可能出现死锁。下面举个例子:连接1:BEGIN(UNLOCKED)连接1:SELECT...(SHARED)连接1:INSERT...(RESERVED)连接2:BEGIN(UNLOCKED)连接2:SELECT...(SHARED)连接1:COMMIT(PENDING,尝试获取EXCLUSIVE锁,但还有SHARED锁未释放,返回SQLITE_BUSY)连接2:INSERT...
SQLite是一种嵌入式数据库,它的数据库就是一个文件。由于SQLite本身是C写的,而且体积很小,所以,经常被集成到各种应用程序中,甚至在iOS和Android的App中都可以集成。Python就内置了SQLite3,所以,在Python中使用SQLite,不需要安装任何东西,直接使用。在使用SQLite前,我们先要搞清楚几个概念:表
设计思想————首先要确定有几个页面、和每个页面的大致布局由于是入门,我也是学习了不是很长的时间,所以项目比较low。。。。第一个页面,也就是打开APP的首页面:今天这个博客,先实现添加功能!:首先对主界面进行布局:其中activity_main.xml的代码为<?xmlversion="1.0"encoding="