android SQLite (一)基本操作

最近为了巩固android基础,复习了sqlite数据库这篇。好记性不如烂笔头,操起键盘就是干….

sqlite简介

SQLite 是一款轻量级的关系型数据库,它的运算速度非常快, 占用资源很少,通常只需要几百 K 的内存就足够了,因而特别适合在移动设备上使用。SQLite 不仅支持标准的 SQL 语法,还遵循了数据库的 ACID 事务,所以只要你以前使用过其他的 关系型数据库,就可以很快地上手 SQLite。而 SQLite 又比一般的数据库要简单得多,它甚 至不用设置用户名和密码就可以使用。Android 正是把这个功能极为强大的数据库嵌入到了 系统当中,使得本地持久化的功能有了一次质的飞跃。

优点:

1)零配置,无需安装和配置
2)储存在单一磁盘文件中的一个完整数据库
3)数据库文件可以在不同的字节顺序的机器间自由共享
4)支持数据库大小至2TB
5)足够小,全部源代码大致3万行C代码,250k
6)比目前流行的大多数数据库带数据的操作要快
7)开源

常用的sql基本语句

创建表:
create table  表名 (字段名 数据类型,字段名 数据类型,字段名 数据类型)
插入数据:
insert into 表名 values(数据值,数据值,数据值)
insert into 表名 (字段1,字段2,字段3) values(数据值,数据值,数据值)
更新数据:
update 表名 set 字段1 = 数据值 where 其他字段 = 数据值
删除数据:
delete from 表名 where  字段值 = 数据值
删除表:
drop table if exists 表名
增加字段:
alter table 表名 add column 字段  数据类型
查询数据:
select * from表名 where 查询的条件表达式  group by 分组的字段 order by 排序的字段 
 //select 后面为* 则返回所有的字段,返回部分字段,只需把*换成需要的字段,多个字段有逗号隔开

创建数据库

android的为我们提供了SQLiteOpenHelper ,继承这个抽象类类,需要复写构造方法(一般选构造参数少的那个),onCreate()和onUpgrade()

onCreate

这个方法是用来创建数据库用的;

onUpgrade

这个方法是用来升级数据库用的;

例子如下:

创建一个学生表

public class MySQLiteHelp extends SQLiteOpenHelper {
    public static final int VERSION = 1;
    private static final String DB_NAME = "my_db.db";
    private static final String CREATE_BOOK = "create table Students (" +
            "id integer primary key autoincrement," +
            "name text," +
            "class text," +
            "year integer," +
            "grade real)";
    private Context mContext;

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

    @Override
    public void onCreate(SQLiteDatabase sqLiteDatabase) {
        sqLiteDatabase.execSQL(CREATE_BOOK);
        Toast.makeText(mContext,"创建成功!",Toast.LENGTH_SHORT).show();
    }

    @Override
    public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {

    }
}

然后实例化MySQLiteHelp这个类,并调用getWritableDatabase()方法。

//第一个参数上下文,第二个参数数据库名字,第三个参数允许我们在查询数据的时候返回一个自定义的Cursor,一般传null,第四个参数传入数据库版本
mySQLiteHelp = new MySQLiteHelp(this,MySQLiteHelp.DB_NAME,null,1);
//创建或者打开一个数据库,如果数据库存在就打开,没有就创建
mySQLiteHelp.getWritableDatabase();

打开File Explorer查看数据库是否创建成功;目录在data/data/[包名]/databases

《android SQLite (一)基本操作》 image.png

这里需要讲下 SQLite的数据类型和getWritableDatabase()与getReadableDatabase()的区别

SQLite的数据类型只有5种:

1,null(数据值为空)
2,integer(整型)
3,real(浮点型数据)
4,text(字符串,数据库编码【utf-8,utf-16be或者utf-16le】存放)
5,blob(只是一个数据块,完全按照输入存放)

getWritableDatabase()与getReadableDatabase()的区别

getWritableDatabase取得的实例不是仅仅具有写的功能,而是同时具有读和写的功能同样的;

getReadableDatabase取得的实例也是具对数据库进行读和写的功能。

两者的区别在于getWritableDatabase取得的实例是以读写的方式打开数据库,如果打开的数据库磁盘满了,此时只能读不能写,此时调用了getWritableDatabase的实例,那么将会发生错误(异常)

getReadableDatabase取得的实例是先调用getWritableDatabase以读写的方式打开数据库,如果数据库的磁盘满了,此时返回打开失败,继而用getReadableDatabase的实例以只读的方式去打开数据库

操作数据库

