当前位置: 首页 > news >正文

Android之SqlLite数据库使用

  

  每个应用程序都要使用数据,Android应用程序也不例外,Android使用开源的、与操作系统无关的SQL数据库—SQLite。SQLite第一个Alpha版本诞生于2000年5月,它是一款轻量级数据库,它的设计目标是嵌入式的,占用资源非常的低,只需要几百K的内存就够了。SQLite已经被多种软件和产品使用,Mozilla FireFox就是使用SQLite来存储配置数据的,Android和iPhone都是使用SQLite来存储数据的。

  SQLite数据库是D.Richard Hipp用C语言编写的开源嵌入式数据库,支持的数据库大小为2TB。它具有如下特征:

  1、轻量级

    SQLite和C\S模式的数据库软件不同,它是进程内的数据库引擎,因此不存在数据库的客户端和服务器。使用SQLite一般只需要带上它的一个动态库,就可以享受它的全部功能。而且那个动态库的尺寸也相当小。

  2、独立性

    SQLite数据库的核心引擎本身不依赖第三方软件,使用它也不需要“安装”,所以在使用的时候能够省去不少麻烦。

  3、隔离性

    SQLite数据库中的所有信息(比如表、视图、触发器)都包含在一个文件内,方便管理和维护。

  4、跨平台

    SQLite数据库支持大部分操作系统,除了我们在电脑上使用的操作系统之外,很多手机操作系统同样可以运行,比如Android、Windows Mobile、Symbian、Palm等。

  5、多语言接口

    SQLite数据库支持很多语言编程接口,比如C\C++、Java、Python、dotNet、Ruby、Perl等,得到更多开发者的喜爱。

  6、安全性

    SQLite数据库通过数据库级上的独占性和共享锁来实现独立事务处理。这意味着多个进程可以在同一时间从同一数据库读取数据,但只有一个可以写入数据。在某个进程或线程向数据库执行写操作之前,必须获得独占锁定。在发出独占锁定后,其他的读或写操作将不会再发生。

  下面介绍一下如何在Android平台创建SQLite数据库,方法很简单,我们需要继承这个接口类SQLiteOpenHelper,并实现其中的onCreate与onUpgrade方法:

public class MyDatabaseHelper extends SQLiteOpenHelper {
    
    private static final String db_name = "SQLite_db.db";//数据文件的名字
    private static int NUMBER = 1;//当前数据库版本,用于升级
    private static final String table_name = "students";//表名
    private static String sql = null;//sql语句
    
    public MyDatabaseHelper(Context context) {
        super(context, db_name, null, NUMBER);//数据库文件保存在当前应用所在包名:<包>/database/
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        sql = "CREATE TABLE " + table_name + " (" + 
                "id            INTEGER         PRIMARY KEY ," + 
                "name        VARCHAR(50)        NOT NULL)";//创建数据库的SQL语句
        
        db.execSQL(sql);//执行SQL语句
    }

    /**
     * 当数据库进行升级是调用,这里通过NUMBER值来进行判断,数据库是否升级
     */
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        
        //第一种写法
        sql = "ALTER TABLE " + table_name + " ADD sex VARCHAR(2) NULL"; 
        Log.i("sql", sql);
        db.execSQL(sql);
        
        //第二种写法
        //db.execSQL("ALTER TABLE students ADD sex VARCHAR(10) NULL");
    }
}

  下面我们在主Activity中创建这个类,然后进行数据的生成:

public class Activityone extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_one);
        
        //创建SqlLite数据库
        SQLiteOpenHelper helper = new MyDatabaseHelper(this);
        helper.getWritableDatabase();
    }
}

  到这里我们关于SQLite的创建就为大家分享完毕,需要提示的就是onUpgrade()方法,这个方法一般不执行,当我们的数据库版本发生变化时,才会被执行。


  下面我们来一起学习一下如何在Android中来使用SQLite数据库,来完成对数据的增、删、改、查、统计。

  我们通过创建一个管理学生信息的数据库来完成对SQLite功能的介绍展示,首先为了方便对学生类进行管理,我们先创建一个学生类:

public class tab_students {
    
    public Integer id;//学生Id
    public String name;//学生姓名
    public String password;//学生密码
    public String school;//学生学校
    
    public tab_students(){
        
    }
    
    public tab_students(int _id,String _name,String _password){
        id=_id;
        name=_name;
        password=_password;
    }
    
    public Integer getId() {
        return id;
    }
    
    public void setId(int id) {
        this.id = id;
    }
    
    public String getName() {
        return name;
    }
    
    public void setName(String _name) {
        name = _name;
    }
    
    public String getPassword() {
        return password;
    }
    
    public void setPassword(String _password) {
        password = _password;
    }
    
