zoukankan      html  css  js  c++  java
  • 安卓数据存储(3):SQLite数据库存储

    SQLite简介

        Google为Andriod的较大的数据处理提供了SQLite,他在数据存储、管理、维护等各方面都相当出色,功能也非常的强大。SQLite具备下列特点:

    1.轻量级:使用 SQLite 只需要带一个动态库,就可以享受它的全部功能,而且那个动态库的尺寸想当小。

    2.独立性:SQLite 数据库的核心引擎不需要依赖第三方软件,也不需要所谓的“安装”。

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

    4.跨平台:SQLite 目前支持大部分操作系统,不至电脑操作系统更在众多的手机系统也是能够运行,比如:Android。

    5.多语言接口:SQLite 数据库支持多语言编程接口。

    6.安全性:SQLite 数据库通过数据库级上的独占性和共享锁来实现独立事务处理。这意味着多个进程可以在同一时间从同一数据库读取数据,但只能有一个可以写入数据。

        Android为了让我们能够更好的管理数据库,专门提供了一个SQLiteOpenHelper帮助类,这是一个抽象类,因此要使用的话需要创建一个自己的帮助类去继承它。SQLiteOpenHelper类中有两个抽象方法,分别是onCreate(),和onUpgrade(),帮助类中必须重写这两个方法,然后在这两个方法中去实现创建、升级数据库的逻辑。SQLiteOpenHelper中有两个重要的实例方法,getWritableDatabase()和getReadableDatabase().这两个方法都可以创建或打开一个现有数据库(如果数据库已经存在,则直接打开,否则创建一个新的数据库),并返回一个数据库的写读操作对象。不同的是当数据库不可吸入的时候(如磁盘已满)getReadableDatabase()的方法返回的对象将以只读的方式打开数据库,而getWritableDatabase()则抛出异常。

        SQLiteOpenHelper中有两个构造方法可供重写,一般使用参数较少的那一个,即public DatabaseHelper(Context context, String name, CursorFactory factory,  int version),其中第一个参数是Context,必须有它才能对数据库进行操作,第二个参数是数据库的名字,第三个参数允许我们在查询数据时返回一个Cursor,一般传入为null,第四个参数是数据库的版本号,可用于对数据库的升级。通过代码实现如下:

        新建项目MySQLiteTest:在新建一个DatabaseHelper.java类,继承SQLiteOpenHelper,同时修改activity_main.xml文件,添加如下代码:

      <Button 
            android:id="@+id/create_database"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:text="创建数据库"/>
        
        <Button 
            android:id="@+id/add_data"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_below="@id/create_database"
            android:text="添加数据"/>
        
        <Button 
            android:id="@+id/up_data"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_below="@id/add_data"
            android:text="更新数据"/>
        
        <Button 
            android:id="@+id/delete_data"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_below="@id/up_data"
            android:text="删除数据"/>
        
        <Button 
            android:id="@+id/query_data"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_below="@id/delete_data"
            android:text="查询数据"/>
    
        <Button 
            android:id="@+id/replace_data"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_below="@id/query_data"
            android:text="使用事务替换数据"/>
    activity_main.xml

    在DatabaseHelper.java类中 新建一张Book表

    public class DatabaseHelper extends SQLiteOpenHelper {
        
        public static final String CREATE_BOOK="create table Book("
                +"id integer primary key autoincrement,"
                +"author text,"
                +"price real,"
                +"page integer,"
                +"name text)";
        
        private Context myContext;
        public DatabaseHelper(Context context, String name, CursorFactory factory,
                int version) {
            super(context, name, factory, version);
            // TODO Auto-generated constructor stub
            myContext=context;
        }
    
        
        @Override
        public void onCreate(SQLiteDatabase db) {
            // TODO Auto-generated method stub
            db.execSQL(CREATE_BOOK);
            Toast.makeText(myContext, "Create Success", Toast.LENGTH_SHORT).show();
        }
    
        @Override
        public void onUpgrade(SQLiteDatabase arg0, int arg1, int arg2) {
            // TODO Auto-generated method stub
    
        }
    
    }
    DatabaseHelper

        这里把建表的语句定义成一个字符串常量,然后在onCreate()方法中调用SQLiteDatabase的execSQL()方法来执行这条语句,并弹出“Create Success”,这样即可以保证在数据库创建完成的同时创建Book表。

        然后在MainActivity.java中点击创建数据库的按钮,代码为:

    定义一些变量:

    private Button CreatBsesBtn;//创建数据库
        private Button addDataBtn;//添加数据
        private Button udDataBtn;//更新数据
        private Button deleteDataBtn;//删除数据
        private Button queryDataBtn;//插叙数据
        private Button replaceDataBtn;//替换数据
        private  DatabaseHelper mydb;
    button
     mydb=new DatabaseHelper(this, "BookStore.db", null, 1);
             
             //添加数据库
             CreatBsesBtn.setOnClickListener(new OnClickListener() {
                
                @Override
                public void onClick(View arg0) {
                    // TODO Auto-generated method stub
                    mydb.getWritableDatabase();
                }
            });
    添加数据库

    这里通过构建一个DatabaseHelper,并通过构造函数的参数将数据库的名字指定为BookStore.db,版本号为1,然后在点击事件中调用getWritableDatabase()方法。这里查看不具体说明,可以用adb shell来对数据库和表的创建情况进行检查,具体配置不在说明。

    下面不具体说明,看代码:

    添加数据:

    //添加数据
             addDataBtn.setOnClickListener(new OnClickListener() {
                
                @Override
                public void onClick(View arg0) {
                    // TODO Auto-generated method stub
                    SQLiteDatabase db=mydb.getWritableDatabase();
                    ContentValues cv=new ContentValues();
                    //添加数据
                    cv.put("name", "Android");
                    cv.put("author", "jesson");
                    cv.put("page", 120);
                    cv.put("price", 75.0);
                    db.insert("Book", null, cv);
                    cv.clear();
                    db.insert("Book",null, cv);
                }
            });
             
             
    addData

    在这个事件里,先获取到SQLiteDatabase对象,然后使用ContentValues来对要添加的数据进行组装,因为id那一列设置的是自动增长,因此这里只需四列就行了。最后调用insert()方法进行数据插入。

    更新数据:

    //更新数据
             udDataBtn.setOnClickListener(new OnClickListener() {
                
                @Override
                public void onClick(View arg0) {
                    // TODO Auto-generated method stub
                    SQLiteDatabase db=mydb.getWritableDatabase();
                    ContentValues cv=new ContentValues();
                    cv.put("prices", 18.32);
                    db.update("Book", cv, "name=?", new String[]{"Android"});
                }
            });
    更新数据

    这里使用update()方法去执行具体更新操作,使用第三四个参数来指定具体更新的是哪一行的,也就是:将书名为Android的书本价格改为 18.32(原来是75.0)。

    删除数据:

    //删除数据
             deleteDataBtn.setOnClickListener(new OnClickListener() {
                
                @Override
                public void onClick(View arg0) {
                    // TODO Auto-generated method stub
                    SQLiteDatabase db=mydb.getWritableDatabase();
                    db.delete("Book", "page>?", new String[]{"500"});
                }
            });
    删除数据:

    这里使用delete()方法去执行删除操作,使用第二三个参数来指定具体删除的是哪一行,这里删除页数超过50页的书。

     //查询操作
             queryDataBtn.setOnClickListener(new OnClickListener() {
                
                @Override
                public void onClick(View arg0) {
                    // TODO Auto-generated method stub
                    SQLiteDatabase db=mydb.getWritableDatabase();
                    //查询表中所有数据
                    Cursor cursor=db.query("Book", null, null, null, null, null, null);
                    if(cursor.moveToFirst()){
                        do{
                            String name=cursor.getString(cursor.getColumnIndex("name"));
                            String author=cursor.getString(cursor.getColumnIndex("author"));
                            int page=cursor.getInt(cursor.getColumnIndex("page"));
                            double price=cursor.getDouble(cursor.getColumnIndex("price"));
                        }while(cursor.moveToNext());
                    }
                    cursor.close();
                }
            });
    查询操作

    SQLiteDatabase中提供一个query()方法对数据进行查询,这个方法比较复杂,最短有七个参数,分别如下表所示:

    query()方法参数 描述
    table 指定查询的表名(可为null)
    columns 指定查询的列名(可为null)
    selection

    指定where的约束条件(可为null)

    selectionArgs 为where中的占位符提供具体的值(可为null)
    groupBy 指定需要group by的列(可为null)
    having 对group by后的结果进一步约束(可为null)
    orderBy 指定查询结果的排序方式(可为null)

        调用query()方法后会返回一个Cursor对象,查询到的所有数据都将从这个对象中取出。在本次查询中,我们在得到Cursor对象后,调用它的moveToFirst()方法将数据的指针移动到第一行的位置,然后进入一个循环当中,去遍历查询到的每一行数据。在这个循环中,可以通过getColumnIndex()方法获取到每一列在表中对应的位置索引。最后别忘了关闭Cursor.

    事务的使用,在下一篇里进行介绍。

  • 相关阅读:
    文件I/O(不带缓冲)之write函数
    文件I/O(不带缓冲)之read函数
    webpack4.x版本splitChunksPlugin的配置项详解与实际应用场景
    关于使用express作为spa应用服务的问题
    url 的正则表达式:path-to-regexp
    node.js、js读取excel、操作excel、创建excel之js-xlsx.js
    Web前端之iframe详解
    html中的meta标签是什么?有哪些属性?
    大型互联网架构概述,看完文章又涨知识了
    redis 的过期策略都有哪些?内存淘汰机制都有哪些?
  • 原文地址:https://www.cnblogs.com/wynet/p/5494413.html
Copyright © 2011-2022 走看看