操作数据库的类不是SQLiteOpenHelper ,而是SQLiteDatabase,这个对象是通过调用getWritableDatabase方法返回的对象;
下面来演示下操作数据库的增删改查

添加数据

ps:db 是一个SQLiteDatabase对象;
调用db.execSQL(String sql)方法;

 String sql = "insert into Students (name,class,year,grade) values ('小明','一年级',8,98)";
 db.execSQL(sql);

这里我用sqlite expert professional 这个工具打开数据库,查看数据是否插入成功

《android SQLite (一)基本操作》 image.png

其实SQLiteDatabase还为我们提供了更加简单的一种方法插入数据;
调用 db.insert();

  ContentValues values = new ContentValues();
                values.put("name","小红");
                values.put("class","一年级");
                values.put("year",7);
                values.put("grade",100);
                db.insert("Students",null,values);

《android SQLite (一)基本操作》 image.png

更新数据

我们来将小明的分数偷偷的改成100

使用sql语法的如下:
String sql = "update Students set grade = 100 where name = '小明' ";
                db.execSQL(sql);

《android SQLite (一)基本操作》

android内置语法:

我们来把小明的分数偷偷的改成60

    ContentValues values1 = new ContentValues();
                values1.put("grade",60);
                db.update("Students",values1,"name = ?",new String[]{"小明"});

db.update的方法需要传入四个参数,第一个是表名,第二个是需要修改的值,第三个是条件,第四个是符合条件的值

《android SQLite (一)基本操作》 image.png

删除数据

我们来将小明的数据删除点;

sql语法:
 String sql = "delete from Students where name = '小明' ";
 db.execSQL(sql);

将小明的数据删除了,这样他爸妈就不知道了。

《android SQLite (一)基本操作》 image.png

android内置语法:
//这里三个参数,第一个是表名,第二个是条件,第三个是符合条件的值
db.delete("Students","name = ?",new String[]{"小明"});

查询数据

sql语句:

查询数据这里不能用:db.execSQL(sql),
这里需要换一个方法:db.rawQuery()

String sql1 = "select * from Students where name = '小红' ";
                //第一个参数为select语句;第二个参数为select语句中占位符参数的值,如果select语句没有使用占位符,该参数可以设置为null
                Cursor cursor = db.rawQuery(sql1, null);
                if (cursor.moveToFirst()){
                    do {
                        String name = cursor.getString(cursor.getColumnIndex("name"));
                        String class_ = cursor.getString(cursor.getColumnIndex("class"));
                        int year = cursor.getInt(cursor.getColumnIndex("year"));
                        double grade = cursor.getDouble(cursor.getColumnIndex("grade"));
                        Log.d(TAG, "name: "+name);
                        Log.d(TAG, "name: "+class_);
                        Log.d(TAG, "name: "+year);
                        Log.d(TAG, "name: "+grade);
                    }while (cursor.moveToNext());

                }
                cursor.close();

执行完查询语句返回一个Cursor数据类型。他是一个提供了随机读写访问数据库查询结果集的接口。Cursor并不是线程安全,因此在多线程中访问的时候需要手动进行同步,避免线程出现问题。
常用的Cursor函数有:
close() 关闭游标,释放资源
copyStringToBuffer(int columnIndex, CharArrayBuffer buffer) 在缓冲区中检索请求的列的文本,将将其存储
getColumnCount() 返回所有列的总数
getColumnIndex(String columnName) 返回指定列的名称,如果不存在返回-1
getColumnIndexOrThrow(String columnName) 从零开始返回指定列名称,如果不存在将抛出IllegalArgumentException 异常。
getColumnName(int columnIndex) 从给定的索引返回列名
getColumnNames() 返回一个字符串数组的列名
getCount() 返回Cursor 中的行数
moveToFirst() 移动光标到第一行
moveToLast() 移动光标到最后一行
moveToNext() 移动光标到下一行
moveToPosition(int position) 移动光标到一个绝对的位置
moveToPrevious() 移动光标到上一行

android内置语法:
/**
     * 第一个参数:表名
     * 第二个参数:要查询的字段名
     * 第三个参数:要查询的条件字段
     * 第四个参数:要查询的条件字段对应的值
     * 第五个参数:分组的字段
     * 第六个参数:筛选的字段
     * 第七个参数:排序的字段
     * 返回值:游标
      Cursor cursor = db.query("Students",null,null,null,null,null,null);
     */

获取了游标Cursor 之后的操作与上面一样。
android的基本操作就这样了,下次有时候写一下数据库的升级和优化部分。等我把github弄好我再吧代码上传

    原文作者:冷泡茶童鞋
    原文地址: https://www.jianshu.com/p/8982ea02bee4
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