    public String getSchool() {
        return school;
    }
    
    public void setSchool(String _school) {
        school = _school;
    }

    @Override
    public String toString() {
        return "id:"+this.getId()+"  name:"+this.getName()+"  password:"+this.getPassword();
    }
    
}

  有了学生类,下面我们创建数据库配置文件:

public class MyTabOpen extends SQLiteOpenHelper{
    
    private static final String db_sql = "SQLiter.db"; 
    private static int NUMBER = 1;
    private static final String tab_name = "students";
    private static String sql = null;
    
    public MyTabOpen(Context context) {
        super(context, db_sql, null, NUMBER);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        sql = "CREATE TABLE " + tab_name + " (" + 
                "id            INTEGER         PRIMARY KEY ," + 
                "name        VARCHAR(20)        NOT NULL ," +
                "password   VARCHAR(20)     NOT NULL)";
        db.execSQL(sql);
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        
        //在更新数据库时,因原先数据库表中已有数据,所以新增加的列属性只能设置为“可以为空”
        db.execSQL("ALTER TABLE students ADD school VARCHAR(10) NULL");
        
    }

}

  对于这个文件,大家有什么疑问请看上面的SQLite数据库创建讲解。

  这里我们的主Activity的代码如下,对于主Activity的布局文件,就不在粘代码了,布局文件全是Button按钮:

public class Activityone extends Activity {
    
    private static tab_students stu = null;
    private static tab_service ser = null;
    private static int conn = 1;

    private TextView mytext = null;
    private Button mybutton1 = null;//添加数据
    private Button mybutton2 = null;//删除数据
    private Button mybutton3 = null;//修改数据
    private Button mybutton4 = null;//查询数据
    private Button mybutton5 = null;//分页获取数据
    private Button mybutton6 = null;//获取数据总数
    private Button mybutton7 = null;//普通页面跳转
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_one);
        mytext = (TextView)findViewById(R.id.textview);
        mytext.setText("增删改查序"+"("+"sql语句"+")");
        
        mybutton1 = (Button)findViewById(R.id.button1);
        mybutton2 = (Button)findViewById(R.id.button2);
        mybutton3 = (Button)findViewById(R.id.button3);
        mybutton4 = (Button)findViewById(R.id.button4);
        mybutton5 = (Button)findViewById(R.id.button5);
        mybutton6 = (Button)findViewById(R.id.button6);
        mybutton7 = (Button)findViewById(R.id.button7);
        
        mybutton1.setOnClickListener(new mybuttonlistener());
        mybutton2.setOnClickListener(new mybuttonlistener());
        mybutton3.setOnClickListener(new mybuttonlistener());
        mybutton4.setOnClickListener(new mybuttonlistener());
        mybutton5.setOnClickListener(new mybuttonlistener());
        mybutton6.setOnClickListener(new mybuttonlistener());
        mybutton7.setOnClickListener(new mybuttonlistener());
        
    }
    
    class mybuttonlistener implements OnClickListener{

        @Override
        public void onClick(View v) {
            switch (v.getId()) {
            case R.id.button1://添加数据
                ser =new tab_service(getApplicationContext());                
                stu = new tab_students(conn++,"小米","abc123");
                ser.save(stu);
                break;

            case R.id.button2://删除数据
                ser =new tab_service(getApplicationContext());                
                ser.del(1);
                break;
                
            case R.id.button3://修改数据
                ser =new tab_service(getApplicationContext());                
                stu = new tab_students(1,"HTC","acm123");
                ser.update(stu);
                break;
                
            case R.id.button4://查询数据
                ser =new tab_service(getApplicationContext());                
                stu=ser.find(1);
                System.out.println(stu.toString());                
                break;
                
            case R.id.button5://分页获取数据
                ser =new tab_service(getApplicationContext());
                List<tab_students> list = ser.getScrollDate(0,5);
                for(tab_students stu : list){
                    System.out.println(stu.toString());    
                }
                break;
                
            case R.id.button6://获取数据总数
                long number = 0;
                ser =new tab_service(getApplicationContext());                
                number=ser.gettab();
                System.out.println("数据库中共有:"+number+"条记录.");                
                break;

            default:
                Activityone.this.startActivity(new Intent(Activityone.this,Activitytwo.class));//普通跳转
                break;
            }
        }
    }
}

  大家可能已经看到了,这里我们对SQLite的操作,都是通过tab_service.java类完成了,下面就为大家揭晓如何对SQLite进行操作:

public class tab_service {
    
    private MyTabOpen mytabopen = null;
    private static SQLiteDatabase db = null;
    private static String sql = null;
    private static final String tab_name = "students";
    
    public tab_service(Context context) {
        this.mytabopen = new MyTabOpen(context);//获得数据库操作实例
    }

