美文网首页
SQLite数据库的使用方法

SQLite数据库的使用方法

作者: 李俊的博客 | 来源:发表于2016-06-26 10:01 被阅读1202次

SQLite是一种嵌入式的数据库引擎,最后是以文件的形式保存数据的,专门适用于资源有限的设备上进行适量的数据存储,而Android全面支持标准的SQLite数据库。
  所有创建的SQLite数据库,仅限于当前应用访问,如果其他应用需要访问,则必须提供的ContentProvider的支持,并且SQLite数据库会随着Android应用的卸载而被删除。
  从本质上来看,SQLite的操作方式只是一种更为便捷的文件操作,当应用程序创建或打开一个SQLite数据库时,其实只是打开一个文件准备读写。
  因为SQLite仅适用于资源有限的小型设备,所以本身就不应该把大量数据存储在设备的SQLite数据库里,SQLite只适合存储一些小型的数据。
  为了使SQLite和其他数据库间的兼容性最大化,SQLite支持对列上类型进行“类型近似”,列的类型近似指的是存储在列上的数据进行推荐类型存储。所以虽然SQLite内部只支持null(空)、integer(整型)、real(浮点数)、text(文本)和blob(二进制)这五种数据类型,但实际上SQLite完全可以接受varchar(n)、char(n)、decimal(p, s)、date等类型数据,只不过SQLite会在运算或保存时将它们转换为上面五种数据类型中相应的类型。大多数数据库的引擎都是使用静态的、强类型的数据类型,数据的类型是由它的容器决定的,这个容器是指被存放的特定列。而SQLite使用的是动态类型,在SQLite中,值的数据类型跟值本身相关,而不是与它的容器相关,所以SQLite允许把各种类型的数据保存到任何类型字段中,开发者可以不用关心声明该字段说使用的数据类型。但是有一种情况例外,定义为integer primary key的字段只能存储64位整数,当向这种字段保存除整数意外的其他类型的数据时,SQLite会产生错误。

SQLite数据库文件存放位置

/data/data/<package name>/databases/

SQLite数据库支持的数据类型

SQLite内部只支持null(空)、integer(整型)、real(浮点数)、text(文本)和blob(二进制)这五种数据类型。

SQLiteOpenHelper

SQLiteOpenHelper提供了两个构造器,用于传递当前上下文对象以及SQLite数据库版本信息,在SQLiteOpenHelper的继承类的构造函数中会调用它,构造器的签名如下:

SQLiteOpenHelper(Context context, String name,
                 SQLiteDatabase.CursorFactory factory, int version)
SQLiteOpenHelper(Context context, String name,
                 SQLiteDatabase.CursorFactroy factory, int version,
                 DatabaseErrorHandler errorHandler)

上面的构造函数中,都是用于创建一个SQLite数据库,context为一个当前应用的上下文对象;name是数据库名称;factory是一个允许子类在查询时使用的游标,一般不用(传null即可);version是数据库版本号;errorHandler是一个接口,传递当数据库错误的时候,执行的补救方法。

在SQLiteOpenHelper中,可以进行SQLite数据库的创建、维护、日志以及获取可读写的数据库对象,通过下面几个常用方法得到支持:
  1)String getDatabaseName():获取数据库名。
  2)SQLiteDatabase getReadableDatabase():创建或者打开一个可读的数据库对象。
  3)SQLiteDatabase getWritableDatabase():创建或者打开一个可读/写的数据库对象。
  4)abstract void onCreate(SQLiteDatabase db):当第一次调用SQLiteOpenHelper的时候执行,之后再次调用将不再执行,一般用于完成数据库初始化的工作。
  5)void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion):当数据库版本号发生向上更新时被执行。
  6)void onDowngrade(SQLiteDatabase db, int oldVersion, int newVersion):当数据库版本号发生向下更新时被执行。

SQLiteDatabase

当使用SQLiteOpenHelper的getReadableDatabase()或者getWritableDatabase()方法获取到SQLiteDatabase对象,就可以对这个数据库进行操作了。

CRUD

其中C代表添加(Create),R代表查询(Retrieve),U代表更新(Update),D代表删除(Delete)。

1、使用SQL语句执行CRUD操作

1)插入数据

db.execSQL("insert into book (name, author, pages, price) values(?, ?, ?, ?)",
new String[] { "The Da Vinci Code", "Dan Brown", "454", "16.96" });

2)更新数据

db.execSQL("update book set price = ? where name = ?", new String[] { "10.99", "The Da Vinci Code" });

3)删除数据

db.execSQL("delete from book where pages > ?", new String[] { "500" });

4)查找数据