    //添加数据
    public void save(tab_students students){
        db = mytabopen.getWritableDatabase();
        sql = "insert into "+tab_name+"(id,name,password) values(?,?,?)";
        db.execSQL(sql, new Object[]{students.getId(),students.getName(),students.getPassword()});
        db.close();            //为了提高性能sqliter数据库可以不关闭
    }
    
    //删除数据
    public void del(Integer id){
        db = mytabopen.getWritableDatabase();
        sql = "delete from "+tab_name+" where id = ?";
        db.execSQL(sql, new Object[]{id});
        db.close();
    }
    
    //更新数据
    public void update(tab_students students){
        db = mytabopen.getWritableDatabase();
        sql = "update "+tab_name+" set name=?,password=? where id=?";
        db.execSQL(sql, new Object[]{students.getName(), students.getPassword(), students.getId()});
        db.close();
    }
    
    //查询数据
    public tab_students find(Integer id){
        
        //getReadableDatabase()与getWritableDatabase()通过查看源代码知道,getReadableDatabase()方法在磁盘空间满的时候,仍能返回数据库操作实例,不过此时的实例只能用于读不能写
        db = mytabopen.getReadableDatabase();
        sql = "select * from "+tab_name+ " where id=?";
        Cursor cur = db.rawQuery(sql, new String[]{id.toString()});
        if(cur.moveToFirst()){
            String name = cur.getString(cur.getColumnIndex("name"));
            String password = cur.getString(cur.getColumnIndex("password"));
            return new tab_students(id,name,password);
        }
        cur.close();
        db.close();
        return null;
    }
    
    //分页获取数据
    public List<tab_students> getScrollDate(int again,int last){
        
        List<tab_students> list = new ArrayList<tab_students>();
        db = mytabopen.getReadableDatabase();
        sql = "select * from "+tab_name+ "limit ?,? order by id asc";//根据查询结果的id对数据进行升序排列
        //sql = "select * from " +tab_name+ " limit ?,?";
        Cursor cur = db.rawQuery(sql, new String[]{String.valueOf(again), String.valueOf(last)});
        while (cur.moveToNext()) {
            int id = cur.getInt(cur.getColumnIndex("id"));
            String name = cur.getString(cur.getColumnIndex("name"));
            String password = cur.getString(cur.getColumnIndex("password"));
            
            tab_students stu = new tab_students(id, name, password);
            list.add(stu);
        }
        cur.close();
        db.close();
        return list;
    }

    //获取数据总数目
    public long gettab(){
        db = mytabopen.getReadableDatabase();
        sql = "select count(*) from "+tab_name;
        Cursor cur = db.rawQuery(sql, null);
        cur.moveToFirst();
        long result = cur.getLong(0);
        return result;
    }
}

  是不是感觉和我们的SQL数据库操作一样,sql语句没有什么区别,是的,他们完全一致。没学过数据库的小朋友是不是已经抓狂啦,不要担心,Android工程师想到了你们,Android为我们封装好了一套对SQLite数据库进行操作的规范,下面我们就一起来学习一下,如何通过Android提供的规范晚场上面的操作。

  这里我们只需要修改一下,我们上面对数据库操作的类:

public class tab_service_two {
    
    private MyTabOpen mytabopen = null;
    private static SQLiteDatabase db = null;
    private static final String tab_name = "students";
    
    public tab_service_two(Context context) {
        this.mytabopen = new MyTabOpen(context);//获得数据库操作实例
    }

    //添加数据
    public void save(tab_students students){
        db = mytabopen.getWritableDatabase();         
        ContentValues values = new ContentValues();
        values.put("id", students.getId());
        values.put("name", students.getName());
        values.put("password", students.getPassword());
        db.insert(tab_name, null, values);
        db.close();
    }
    
    //删除数据
    public void del(Integer id){
        db = mytabopen.getWritableDatabase();
        db.delete(tab_name, "id=?", new String[]{id.toString()});
        db.close();
    }
    
    //修改数据
    public void update(tab_students students){
        db = mytabopen.getWritableDatabase();
        ContentValues values = new ContentValues();
        values.put("name", students.getName());
        values.put("password", students.getPassword());
        db.update(tab_name, values, "id=?", new String[]{students.getId().toString()});
        db.close();
    }
    
    //查询数据
    public tab_students find(Integer id){
        //getReadableDatabase()与getWritableDatabase()通过查看源代码知道,getReadableDatabase()方法在磁盘空间满的时候,仍能返回数据库操作实例,不过此时的实例只能用于读不能写
        db = mytabopen.getReadableDatabase();
        //当要查询数据库表中的所以信息时,第二个参数可以使用设置为空来代替数组
        Cursor cur = db.query(tab_name, new String[]{"name","password"}, "id=?", new String[]{id.toString()}, null, null, null);
        
        if(cur.moveToFirst()){
            String name = cur.getString(cur.getColumnIndex("name"));
            String password = cur.getString(cur.getColumnIndex("password"));
            return new tab_students(id,name,password);
        }
        cur.close();
        db.close();
        return null;
    }
    
    //分页获取数据
    public List<tab_students> getScrollDate(int again,int last){
        List<tab_students> list = new ArrayList<tab_students>();
        db = mytabopen.getReadableDatabase();
        
        Cursor cur = db.query(tab_name, null, null, null, null, null, "id asc", again+","+last);
        while (cur.moveToNext()) {
            int id = cur.getInt(cur.getColumnIndex("id"));
            String name = cur.getString(cur.getColumnIndex("name"));
            String password = cur.getString(cur.getColumnIndex("password"));
            
            tab_students stu = new tab_students(id, name, password);
            list.add(stu);
        }
        cur.close();
        db.close();
        return list;
    }

    //获取数据总数
    public long gettab(){
        db = mytabopen.getReadableDatabase();
        Cursor cur = db.query(tab_name, new String[]{"count(*)"}, null, null, null, null, null);
        cur.moveToFirst();
        long result = cur.getLong(0);
        return result;
    }
}

  好了关于SQLite在Android平台的使用,就为大家介绍完毕,内容很简单,没有太大的难度,相信小伙伴一定能理解。新手学习,高手交流。

相关文章:

  • 《OpenGL ES应用开发实践指南:Android卷》—— 1.4 创建Renderer类
  • ubuntu14.10建立热点wifi分享给手机
  • 《人机交互与戏剧表演:用戏剧理论构建良好用户体验》一第2章 戏剧基础(一):定性结构的元素...
  • objective-c系列-NSDictionaryNSMutableDictionary
  • 盘点最实用56个大数据可视化分析工具
  • 需求工程-软件需求模式读书笔记1
  • checkbox的readonly不起作用的解决方案
  • 打造基金业大数据监管体系 私募基金服务业务增至七类
  • 如何在微信订阅号里实现oauth授权登录
  • LinkedIn 推出在线学习门户网站 LinkedIn Learning
  • C语言经典编程题一
  • STT GDC公司完成塔塔公司在新加坡三个数据中心的资产收购
  • Java RandomAccessFile用法
  • 做好数据挖掘模型的9条经验总结
  • 数值特征
  • [微信小程序] 使用ES6特性Class后出现编译异常
  • ES6语法详解(一)
  • Fabric架构演变之路
  • java8 Stream Pipelines 浅析
  • JavaScript 基本功--面试宝典
  • JS实现简单的MVC模式开发小游戏
  • Laravel核心解读--Facades
  • mysql外键的使用
  • Spring Cloud中负载均衡器概览
  • webpack+react项目初体验——记录我的webpack环境配置
  • 汉诺塔算法
  • 探索 JS 中的模块化
  • 译米田引理
  • 再次简单明了总结flex布局,一看就懂...
  • 正则学习笔记
  • ​比特币大跌的 2 个原因
  • ​猴子吃桃问题:每天都吃了前一天剩下的一半多一个。
  • # 睡眠3秒_床上这样睡觉的人,睡眠质量多半不好
  • #Spring-boot高级
  • %@ page import=%的用法
  • (Arcgis)Python编程批量将HDF5文件转换为TIFF格式并应用地理转换和投影信息
  • (二)丶RabbitMQ的六大核心
  • (仿QQ聊天消息列表加载)wp7 listbox 列表项逐一加载的一种实现方式,以及加入渐显动画...
  • (每日持续更新)jdk api之StringBufferInputStream基础、应用、实战
  • (一)Mocha源码阅读: 项目结构及命令行启动
  • (一)基于IDEA的JAVA基础10
  • (转)jdk与jre的区别
  • (最全解法)输入一个整数,输出该数二进制表示中1的个数。
  • ..thread“main“ com.fasterxml.jackson.databind.JsonMappingException: Jackson version is too old 2.3.1
  • .net 使用$.ajax实现从前台调用后台方法(包含静态方法和非静态方法调用)
  • [ web基础篇 ] Burp Suite 爆破 Basic 认证密码
  • [100天算法】-目标和(day 79)
  • [AutoSAR系列] 1.3 AutoSar 架构
  • [Bada开发]初步入口函数介绍
  • [BZOJ3223]文艺平衡树
  • [c#基础]DataTable的Select方法
  • [CF543A]/[CF544C]Writing Code
  • [Codeforces1137D]Cooperative Game
  • [Django 0-1] Core.Checks 模块
  • [Java][Android][Process] 暴力的服务能够解决一切,暴力的方式运行命令行语句