db.rawQuery("select * from book", null);

void execSQL():通过SQL语句执行一条非查询语句。
Cursor rawQuery():通过SQL语句执行一条查询语句。

2、使用SQLiteDatabase所提供的方法实现CRUD操作

1)插入一条数据

long insert(String table, String nullColumnHack, ContentValues values)

table是表名;nullColumnHack用于在未指定添加数据的情况下给某些可为空的列自动赋值null,一般用不到这个功能,直接传入null即可;values是一个 ContentValues对象,它提供了一系列的put()方法重载,用于向ContentValues中添加数据,只需要将表中的每个列名以及相应的待添加数据传入即可。
  2)根据条件,删除数据。

int delete(String table, String whereCaluse, String[] whereArgs)

table是表名;whereCaluse和whereArgs用于去约束删除某一行或某几行的数据,不指定的话默认就是删除所有行。  
  3)根据条件,更新数据。

int updata(String table,ContentValues values,String whereCaluse,String[] whereArgs)

table是表名;values是ContentValues对象要把更新数据在这里组装进去;whereCaluse和whereArgs用于去约束更新某一行或某几行中的数据,不指定的话默认就是更新所有行。
  4)根据条件,查询数据。

Cursor query(String table, String[] columns, String selection, String[] selectionArgs,
             String groupBy, String having, String orderBy)

table是表名;columns用于指定去查询哪几列,如果不指定则默认查询所有列;selection和selectionArgs用于去约束查询某一行或某几行的数据,不指定则默认是查询所有行的数据;groupBy用于指定需要去group by的列,不指定则表示不对查询结果进行group by操作;having用于对group by之后的数据进行进一步的过滤,不指定则表示不进行过滤;orderBy用于指定查询结果的排序方式,不指定则表示使用默认的排序方式。

示例演示

1)SQLiteOpenHelper帮助创建和更新数据库

public class DBOpenHelper extends SQLiteOpenHelper {

    private Context mContext;
    private String createBook;
    private String createCategory;

    public DBOpenHelper(Context context, String name,
                        SQLiteDatabase.CursorFactory factory, int version) {
        super(context, name, factory, version);
        mContext = context;
    }

    /**
     * 创建数据库
     */
    @Override
    public void onCreate(SQLiteDatabase db) {
        // 创建book表
        createBook = "create table book(" +
                "id integer primary key autoincrement, " +
                "author text, " +
                "price real, " +
                "pages integer, " +
                "name text, " +
                "category_id integer)";
        db.execSQL(createBook);
        // 创建category表
        createCategory = "create table category(" +
                "id integer primary key autoincrement, " +
                "category_name text, " +
                "category_code integer)";
        db.execSQL(createCategory);
        // 提示数据库创建完毕
        Toast.makeText(mContext, "数据库创建完毕", Toast.LENGTH_SHORT).show();
    }

    /**
     * 更新数据库
     */
    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        switch (oldVersion) {
            case 1:
                // 创建category表
                db.execSQL(createCategory);
            case 2:
                // 向book表添加category_id列
                db.execSQL("alter table book add column category_id integer");
                break;
        }
    }
}

2)设置Activity的布局
activity_main.xml

<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <Button
        android:id="@+id/add_data"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="添加数据"/>

    <Button
        android:id="@+id/update_data"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="更新数据"/>

    <Button
        android:id="@+id/delete_data"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="删除数据"/>

    <Button
        android:id="@+id/query_data"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="查询数据"/>
</LinearLayout>

3)在Activity中进行数据库的CRUD操作
MainActivity.java

public class MainActivity extends AppCompatActivity {

    private static final String TAG = "MainActivity";

    private DBOpenHelper mDBOpenHelper;
    private SQLiteDatabase mSqLiteDatabase;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // 数据库BookStore.db,版本2。
        mDBOpenHelper = new DBOpenHelper(this, "BookStore.db", null, 2);

        /**
         * 插入数据
         */
        findViewById(R.id.add_data).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // 以可写入的方式获取数据库
                mSqLiteDatabase = mDBOpenHelper.getWritableDatabase();
                // 创建ContentValues并写入数据
                ContentValues values = new ContentValues();

                values.put("name", "The Da Vinci Code");
                values.put("author", "Dan Brown");
                values.put("pages", 454);
                values.put("price", 16.96);
                // 插入第一条数据
                mSqLiteDatabase.insert("book", null, values);
                // 清空ContentValues
                values.clear();

                values.put("name", "The Lost Symbol");
                values.put("author", "Dan Brown");
                values.put("pages", 510);
                values.put("price", 19.95);
                // 插入第二条数据
                mSqLiteDatabase.insert("book", null, values);
                // 清空ContentValues
                values.clear();

                Toast.makeText(MainActivity.this, "已插入数据", Toast.LENGTH_SHORT).show();
            }
        });
        /**
         * 更新数据
         */
        findViewById(R.id.update_data).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // 以可写入的方式获取数据库
                mSqLiteDatabase = mDBOpenHelper.getWritableDatabase();
                // 创建ContentValues并写入数据
                ContentValues values = new ContentValues();
                values.put("price", 10.99);
                // 更新数据
                mSqLiteDatabase.update("book", values,
                        "name = ?", new String[]{"The Da Vinci Code"});
                Toast.makeText(MainActivity.this, "已更新数据", Toast.LENGTH_SHORT).show();
            }
        });
        /**
         * 删除数据
         */
        findViewById(R.id.delete_data).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // 以可写入的方式获取数据库
                mSqLiteDatabase = mDBOpenHelper.getWritableDatabase();
                mSqLiteDatabase.delete("book", "pages > ?", new String[]{"500"});
                Toast.makeText(MainActivity.this, "已删除数据", Toast.LENGTH_SHORT).show();
            }
        });
        /**
         * 查询数据
         */
        findViewById(R.id.query_data).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // 以只读的方式获取数据库
                mSqLiteDatabase = mDBOpenHelper.getReadableDatabase();
                // 查询book表中所有数据
                Cursor cursor = mSqLiteDatabase.query("book", null, null, null, null, null, null);
                // 遍历Cursor对象,取出数据。
                while (cursor.moveToNext()) {
                    String name = cursor.getString(cursor.getColumnIndex("name"));
                    String author = cursor.getString(cursor.getColumnIndex("author"));
                    int pages = cursor.getInt(cursor.getColumnIndex("pages"));
                    double price = cursor.getDouble(cursor.getColumnIndex("price"));
                    Log.i(TAG, "name: " + name + ", author: " + author +
                            ", pages: " + pages + ", price: " + price);
                }
                // 记得关闭资源
                cursor.close();
                Toast.makeText(MainActivity.this, "已查询数据", Toast.LENGTH_SHORT).show();
            }
        });
    }
}

使用事务

SQLiteDatabase db = dbHelper.getWritableDatabase();
// 开启事务
db.beginTransaction(); 
try {
    db.delete("Book", null, null);

    ContentValues values = new ContentValues();
    values.put("name", "Game of Thrones");
    values.put("author", "George Martin");
    values.put("pages", 720);
    values.put("price", 20.85);
    db.insert("Book", null, values);

    // 操作成功
    db.setTransactionSuccessful();
} catch (Exception e) {
    e.printStackTrace();
} finally {
    // 关闭事务
    db.endTransaction();
}

参考

《第一行代码--Android》
Android--数据持久化之SQLite

相关文章

  • iOS数据库的基本使用

    今天总结下数据库的基本使用方法: iOS使用的数据库一般就是sqlite3,在使用该数据库前一定要先导入数据库框架...

  • SQLite 创建数据库

    SQLite 创建数据库 SQLite 的 sqlite3 命令被用来创建新的 SQLite 数据库。您不需要任何...

  • 第四篇:sqlite数据库与FMDB

    目录一、sqlite数据库二、FMDB 一、sqlite数据库 sqlite数据库是基于C实现的、移动端开发常用的...

  • android从入门到放弃(3)

    实验二 通讯录APP实验 一、目的:1、熟悉Android数据存储和访问;2、掌握SQLite数据库的使用方法;3...

  • Pycharm中连接数据库sqlite

    django 有个数据库 sqlite sqlite是小型关系数据库

  • Python数据分析基础----第二十二天

    数据库 Python内置的sqlite3模块 import sqlite3 创建sqlite3内存数据库 创建带有...

  • SQLite数据库的使用方法

    SQLite是一种嵌入式的数据库引擎,最后是以文件的形式保存数据的,专门适用于资源有限的设备上进行适量的数据存储,...

  • Sqlite 使用笔记

    1. 数据库基本操作封装 sqlite 数据操作 语句类型 sqlite 数据库的简单实用- 导入sqlite3数...

  • Android数据库

    一、SQLite 1、SQLite介绍 1.1、简介 SQLite是一款轻型的数据库,是遵守ACID的关联式数据库...

  • android笔记6

    本章学习目标: 了解SQLite数据库的特点和体系结构 掌握SQLite数据库的建立和操作方法 SQlite介绍 ...

网友评论

      本文标题:SQLite数据库的使用方法

      本文链接:https://www.haomeiwen.com/subject/efiadttx.html